zoukankan      html  css  js  c++  java
  • 数据解析-20191121

    NetClient.h

    #ifndef CLIENT_H
    #define CLIENT_H
    #include <QObject>
    #include <QTcpSocket>
    #include <stdint.h>
    #include <iostream>
    using namespace std;
    
    #pragma   pack(1)
    
    //msg_type 为基站时,仅需关心Precision和ma_id
    typedef struct
    {
    quint8 msg_type; //数据类型 1-签定,2-基站
    quint8 Precision; //类型为标签时,表示电量;为基站时,表示状态:1-在线,0-离线
    quint8 prevsion;  //暂时无效
    quint8 seq_num; //数据序列号 每次定位数据会增加1,范围0-255
    quint16 ma_id; //类型为标签时,此字段无效;类型为基站时,为基站ID
    quint16 TAG_ID; //类型为标签时,为标签ID;类型为基站时,无效
    qint32 pos[3]; //坐标值,仅在类型为基站时有效。 单位mm pos[0]为x坐标,pos[1]为y坐标,pos[2]为z坐标
    }stuDevData;
    #pragma pack () /*取消指定对齐,恢复缺省对齐*/
    
    class NetClient: public QObject
    {
        Q_OBJECT
    public:
        NetClient(QObject* parent = 0);
        ~NetClient();
        void StartConnect(QString DestIp,int DestPort);
    private:
          QTcpSocket *m_pTcpSocket;
          bool flag;
    public slots:
         void ReadTcp();
         void displayError(QAbstractSocket::SocketError socketError);
    };
    
    #endif // CLIENT_H

    NetClient.cpp

    #include "NetClient.h"
    #include <QtCore/QCoreApplication>
    #include <QHostAddress>
    #include <QByteArray>
    #include <qdebug.h>
    
    NetClient::NetClient(QObject* parent): QObject(parent)
    {
        m_pTcpSocket = new QTcpSocket(this);
        m_pTcpSocket->bind(9000);
        connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
        connect(m_pTcpSocket, SIGNAL(readyRead()),this, SLOT(ReadTcp()));
    }
    
    NetClient:: ~NetClient()
    {
        m_pTcpSocket->close();
    }
    
    void NetClient::StartConnect(QString DestIp,int DestPort)
    {
        cout<<"开始连接..."<<endl;
        QHostAddress addr(DestIp);
        m_pTcpSocket->connectToHost(addr, DestPort);
        cout<<"
    ";
    }
    
    void NetClient::ReadTcp()
    {
        while(m_pTcpSocket->bytesAvailable()>0)
        {
            QByteArray baRevData;
            baRevData.resize(m_pTcpSocket->bytesAvailable());
            m_pTcpSocket->read(baRevData.data(),baRevData.size());
    
            int Datalen = sizeof(stuDevData);
            int Revlen = baRevData.size();
            int num = 0;
    
            int remainder = Revlen%Datalen;//求余
            if(remainder != 0)
            {
                cout<< "数据错误"<<endl;
                return;
            }
            num = Revlen/Datalen;
            while (num > 0)
            {
                //收到的16进制数先转成字符串
                QString Hexstr = baRevData.toHex().toUpper();
                QByteArray ba = Hexstr.toLatin1();
    
                uint8_t *pbuf = (uint8_t *)baRevData.data();
                stuDevData *stuData = (stuDevData*)pbuf;
    
                if(stuData->msg_type == 1)
                {
                     cout<< "收到标签数据:"<<ba.data()<<endl;
                     cout<<"标签ID:"<<stuData->TAG_ID<<endl;
                     int num = stuData->seq_num;
                     cout<<"序列号:"<<num<<endl;
                     cout<<"坐  标:"<<"X-"<<stuData->pos[0]<<" "<<"Y-"<<stuData->pos[1]<<" "<<"Z-"<<stuData->pos[2]<<endl;
                     int Elct = stuData->Precision;
                     cout<<"电  量:"<<Elct<<endl;
                     cout<<"
    ";
                     continue;
                }
                else if(stuData->msg_type == 2)
                {
                     cout<< "收到基站数据:"<<ba.data()<<endl;
                     cout<<"基站ID:"<<stuData->ma_id<<endl;
                     int num = stuData->seq_num;
                     cout<<"序列号:"<<num<<endl;                 
                     if(stuData->Precision == 1)
                     {
                         cout<<"状  态:在线"<<endl;
                     }
                     else
                     {
                          cout<<"状  态:离线"<<endl;
                     }
                     cout<<"
    ";
                     continue;
                }
                else
                {
                    cout<< "数据错误"<<endl;
                    continue;
                }
                num--;
            }
        }
    
    }
    
    void NetClient::displayError(QAbstractSocket::SocketError socketError)
    {
        cout<<"连接断开"<<endl;
        return;
    }
  • 相关阅读:
    第七天冲刺
    MySQL管理
    LNMP环境搭建
    docker使用笔记
    Laravel5.2使用笔记
    Linux使用笔记
    Redis3.2.11在centos9安装与卸载
    Ubuntu系统
    Linux下安装与卸载PHP
    安装Linux
  • 原文地址:https://www.cnblogs.com/herd/p/11907341.html
Copyright © 2011-2022 走看看