您的位置:首页 > 编程语言 > Qt开发

基于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>
#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指令,并收到指令的反馈。
根据反馈的字符串可利用正则表达式进行处理,解析出想要的内容,然后返回。如规定时间内,没有收到反馈,则返回 空字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  telnet Qt 无人机