#ifndef __HJDATADEFINE__ #define __HJDATADEFINE__ #include "WinDef.h" #include enum class E_ZL_PROTOCAL : uint8_t { ZL_KEEP, //心跳 ZL_MO, //监测对象数据 //定时同步 ZL_MP, //监测点数据 ZL_RESIST_DATA, //阻力数据 ZL_RESIST_REAL, //下发实时阻力数据开始 ZL_TEMP_HUMI, //温湿度数据 ZL_ALARM_SET, //报警设置 ZL_ALARM_DATA, //报警数据 ZL_ALARM_ACK, //报警受理 ZL_ALARM_HANDLE, //报警处理 ZL_SVG, //SVG同步 ZL_REFER, //参考同步 ZL_ALARM_UNACK, //未确认报警数据 ZL_MOVE, //扳动数据 DL_ALARM_ACK = 0x50, //下发报警受理 DL_ALARM_HANDLE, //下发报警受理 DL_SYNC, //下发同步 DL_SUB_NOTIFY, //下发订阅实时 ZL_UNREALIZED, //未实现 }; enum class OPT_TYPE { OPT_SYNC = 0x00, //同步帧 OPT_ADD = 0x01, //增加帧 OPT_DEL = 0x02, //删除帧 OPT_UPDATE = 0x03, //修改帧 OPT_SELECT = 0x04, //查询帧 OPT_RECV = 0x05, //应答帧 }; #pragma pack(push, 1) typedef struct tagOrDataInfo { uint8_t readORset : 1; //0 read 1 set uint8_t requestORresponse : 1; //0 request 1 response uint8_t failORsucc : 1; // 0 fail 1 succ uint8_t source : 2; // 0 web 1 vaservice 2 dataservice 3 super OPT_TYPE opt : 3; // 1. 增加 tagOrDataInfo() {}; tagOrDataInfo(bool readORset1, bool requestORresponse1, bool failORsucc1, uint8_t source1, OPT_TYPE opt1) : readORset(readORset1), requestORresponse(requestORresponse1), failORsucc(failORsucc1), source(source1), opt(opt1){}; }OR_DATA_INFO, * LPOR_DATA_INFO; typedef struct tagHjDataHead2{ DWORD64 head; //头部标识 DWORD len; //数据内容的长度,等于包长度 – 21 – 2,后面数据长度为9 + len + 2 BYTE ver : 4; //协议版本 BYTE res : 4; E_ZL_PROTOCAL protocol; //数据包的协议代码 BYTE subno; //下级的编号 如果是数据中心发往数据服务,则为0 BYTE subpacknum; //分包总数,0和1表示不分包 bool subpackend : 1; //分包结束标记 BYTE subpackno : 7; //分包编号 DWORD packno; //数据包编号 OR_DATA_INFO datainfo; }HJDATAHEAD2, *LPHJDATAHEAD2; typedef struct tagAllDISKSTATUS { char diskName; //磁盘数量 int total; //所有磁盘总容量G int ofFree; //所有磁盘剩余容量G }AllDISKSTATUS, *LPAllDISKSTATUS; typedef struct tagGpuInfo { char name[20]; WORD utilizationRate; //千分制 GPU使用率 WORD memusage; //千分制 GPU显存使用率 WORD temperature; //0.1度 GPU温度 BYTE decUtilization; //解码使用率 BYTE encUtilization; //编码使用率 byte reser[4]; //预留 }GPUINFO; #define MAX_GPU_NUM 4 // 监控的GPU个数(NVIDIA定义的最多GPU个数是64,这里最多只监控4个) typedef struct _DISPLAY_INFO { int nGpuCount; // Gpu个数 int nGpuUsages[MAX_GPU_NUM]; // Gpu占用率 DWORD dwTotalMemory; // 总显存大小(KB) DWORD dwFreeMemory; // 空闲显存大小(KB) }DISPLAY_INFO; #define MAX_DISK_NUM 10 typedef struct SERVER_STATUS { DWORD64 osRunTime; DWORD backTime; WORD cpuUsage; //千分制 GPUINFO gpuUsage[MAX_GPU_NUM]; WORD memUsage; // 千分制 AllDISKSTATUS diskUsage[MAX_DISK_NUM]; WORD cputemp; //CPU温度 摄氏度 char ipAddr[16]; }SERVERSTATUS, *HJSERVERSTATUS; enum class eDEVICE_TYPE : uint8_t { DT_ALL = 0x00, DT_GT_EDGE = 0x01, //高瞳盒子 DT_HJ_DOG = 0x02, //慧景软件狗 DT_HJ_VA = 0x03, //慧景VA }; typedef struct tagDeviceDiscover { eDEVICE_TYPE type = eDEVICE_TYPE::DT_ALL; uint8_t r[31] = { 0 }; }; #pragma pack(pop) class CHjDataConver{ public: //新协议 static int conver_sendpack(LPBYTE dest, LPBYTE src, DWORD srclen, BYTE subno, DWORD packno, E_ZL_PROTOCAL protocol, OR_DATA_INFO datainfo, BYTE ver = 0x01) { static DWORD64 headid = 0xABAAAAAAAAAAAAAA; HJDATAHEAD2 head; memset(&head, 0, sizeof(HJDATAHEAD2)); memcpy(&head.head, &headid, sizeof(DWORD64)); head.subno = subno; head.len = htonl(srclen); head.packno = htonl(packno); head.protocol = protocol; head.datainfo = datainfo; head.ver = ver; int j = 0; memcpy(dest, &head, sizeof(HJDATAHEAD2)); j += sizeof(HJDATAHEAD2); memcpy(dest + j, src, srclen); j += srclen; //check dest[j++] = 0x00; //end dest[j++] = 0xab; return j; } //收到一个完整数据包后校验数据 static bool conver_recvpack(LPBYTE pBuf, int& len) { if (pBuf == NULL) return false; if (len < sizeof(HJDATAHEAD2)) return false; static DWORD64 headid = 0xABAAAAAAAAAAAAAA; if ((*(DWORD64*)pBuf) != headid) return false; if (pBuf[len - 1] != 0xab) return false; BYTE check = 0; if (pBuf[len - 2] != check) return false; auto pHead = (HJDATAHEAD2*)pBuf; pHead->len = htonl(pHead->len); pHead->packno = htonl(pHead->packno); return true; } }; #endif