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指令,并收到指令的反馈。
根据反馈的字符串可利用正则表达式进行处理,解析出想要的内容,然后返回。如规定时间内,没有收到反馈,则返回 空字符串。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐