基于Qt telnet 的接口 封装
2018-02-10 15:53
766 查看
1,对于 某些支持telnet协议的嵌入式设备,如无人机的基站。上位机与之通信的时候可利用telnet的对其快速的访问,并且由于是以管理员身份登录,因此某些系统层的指令 可直接使用,而无须单独封装一套协议。
2,利用 开源 telnet库,加 异步调用的方式 封装对应的指令接口
(1),开源telnet库: https://github.com/triochi/qttelnet-2.1-opensource (2),声明 TelnetWorker 类,进行telne连接,登录。同时 声明 一个异步调用的数据收发函数,发送指令的时候 等待期返回结果。
#include <QObject>
采用异步调用的方式,当发送指令并且timeout时间内,等待 结果的反馈,如没有反馈,则返回空认为指令 发送失败。
3,声明一个 具体的接口处理类,继承自 TelnetWorker 对具体的接口进行处理。以获取版本号为例。
class PVCORESHARED_EXPORT DataLink:public TelnetWorker
QString DataLink::getSoftwareVer()
getSoftwareVer -》writeAndReadData 发送具体的linux指令,并收到指令的反馈。
2,利用 开源 telnet库,加 异步调用的方式 封装对应的指令接口
(1),开源telnet库: https://github.com/triochi/qttelnet-2.1-opensource (2),声明 TelnetWorker 类,进行telne连接,登录。同时 声明 一个异步调用的数据收发函数,发送指令的时候 等待期返回结果。
#include <QObject>
#include "../../3rdparty/qttelnet-2.1-opensource-master/src/qttelnet.h"
#include <QtConcurrent>
#include <QFuture>
#include <QPair>
class PVCORESHARED_EXPORT TelnetWorker : public QtTelnet
{
Q_OBJECT
public:
explicit TelnetWorker(QObject*parent =0);
~TelnetWorker();
QString &writeAndReadData(const QString&sData,int timeout=3000);//写和读数据
bool telnetConnect(const QString &host, quint16 port = 23);//连接
QString &telnetLogIn(const QString &user, const QString &pass);//登录
bool telnetClose();//关闭telnet
QString connect(const QString &host,const QString &user,const QString &pass);
public slots:
private:
QString rData;
QString rDataStr;
bool isClosed;
};
采用异步调用的方式,当发送指令并且timeout时间内,等待 结果的反馈,如没有反馈,则返回空认为指令 发送失败。
QString &TelnetWorker::writeAndReadData(const QString&sData,int timeout)
{
rDataStr.clear();
rData.clear();
sendData(sData+"\r\n");
PVSleep::sleep(300);
QFuture<void> future = QtConcurrent::run([&]()
{
for(int i=0;i<timeout/1000;i++)
{
if(!rData.isEmpty())
{
rDataStr = rData;
rData.clear();
break;
}else
PVSleep::sleep(1000);
}
});
future.waitForFinished();
qDebug()<<"writeAndReadData->message"<<rDataStr;
return rDataStr;
}
3,声明一个 具体的接口处理类,继承自 TelnetWorker 对具体的接口进行处理。以获取版本号为例。
class PVCORESHARED_EXPORT DataLink:public TelnetWorker
{
Q_OBJECT
public:
explicit DataLink(TelnetWorker*parent =0);
bool login(const QString &host="192.168.1.xx", const QString &user="xxx", const QString &pass="xxx");
/*
* @brief 获取软件版本号
* @result 成功返回版本号,失败返回空
*/
QString getSoftwareVer();};
QString DataLink::getSoftwareVer()
{
QString tempStr = writeAndReadData("cat /etc/xxxfile");
return PVCommon::midStr(tempStr,"","\r\n");
}
getSoftwareVer -》writeAndReadData 发送具体的linux指令,并收到指令的反馈。
根据反馈的字符串可利用正则表达式进行处理,解析出想要的内容,然后返回。如规定时间内,没有收到反馈,则返回 空字符串。
相关文章推荐
- 基于 单例模式的 Qt http协议 接口封装
- 优雅设计封装基于Okhttp3的网络框架(六):HttpHeader接口设计实现 及 Response、Request封装实现
- 基于口令和证书认证(TrueLicense)的接口调用工具库的封装设计 By 嗡汤圆
- Qt:基于TCP和UDP的局域网P2P(局域网)通讯封装
- Linux学习之线程封装七:基于接口的再封装
- qt 封装发送请求接口
- [原创]libpq-PostgreSQL客户端编程接口(三)----libpq在Qt中的封装实现及应用
- Linux学习之线程封装四:基于接口的封装
- Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构
- Linux学习之线程封装五:基于接口的封装
- QT 生成二维码接口封装
- Qt:基于TCP和UDP的局域网P2P(局域网)通讯封装
- VS2012基于QT5.1自定接口及插件并实现动态加载
- Qt基于ffmpeg库封装H264成MP4、AVI,png、jpg图片提取
- Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构
- jmeter性能测试,基于scf框架的"java请求"接口封装、环境配置与测试
- 基于DragonBoard 410c的家庭智能环保卫士----各数据获取接口封装
- 基于sqlite的Qt 数据库封装
- Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构 之一
- QT C++中直接调用python接口