Kaynağa Gözat

添加与PIS系统的通讯协议

lishengyin 3 yıl önce
ebeveyn
işleme
abd676aa9b

+ 8 - 0
build/CMakeFiles/main.dir/CXX.includecache

@@ -1040,6 +1040,12 @@ NettyClientCommandEnum.h
 SendHeartBeat.h
 ../modules/TCPClient/include/SendHeartBeat.h
 
+../modules/dataType/include/InferData.h
+iostream
+-
+list
+-
+
 ../modules/dataType/include/NettyClientCommandEnum.h
 iostream
 -
@@ -1193,6 +1199,8 @@ SendLogin.h
 ../modules/userApp/include/SendLogin.h
 NettyClientCommandEnum.h
 ../modules/userApp/include/NettyClientCommandEnum.h
+InferData.h
+../modules/userApp/include/InferData.h
 
 /home/nvidia/work/MIVA/source/src/main.cpp
 iostream

+ 1 - 0
build/CMakeFiles/main.dir/depend.internal

@@ -86,6 +86,7 @@ CMakeFiles/main.dir/source/src/main.cpp.o
  ../3rdparty/rapidjson/include/rapidjson/stringbuffer.h
  ../3rdparty/rapidjson/include/rapidjson/writer.h
  ../modules/TCPClient/include/TCPClient.h
+ ../modules/dataType/include/InferData.h
  ../modules/dataType/include/NettyClientCommandEnum.h
  ../modules/dataType/include/NettyClientResultMsg.h
  ../modules/dataType/include/NettyServerCommandEnum.h

+ 1 - 0
build/CMakeFiles/main.dir/depend.make

@@ -85,6 +85,7 @@ CMakeFiles/main.dir/source/src/main.cpp.o: ../3rdparty/rapidjson/include/rapidjs
 CMakeFiles/main.dir/source/src/main.cpp.o: ../3rdparty/rapidjson/include/rapidjson/stringbuffer.h
 CMakeFiles/main.dir/source/src/main.cpp.o: ../3rdparty/rapidjson/include/rapidjson/writer.h
 CMakeFiles/main.dir/source/src/main.cpp.o: ../modules/TCPClient/include/TCPClient.h
+CMakeFiles/main.dir/source/src/main.cpp.o: ../modules/dataType/include/InferData.h
 CMakeFiles/main.dir/source/src/main.cpp.o: ../modules/dataType/include/NettyClientCommandEnum.h
 CMakeFiles/main.dir/source/src/main.cpp.o: ../modules/dataType/include/NettyClientResultMsg.h
 CMakeFiles/main.dir/source/src/main.cpp.o: ../modules/dataType/include/NettyServerCommandEnum.h

BIN
build/CMakeFiles/main.dir/source/src/main.cpp.o


+ 8 - 0
build/modules/CMakeFiles/modules.dir/CXX.includecache

@@ -1040,6 +1040,12 @@ NettyClientCommandEnum.h
 SendHeartBeat.h
 ../modules/TCPClient/include/SendHeartBeat.h
 
+../modules/dataType/include/InferData.h
+iostream
+-
+list
+-
+
 ../modules/dataType/include/NettyClientCommandEnum.h
 iostream
 -
@@ -1217,6 +1223,8 @@ SendLogin.h
 ../modules/userApp/include/SendLogin.h
 NettyClientCommandEnum.h
 ../modules/userApp/include/NettyClientCommandEnum.h
+InferData.h
+../modules/userApp/include/InferData.h
 
 /home/nvidia/work/MIVA/modules/TCPClient/src/TCPClient.cpp
 TCPClient.h

+ 2 - 0
build/modules/CMakeFiles/modules.dir/depend.internal

@@ -195,6 +195,7 @@ modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o
  ../3rdparty/rapidjson/include/rapidjson/stringbuffer.h
  ../3rdparty/rapidjson/include/rapidjson/writer.h
  ../modules/TCPClient/include/TCPClient.h
+ ../modules/dataType/include/InferData.h
  ../modules/dataType/include/NettyClientCommandEnum.h
  ../modules/dataType/include/NettyClientResultMsg.h
  ../modules/dataType/include/NettyServerCommandEnum.h
@@ -555,6 +556,7 @@ modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o
  ../3rdparty/rapidjson/include/rapidjson/stringbuffer.h
  ../3rdparty/rapidjson/include/rapidjson/writer.h
  ../modules/TCPClient/include/TCPClient.h
+ ../modules/dataType/include/InferData.h
  ../modules/dataType/include/NettyClientCommandEnum.h
  ../modules/dataType/include/NettyClientResultMsg.h
  ../modules/dataType/include/NettyServerCommandEnum.h

+ 2 - 0
build/modules/CMakeFiles/modules.dir/depend.make

@@ -194,6 +194,7 @@ modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../3rdparty/rapidj
 modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../3rdparty/rapidjson/include/rapidjson/stringbuffer.h
 modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../3rdparty/rapidjson/include/rapidjson/writer.h
 modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../modules/TCPClient/include/TCPClient.h
+modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../modules/dataType/include/InferData.h
 modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../modules/dataType/include/NettyClientCommandEnum.h
 modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../modules/dataType/include/NettyClientResultMsg.h
 modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o: ../modules/dataType/include/NettyServerCommandEnum.h
@@ -554,6 +555,7 @@ modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../3rdparty/rapidjson
 modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../3rdparty/rapidjson/include/rapidjson/stringbuffer.h
 modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../3rdparty/rapidjson/include/rapidjson/writer.h
 modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../modules/TCPClient/include/TCPClient.h
+modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../modules/dataType/include/InferData.h
 modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../modules/dataType/include/NettyClientCommandEnum.h
 modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../modules/dataType/include/NettyClientResultMsg.h
 modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o: ../modules/dataType/include/NettyServerCommandEnum.h

BIN
build/modules/CMakeFiles/modules.dir/inference/src/inference.cpp.o


BIN
build/modules/CMakeFiles/modules.dir/userApp/src/user_app.cpp.o


BIN
lib/libmodules.so


+ 64 - 0
modules/dataType/include/Crc16.h

@@ -0,0 +1,64 @@
+#pragma once
+
+#include <iostream>
+
+using namespace std;
+
+const uint16_t CRC16_Table[256] = {
+    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
+    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
+    0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
+    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
+    0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
+    0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
+    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
+    0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
+    0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
+    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
+    0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
+    0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
+    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
+    0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
+    0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
+    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
+    0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
+    0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
+    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
+    0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
+    0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
+    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+    0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
+    0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
+    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
+    0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
+    0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
+    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
+    0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
+    0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
+    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
+    0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
+};
+
+class Crc16
+{
+private:
+    /* data */
+public:
+    Crc16(){};
+    ~Crc16();
+    
+    static uint16_t GetCRC16(uint8_t* ptr, uint16_t start, uint16_t len)
+    {
+        uint16_t crc = 0;
+        uint16_t high;
+        ptr = ptr + start;
+        while(len-- != 0) {
+            high = (uint16_t)(crc/256);
+            crc <<= 8;
+            crc ^= CRC16_Table[high^*ptr];
+            ptr++;
+        }
+        return crc;
+    }
+};
+

+ 27 - 0
modules/dataType/include/InferData.h

@@ -0,0 +1,27 @@
+#pragma once
+#include <iostream>
+#include <list>
+
+
+struct Density
+{
+    int CatId;
+    int num;
+    int Crowdedness;
+};
+
+struct StreamInferData
+{
+    std::string uri;
+    int num;
+};
+
+class InferData
+{
+private:
+public:
+    InferData(){};
+    ~InferData(){};
+    int CarId;
+    list<StreamInferData> data;
+};

+ 112 - 0
modules/dataType/include/PIDSClientResultMsg.h

@@ -0,0 +1,112 @@
+#pragma once
+
+#include <iostream>
+#include "PIDSDataDefine.h"
+
+
+using namespace std;
+
+class PIDSClientResultMsg
+{
+public:
+    // 时间
+    PIDSTime time;
+    // 列车线路号
+    int TrainLine;
+    int Train;
+
+    // 拥挤度
+    int8_t Crowdedness_1;
+    // 1号车厢人数
+    int16_t Num_1;
+
+    // 拥挤度
+    int8_t Crowdedness_2;
+    // 2号车厢人数
+    int16_t Num_2;
+
+    // 拥挤度
+    int8_t Crowdedness_3;
+    // 3号车厢人数
+    int16_t Num_3;
+
+    // 拥挤度
+    int8_t Crowdedness_4;
+    // 4号车厢人数
+    int16_t Num_4;
+
+    // 拥挤度
+    int8_t Crowdedness_5;
+    // 5号车厢人数
+    int16_t Num_5;
+
+    // 拥挤度
+    int8_t Crowdedness_6;
+    // 6号车厢人数
+    int16_t Num_6;
+    
+public:
+    PIDSClientResultMsg(){}
+    ~PIDSClientResultMsg(){}
+
+    void Serialization(uint8_t* data, int len)
+    {
+        memset(data, 0, 1024);
+
+        data[0] = PIDS_DATA_HEAD;
+        data[1] = PIDS_SRC_TC1;
+        data[2] = PIDS_SRC_TYPE_MIVA;
+        // IP
+        data[3] = 172;
+        data[4] = 0;
+        data[5] = 0;
+        data[6] = 1;
+
+        int16_t length = 36;
+        data[7] = (length & 0x00FF);
+        data[8] = (length & 0xFF00) >> 8;
+
+        // 填充数据
+        // Time
+        data[9] = 21;
+        data[10] = 12;
+        data[11] = 1;
+        data[12] = 2;
+        data[13] = 3;
+        data[14] = 6;
+
+        data[15] = this->TrainLine;
+        data[16] = this->Train;
+
+        data[17] = this->Crowdedness_1;
+        data[18] = (this-> Num_1 & 0x00FF)
+        data[19] = (this-> Num_1 & 0xFF00) >> 8;
+
+        data[20] = this->Crowdedness_2;
+        data[21] = (this-> Num_2 & 0x00FF)
+        data[22] = (this-> Num_2 & 0xFF00) >> 8;
+
+        data[23] = this->Crowdedness_3;
+        data[24] = (this-> Num_3 & 0x00FF)
+        data[25] = (this-> Num_3 & 0xFF00) >> 8;
+
+        data[26] = this->Crowdedness_4;
+        data[27] = (this-> Num_4 & 0x00FF)
+        data[28] = (this-> Num_4 & 0xFF00) >> 8;
+
+        data[29] = this->Crowdedness_5;
+        data[30] = (this-> Num_5 & 0x00FF)
+        data[31] = (this-> Num_5 & 0xFF00) >> 8;
+
+        data[32] = this->Crowdedness_6;
+        data[33] = (this-> Num_6 & 0x00FF)
+        data[34] = (this-> Num_6 & 0xFF00) >> 8;
+
+        int16_t crc = Crc16::GetCRC16(data, 9, length);
+        data[45] = (crc & 0x00FF);
+        data[46] = (crc & 0xFF00) >> 8; 
+        
+        // 数据尾
+        data[47] = PIDS_DATA_END;
+    }
+};

+ 28 - 0
modules/dataType/include/PIDSDataDefine.h

@@ -0,0 +1,28 @@
+#pragma once
+#include <iostream>
+#include "user_app.h"
+#include "Crc16.h"
+#include "Util/logger.h"
+
+using namespace std;
+
+#define PIDS_DATA_HEAD  (0xFD)  // 帧头
+#define PIDS_DATA_END   (0xFE)  // 帧尾
+
+#define PIDS_SRC_TC1    (0x01)  // 源设备车厢编号:TC1
+#define PIDS_SRC_TC2    (0x02)  // 源设备车厢编号:TC2
+
+#define PIDS_SRC_TYPE_PIDS   (0x03)  // PIDS设备
+#define PIDS_SRC_TYPE_MIVA   (0x28)  // 视频分析服务器设备
+
+
+struct PIDSTime
+{
+    int tm_sec;  
+    int tm_min; 
+    int tm_hour;
+    int tm_mday; 
+    int tm_mon;  
+    int tm_year; 
+};
+

+ 84 - 0
modules/dataType/include/PIDSServerResultMsg.h

@@ -0,0 +1,84 @@
+#pragma once
+
+#include <iostream>
+#include "PIDSDataDefine.h"
+
+using namespace std;
+
+class PIDSServerResultMsg
+{
+private:
+    // 当前站站号
+    int CurrentSite;
+    // 下一站站号
+    int NextSite;
+    // 起始站站号
+    int StartSite;
+    // 终点站站好
+    int EndSite;
+    // 时间是否有效
+    bool TimeFlag;
+    // 时间
+    PIDSTime time;
+    // 车门标志位
+    uint8_t DoorFlag;
+    // TC2、TC1激活情况
+    uint8_t PIDSFlag;
+
+    // 1号车厢的动态负荷
+    int DynamicLoad_1;
+    // 2号车厢的动态负荷
+    int DynamicLoad_2;
+    // 3号车厢的动态负荷
+    int DynamicLoad_3;
+    // 4号车厢的动态负荷
+    int DynamicLoad_4;
+    // 5号车厢的动态负荷
+    int DynamicLoad_5;
+    // 6号车厢的动态负荷
+    int DynamicLoad_6;
+
+public:
+    PIDSServerResultMsg(){};
+    ~PIDSServerResultMsg(){};
+    
+    // 反序列化
+    int32_t Deserialization(uint8_t *data, int length)
+    {
+        // 检查数据头尾
+        if(data[0] != PIDS_DATA_HEAD || data[length] != PIDS_DATA_END) {
+            ErrorL << "Incorrect data head and tail";
+            return ERR;
+        }
+        // 获取数据长度
+        uint16_t DataLength = ((uint16_t)data[8] << 8 | data[7]);
+
+        // 检查数据校验位
+        int16_t crc = Crc16::GetCRC16(data, 9, DataLength);
+        if((data[length-2] != (crc & 0xFF00)) >> 8 || (data[length-1] != crc & 0x00FF)){
+            ErrorL << "Incorrect data check digit";
+        }
+
+        // 数据校验通过提取数据
+        this->CurrentSite = data[9];
+        this->NextSite = data[10];
+        this->StartSite = data[11];
+        this->EndSite = data[12];
+        this->TimeFlag = data[13] ? true:false;
+
+        // 时间
+        this->DoorFlag = data[21];
+        this->PIDSFlag = data[22];
+
+        // 提取动态负载
+        this->DynamicLoad_1 = (uint16_t)data[24] << 8 | data[23];
+        this->DynamicLoad_2 = (uint16_t)data[26] << 8 | data[25];
+        this->DynamicLoad_3 = (uint16_t)data[28] << 8 | data[27];
+        this->DynamicLoad_4 = (uint16_t)data[30] << 8 | data[29];
+        this->DynamicLoad_5 = (uint16_t)data[32] << 8 | data[31];
+        this->DynamicLoad_6 = (uint16_t)data[34] << 8 | data[33];
+
+        return OK;
+    }
+};
+

+ 2 - 0
modules/userApp/include/user_app.h

@@ -31,6 +31,7 @@
 #include "NettyClientResultMsg.h"
 #include "SendLogin.h"
 #include "NettyClientCommandEnum.h"
+#include "InferData.h"
 
 using namespace toolkit;
 using namespace mediakit;
@@ -87,5 +88,6 @@ namespace MIVA
     private:
         void ListenInfer(int Source_id, int num);
         void ConnectNetty();
+        void ReportData();
     };
 }

+ 81 - 3
modules/userApp/src/user_app.cpp

@@ -71,7 +71,7 @@ namespace MIVA
 
         // 查询需要播放的流
         vector<vector<string>> sqlRet;
-        SqlWriter sqlSelect("SELECT Id,Stream FROM MIVA_DB.`Streams`");
+        SqlWriter sqlSelect("SELECT Id,Stream FROM MIVA_DB.`Streams` WHERE Play = 1");
         sqlSelect << sqlRet;
         if(!sqlRet.empty()){
             for(auto &line : sqlRet){
@@ -132,15 +132,93 @@ namespace MIVA
         InfoL << "Task started successfully!";
     }
 
+    // 监听推理广播
     void UserApp::ListenInfer(int Source_id, int num)
     {   
-
-
+        // 异步更新
+        SqlWriter updataSql("UPDATE MIVA_DB.Streams SET num = '?' WHERE Id = '?';");
+        updataSql << num << Source_id << endl;
     }
 
+    // 连接Netty
     void UserApp::ConnectNetty()
     {
         if(this->m_tcpClient == NULL) this->m_tcpClient = TCPClient::Ptr(new TCPClient());
         this->m_tcpClient->startConnect(this->Netty_ip, this->Netty_port);
     }
+
+    // 上报识别结果
+    void UserApp::ReportData()
+    {
+        // 车厢IDs
+        list<int> CarIds;
+        // 推理数据
+        list<InferData> inferDatas;
+
+        vector<vector<string>> sqlRet;
+        // 同步查询
+        SqlWriter SelectCarId("select CarId from MIVA_DB.`CarId`");
+        SelectCarId << sqlRet;
+        if(!sqlRet.empty()){
+            for(auto &line : sqlRet){
+                int Id = std::atoi(line[0].c_str());
+                CarIds.push_back(Id);
+            }
+        }
+
+        sqlRet.clear();
+        inferDatas.clear();
+        // 查询各车型流的识别结果
+        std::list<int>::iterator iter;
+        for(iter=CarIds.begin(); iter!= CarIds.end(); iter++)
+        {
+            // 同步查询
+            SqlWriter SqlectStreams("select Stream,num FROM MIVA_DB.Streams WHERE Play = 1 and CarId = ?");
+            SqlectStreams << *(iter) << sqlRet;
+            if(!sqlRet.empty()){
+                for(auto &line : sqlRet){
+                    InferData infer;
+                    StreamInferData streamData;
+                    infer.CarId = *iter;
+                    streamData.uri = line[0];
+                    streamData.num = atoi(line[1].c_str());
+                    infer.data.push_back(streamData);
+                    inferDatas.push_back(infer);
+                }
+            }
+        }
+
+        list<Density> datas;
+        // 逻辑处理
+        if(!inferDatas.empty()){
+            std::list<InferData>::iterator iter1;
+            for(iter1=inferDatas.begin();iter1!=inferDatas.end();iter1++)
+            {
+                Density density;
+                density.CatId = (*iter1).CarId;
+                
+                // 先获取各个uri识别的数量
+                std::list<StreamInferData>::iterator iter2;
+                for(iter2=(*iter1).data.begin(); iter2!= (*iter1).data.end(); iter2++){
+                    density.num += (*iter2).num;
+                }
+                // 加入车重权重
+
+                
+                // 判定拥挤程度
+                density.Crowdedness = 1;
+                datas.push_back(density);
+            }
+        }
+
+        // 传输至PIS
+
+
+
+
+        // 传输至Netty
+        
+
+    }
+
 }

BIN
source/bin/main