最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt開發(fā)之使用socket實現(xiàn)遠程控制

 更新時間:2022年11月19日 09:52:37   作者:音視頻開發(fā)老舅  
本篇文章將會介紹下位機通過心跳包和上位機之間進行數(shù)據(jù)交互和遠程功能控制的實現(xiàn)方法。文中的示例代碼講解詳細,感興趣的可以了解一下

Qt之使用socket實現(xiàn)遠程控制

在前面的文章中介紹過Qt心跳包的實現(xiàn)方法,本篇文章將會介紹下位機通過心跳包和上位機之間進行數(shù)據(jù)交互和遠程功能控制的實現(xiàn)方法。

首先介紹環(huán)境,下位機使用Qt作為主程序,上下位機使用TCP socket進行網(wǎng)絡通信,上位機實現(xiàn)方式任意。下位機心跳包線程在進程一開始就啟動,一直到進程結(jié)束才停止。

心跳包是一個始終獨立的線程,首先要搭建框架:

main.cpp

#include <heartbeatthread.h>
 
    //心跳包線程
    heartbeatThread *ht = nullptr;
    ht = new heartbeatThread;
    ht -> start();

.h文件

#ifndef HEARTBEATTHREAD_H
#define HEARTBEATTHREAD_H
 
#include <QThread>
#include <QCoreApplication>
#include <QTimer>
#include <QTcpSocket>
#include <QHostAddress>
#include <QtConcurrent/QtConcurrent>
 
using namespace std;
 
class heartbeatThread : public QThread
{
    Q_OBJECT
 
public:
    explicit heartbeatThread(QObject *parent = nullptr);
    void run(); //任務處理線程
 
    ~heartbeatThread(){
    }
 
public slots:
 
private:
    QTcpSocket *tcpSocket = nullptr;
 
protected:
};
 
#endif // HEARTBEATTHREAD_H

.cpp文件

#include "heartbeatthread.h"
 
heartbeatThread::heartbeatThread(QObject *parent)
{
}
 
void heartbeatThread::run()
{
    tcpSocket = new QTcpSocket();
    tcpSocket->connectToHost(QHostAddress("127.0.0.1"), 5000);
 
    QtConcurrent::run([=]()
        {
        while(true)
        {
            try{    //收包
                //將接收內(nèi)容存儲到字符串中
                char recvMsg[1024] = {'\0'};
                int recvRe = tcpSocket->read(recvMsg, 1024);
                if(recvRe != 0 && recvRe != -1) //0:連接未發(fā)信息;-1:未連接
                {
                }
            } catch(...){}
            QEventLoop eventloop;
            QTimer::singleShot(1, &eventloop, SLOT(quit()));
            eventloop.exec();
        }
    });
 
    while(true){
        try{    //發(fā)包
            //等待連接成功
            if(!tcpSocket->waitForConnected(30000))
            {
                tcpSocket->connectToHost(QHostAddress("127.0.0.1"), 5000);
            }
            else
            {                
                QByteArray block = "block";
                tcpSocket->write(block);
                tcpSocket->flush();
            }
        } catch(...){}
        QEventLoop eventloop;
        QTimer::singleShot(1000, &eventloop, SLOT(quit()));
        eventloop.exec();
    }
}

這樣收發(fā)就寫好了。

先說發(fā)包,這里是和上位機建立了長連接,我只需要知道上位機的IP和端口號即可建立連接,上位機不需要知道我的IP信息。如果上位機需要知道我的相關(guān)信息,可以在包中寫入,并根據(jù)實際需要調(diào)整發(fā)送頻率。這里有重連機制,上位機在一段時間沒有收到我發(fā)送的信息后,可以認定我已經(jīng)離線。

再說收包,其實就是不斷地讀入緩沖區(qū)的內(nèi)容,緩沖區(qū)的大小和解析方式需要和上位機協(xié)調(diào),盡量在包過大時進行拆包發(fā)送,下位機再根據(jù)解包信息判斷是否需要接包,以及信息是否齊全、有沒有丟包等。

收發(fā)框架搭好以后,就可以建立一定的收發(fā)規(guī)范進行遠程控制了,發(fā)包比較靈活,這里只說收包。

比如設定這樣的規(guī)則:上位機發(fā)送的所有的報文都有一段報文頭,記錄報文的總長度。報文頭部后面接一段自定義的操作類型,用來進行指令分類。操作類型后接實際的操作指令。

代碼如下。

try{    //收包
    //將接收內(nèi)容存儲到字符串中
    char recvMsg[1024] = {'\0'};
    int recvRe = tcpSocket->read(recvMsg, 1024);
    if(recvRe != 0 && recvRe != -1) //0:連接未發(fā)信息;-1:未連接
    {
        QString recvMessage = recvMsg;
        //字符串解析
        head = recvMessage.mid(0, HEAD_LENGTH).simplified();  //網(wǎng)絡頭,報文總長度
        type = recvMessage.mid(HEAD_LENGTH, TYPE_LENGTH).simplified();  //請求類型
        message = recvMessage.mid(HEAD_LENGTH + TYPE_LENGTH, recvMessage.length()).simplified();  //實際請求內(nèi)容
        //按照字符串要求分類處理
        handle(type, message);
    }
} catch(...){}

預先定好報文頭部和指令類型的長度,就可以在收到包后按照位置對字符串進行解析。分離出請求類型和請求內(nèi)容后,對指令進行處理即可。同時也需要定義一定的上位機指令發(fā)送規(guī)范。

處理示例:

void handle(QString type, QString message)
{
    QStringList handleOptions;
    handleOptions << "aaaa" << "bbbb" << "cccc" ;
 
    /*
    aaaa = 0
    bbbb = 1
    cccc = 2
    */
 
    switch (handleOptions.indexOf(type)) {
    case 0:
        break;
    case 1:
        break;
    case 2:
        break;
   default:
        qDebug() << "do not understand!";
        break;
    }
}
 

到此這篇關(guān)于Qt開發(fā)之使用socket實現(xiàn)遠程控制的文章就介紹到這了,更多相關(guān)Qt socket遠程控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)LeetCode(110.平衡二叉樹)

    C++實現(xiàn)LeetCode(110.平衡二叉樹)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(110.平衡二叉樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言使用realloc函數(shù)實現(xiàn)通訊錄源碼分析

    C語言使用realloc函數(shù)實現(xiàn)通訊錄源碼分析

    什么是動態(tài)通訊錄,就是在靜態(tài)的基礎上改進了一下,不在使用數(shù)組,而是使用指針和動態(tài)內(nèi)存開辟的函數(shù),當空間不夠的時候,便進行增容
    2023-02-02
  • C++實現(xiàn)乒乓球比分判定

    C++實現(xiàn)乒乓球比分判定

    這篇文章主要為大家詳細介紹了C++實現(xiàn)乒乓球比分判定,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言return知識點總結(jié)

    C語言return知識點總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于C語言return知識點總結(jié)內(nèi)容,需要的朋友們可以學習參考下。
    2020-02-02
  • C++?線段樹原理與實現(xiàn)示例詳解

    C++?線段樹原理與實現(xiàn)示例詳解

    這篇文章主要為大家介紹了C++?線段樹原理與實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • C++淺析序列數(shù)據(jù)封裝與優(yōu)化實現(xiàn)方法

    C++淺析序列數(shù)據(jù)封裝與優(yōu)化實現(xiàn)方法

    封裝是面向?qū)ο缶幊讨械陌褦?shù)據(jù)和操作數(shù)據(jù)的函數(shù)綁定在一起的一個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全,數(shù)據(jù)封裝是一種把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起的機制,數(shù)據(jù)抽象是一種僅向用戶暴露接口而把具體的實現(xiàn)細節(jié)隱藏起來的機制
    2022-12-12
  • Opencv Hough算法實現(xiàn)圖片中直線檢測

    Opencv Hough算法實現(xiàn)圖片中直線檢測

    這篇文章主要為大家詳細介紹了Opencv Hough算法實現(xiàn)圖片中直線檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++實現(xiàn)鬧鐘程序的方法

    C++實現(xiàn)鬧鐘程序的方法

    這篇文章主要介紹了C++實現(xiàn)鬧鐘程序的方法,比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • C語言陷阱與缺陷之數(shù)組越界訪問詳解

    C語言陷阱與缺陷之數(shù)組越界訪問詳解

    這篇文章主要為大家詳細介紹了C語言的數(shù)組越界訪問,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++簡明分析講解布爾類型及引用

    C++簡明分析講解布爾類型及引用

    布爾型(Boolean),是一種類型變量類型,引用(reference)就是C++對C語言的重要擴充。引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣
    2022-04-04

最新評論

台南市| 新田县| 柏乡县| 武陟县| 郁南县| 遂宁市| 东方市| 潼南县| 南川市| 南澳县| 方城县| 长泰县| 商丘市| 通化市| 崇明县| 佛学| 赤城县| 乌苏市| 长治县| 宁夏| 紫云| 绿春县| 体育| 福贡县| 仁怀市| 沅陵县| 准格尔旗| 墨玉县| 马龙县| 南召县| 财经| 麻江县| 文安县| 色达县| 海林市| 广南县| 石楼县| 嘉祥县| 元谋县| 静乐县| 屯昌县|