#pragma once #include //帧总体结构 struct StFrame { BYTE fheader[5]; //帧头:字符型 5字节“qknet”(71 6B 6E 65 74) BYTE protocode; //协议码:此版本协议码为0x02H. BYTE dataversion; //数据版本:此版本号由道岔缺口厂家提供给监测厂家。若监测接收到的数据版本类型和厂家提供的不一致,则不处理接收的数据。 BYTE ftype; //帧类型:0x0FH表示心跳帧,0x8FH表示数据帧。 DWORD datalen; //数据长度 LPVOID lpdata; //数据 DWORD ftail; //帧尾:填充4个字节的0xFF。 //新增一些维护型字段 FRAME_KIND e_frmKind; StFrame() { memset(this, 0, sizeof(StFrame)); memcpy_s(fheader, 5, FRAME_HEADER_315, 5); protocode = PROTOCAL_CODE; dataversion = PROTOCAL_DATAVERSION; ftail = FRAME_TAIL_315; e_frmKind = GENERAL; } }; //基础命令数据结构,所有数据命令都包含该格式,解析数据时可用此结构判断命令类型,然后再用相应数据结构解析 typedef struct { BYTE cmdid; //请求命令的命令码 }StDataBasic; class CCSM315ProtocolEx : public CCSM315Protocol { public: //static BOOL Parse(StFrame&, LPVOID, int, int dir = 1);//解析 JHD->微机监测数据包(JHD就是站机端) //buf指向数据内容 len数据内容的长度 返回data 和 最新位置的buf LPVOID*只是为了方便返回最新位置 static string ParseDataFrm(StFrame& data, LPVOID* buf, int len, int dir); static string ToString(LPVOID, int, int dir = 1); static string GetOptDirDesc(int direct); //采集类型 static string GetAcqTypeDesc(int acqtype); //报警类型 static string GetAlarmTypeDesc(int alarmID); //曲线类型 static string GetCurveTypeDesc(int curvetype); public: //返回月份的天数 static int GetDaysOfMonth(int y, int m); //时间有效 static bool IsValid(const SYSTEMTIME& sDT); //时间差 static int CalcTimePassSecond(SYSTEMTIME* stLast, SYSTEMTIME* stNow = NULL, BOOL bReturnOriginalVal = FALSE); public: //释放内存,dir: 数据包方向 0-微机监测->JHD 1-JHD->微机监测 static BOOL Release(StFrame& data, int dir); };