PktAssembleBuff.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. #include "StdAfx.h"
  2. #include "PktAssembleBuff.h"
  3. #include <CSM315Protocol.h>
  4. void PktAssembleBuff::Resize(BYTE*& pData, int& iLen, int iNewSize)
  5. {
  6. //拷贝原始数据
  7. BYTE* pNewData = new (std::nothrow)BYTE[iNewSize];
  8. if (pData && iLen && pNewData)
  9. memcpy_s(pNewData, iNewSize, pData, min(iLen, iNewSize));
  10. delete[] pData;
  11. //修改缓存对象
  12. pData = pNewData;
  13. iLen = pNewData == nullptr ? 0 : iNewSize;
  14. }
  15. void PktAssembleBuff::ResizeStreamBuff(int iNewSize)
  16. {
  17. Resize(m_tcpStreamData, m_iStreaBuffSize, iNewSize);
  18. }
  19. void PktAssembleBuff::ResizePopPktBuff(int iNewSize)
  20. {
  21. Resize(pkt, iPktBuffSize, iNewSize);
  22. }
  23. void PktAssembleBuff::PushStream(BYTE* pData, int iLen)
  24. {
  25. if (m_tcpStreamData == nullptr)
  26. {
  27. m_iStreaBuffSize = 0;
  28. m_iStreamLen = 0;
  29. }
  30. if (m_iStreamLen + iLen > m_iStreaBuffSize)
  31. ResizeStreamBuff(m_iStreamLen + iLen);
  32. memcpy_s(m_tcpStreamData + m_iStreamLen, m_iStreaBuffSize, pData, iLen);
  33. m_iStreamLen += iLen;
  34. }
  35. BOOL PktAssembleBuff::PopPkt(APP_LAYER_PROTO_TYPE cpt)
  36. {
  37. if (m_tcpStreamData == nullptr)
  38. {
  39. m_iStreamLen = 0;
  40. m_iStreaBuffSize = 0;
  41. return FALSE;
  42. }
  43. for (int i = 0; i < m_iStreamLen; i++)
  44. {
  45. int ilen = 0;
  46. //if (ilen == 0 &&
  47. // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_DSP))
  48. //{
  49. // ilen = IsValidPkt_DSP(m_tcpStreamData + i, m_iStreamLen - i);
  50. // if (ilen > 0)
  51. // {
  52. // m_protocolType = PROTOCOL_DSP;
  53. // }
  54. //}
  55. if (ilen == 0 &&
  56. (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_315))
  57. {
  58. ilen = IsValidPkt_315(m_tcpStreamData + i, m_iStreamLen - i);
  59. if (ilen > 0)
  60. {
  61. m_protocolType = PROTOCOL_315;
  62. }
  63. }
  64. //if (ilen == 0 &&
  65. // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_JEP))
  66. //{
  67. // ilen = IsValidPkt_JEP(m_tcpStreamData + i, m_iStreamLen - i);
  68. // if (ilen > 0)
  69. // {
  70. // m_protocolType = PROTOCOL_JEP;
  71. // }
  72. //}
  73. //if (ilen == 0 &&
  74. // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_MODBUS_RTU))
  75. //{
  76. // //modbus数据每一次回调pushStream都认为是完整包。如果校验失败,则为错误数据,因此不在每一个位置上进行modbus校验
  77. // //modbus的通讯方式是发送前清空AssenbleBuff,并认为回调回来的一定是完整包,因此只对整个buff进行一次校验
  78. // if (i == 0)
  79. // {
  80. // ilen = IsValidPkt_ModbusRTU(m_tcpStreamData + i, m_iStreamLen - i);
  81. // if (ilen > 0)
  82. // {
  83. // m_protocolType = PROTOCOL_MODBUS_RTU;
  84. // }
  85. // }
  86. //}
  87. //if (ilen == 0 &&
  88. // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_JDSP))
  89. //{
  90. // if (i == 0)
  91. // {
  92. // ilen = IsValidPkt_JDSP(m_tcpStreamData + i, m_iStreamLen - i);
  93. // if (ilen > 0)
  94. // {
  95. // m_protocolType = PROTOCOL_JDSP;
  96. // }
  97. // }
  98. //}
  99. //if (ilen == 0 &&
  100. // (cpt == PROTOCOL_WEBSOCKET))
  101. //{
  102. // if (i > 0)
  103. // break;
  104. // ilen = IsValidPkt_WEBSOCKET(m_tcpStreamData + i, m_iStreamLen - i);
  105. // if (ilen > 0)
  106. // {
  107. // m_protocolType = PROTOCOL_WEBSOCKET;
  108. // }
  109. //}
  110. //如果成功检测到包,拷贝出包数据。从原始的stream的buff中删除
  111. if (ilen)
  112. {
  113. if (ilen > iPktBuffSize)
  114. ResizePopPktBuff(ilen);
  115. //拷贝有效包到输出pkt
  116. memcpy_s(pkt, iPktBuffSize, m_tcpStreamData + i, ilen);
  117. iPktLen = ilen;
  118. //从组包缓冲中删除提取出的包 和 包前面的无效数据
  119. memcpy_s(m_tcpStreamData, m_iStreaBuffSize, m_tcpStreamData + i + ilen, m_iStreamLen - i - ilen);
  120. m_iStreamLen -= i + ilen;
  121. iAbandonBytes += i;
  122. //释放无用的内存
  123. ResizeStreamBuff(m_iStreamLen);
  124. return TRUE;
  125. }
  126. }
  127. return FALSE;
  128. }
  129. BOOL PktAssembleBuff::PopAllAs(APP_LAYER_PROTO_TYPE cpt)
  130. {
  131. if (m_iStreamLen > iPktBuffSize)
  132. ResizePopPktBuff(m_iStreamLen);
  133. memcpy_s(pkt, m_iStreamLen, m_tcpStreamData, m_iStreamLen);
  134. iPktLen = m_iStreamLen;
  135. m_iStreamLen = 0;
  136. ResizeStreamBuff(m_iStreamLen);
  137. m_protocolType = cpt;
  138. if (iPktLen > 0)
  139. return 1;
  140. return 0;
  141. }
  142. //
  143. //int PktAssembleBuff::IsValidPkt_DSP(BYTE* pData, int iLen)
  144. //{
  145. // if (iLen < 26)//dsp协议数据包最短长度
  146. // return 0;
  147. //
  148. // if (pData[0] != 0x55 || pData[1] != 0xBB)
  149. // return 0;
  150. //
  151. // const DWORD len = *((DWORD*)(pData + 2));
  152. //
  153. // if (len + 6 > iLen)
  154. // return 0;
  155. //
  156. // if (pData[len + 4] != 0xAA)
  157. // return 0;
  158. //
  159. // return (len + 6);
  160. //}
  161. int PktAssembleBuff::IsValidPkt_315(BYTE* pData, int iLen)
  162. {
  163. if (iLen < 16) return 0;//315协议数据包最短长度
  164. if (pData[0] != 0x71 || pData[1] != 0x6B || pData[2] != 0x6E || pData[3] != 0x65 || pData[4] != 0x74) return 0;//帧头校验
  165. if (pData[5] != 0x02 && pData[5] != 0x80) return 0;
  166. auto a = pData[7];
  167. if (a != FRAME_TYPE_DATA && a != FRAME_TYPE_HEARTBEAT) return 0; //2023.5.18 新增JSON数据帧 scz
  168. DWORD frameLen = *(DWORD*)(pData + 8);
  169. if (frameLen + 16 > iLen) return 0;
  170. BYTE* pFrameEnd = pData + frameLen + 12;
  171. if (pFrameEnd[0] != 0xFF || pFrameEnd[1] != 0xFF || pFrameEnd[2] != 0xFF || pFrameEnd[3] != 0xFF)
  172. return 0;
  173. return frameLen + 16;
  174. }
  175. //
  176. //int PktAssembleBuff::IsValidPkt_JEP(BYTE* pData, int iLen)
  177. //{
  178. // if (iLen < 7)//最短长度
  179. // return 0;
  180. //
  181. // if (pData[0] != 0x68)
  182. // return 0;
  183. //
  184. // JEP_LEN_REGION* plr = (JEP_LEN_REGION*)(pData + 1);
  185. // int icmdlen = plr->dlen;
  186. //
  187. // if (icmdlen + 7 > iLen)
  188. // return 0;
  189. //
  190. // if (pData[icmdlen + 6] != 0x97)
  191. // return 0;
  192. //
  193. //
  194. // BYTE check = 0;
  195. // BYTE* pos = (LPBYTE)pData;
  196. // for (int i = 0; (UINT)i < 1 + 4 + icmdlen; ++i)
  197. // check += pos[i];
  198. //
  199. // if (pData[icmdlen + 5] != check)
  200. // return 0;
  201. //
  202. // return icmdlen + 7;
  203. //}
  204. //
  205. //BOOL PktAssembleBuff::Request315Pkt(BYTE cmd, BYTE* pPkt, int& iLen, void* pInData)
  206. //{
  207. // pPkt[0] = 0x71;
  208. // pPkt[1] = 0x6B;
  209. // pPkt[2] = 0x6E;
  210. // pPkt[3] = 0x65;
  211. // pPkt[4] = 0x74;
  212. //
  213. // pPkt[5] = 0x02;//协议码
  214. // pPkt[6] = 0x00;//未处理
  215. // pPkt[7] = 0x8F;
  216. //
  217. // DWORD dwFrameLen = 0;
  218. // switch (cmd)
  219. // {
  220. // case CMD_CODE_GAPCFG:
  221. // {
  222. // dwFrameLen = 1;
  223. // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
  224. // pPkt[12] = CMD_CODE_GAPCFG;
  225. // break;
  226. // }
  227. // case CMD_CODE_GAPVAL:
  228. // {
  229. // dwFrameLen = 1;
  230. // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
  231. // pPkt[12] = CMD_CODE_GAPVAL;
  232. // break;
  233. // }
  234. // case CMD_CODE_IMGINFO:
  235. // {
  236. // dwFrameLen = 11;
  237. // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
  238. // pPkt[12] = CMD_CODE_IMGINFO;
  239. // ImgInfoRequest* pInfo = (ImgInfoRequest*)pInData;
  240. // memcpy_s(pPkt + 13, iPktBuffSize - 13, &pInfo->iZZJNo, 2);
  241. // memcpy_s(pPkt + 15, iPktBuffSize - 15, &pInfo->time, 4);
  242. // pPkt[16] = 0;
  243. // memset(pPkt + 17, 0xFF, 3);
  244. // break;
  245. // }
  246. // case CMD_CODE_LASTGAPIMG:
  247. // {
  248. // dwFrameLen = 3;
  249. // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
  250. // pPkt[12] = CMD_CODE_LASTGAPIMG;
  251. // LastImgInfoRequest* pInfo = (LastImgInfoRequest*)pInData;
  252. // WORD iZZJNo = pInfo->iZZJNo;
  253. // memcpy_s(pPkt + 13, iPktBuffSize - 13, &iZZJNo, 2);
  254. // break;
  255. // }
  256. // case CMD_CODE_IMGLIST:
  257. // {
  258. // dwFrameLen = 19;
  259. // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
  260. // pPkt[12] = CMD_CODE_IMGLIST;
  261. // ImgListRequest* pInfo = (ImgListRequest*)pInData;
  262. // memcpy_s(pPkt + 13, iPktBuffSize - 13, &pInfo->iZZJNo, 2);
  263. // memcpy_s(pPkt + 15, iPktBuffSize - 15, &pInfo->time, 4);
  264. // memcpy_s(pPkt + 19, iPktBuffSize - 19, &pInfo->endTime, 4);
  265. // memcpy_s(pPkt + 23, iPktBuffSize - 23, &pInfo->imgType, 1);
  266. // memset(pPkt + 24, 0xFF, 3);
  267. // break;
  268. // }
  269. // default:
  270. // {
  271. // return FALSE;
  272. // break;
  273. // }
  274. // }
  275. // memset(pPkt + 12 + dwFrameLen, 0xFF, 4);
  276. // iLen = dwFrameLen + 16;
  277. // return TRUE;
  278. //}
  279. //
  280. //int PktAssembleBuff::IsValidPkt_ModbusRTU(BYTE* pData, int iLen)
  281. //{
  282. // if (iLen < 4)
  283. // return 0;
  284. //
  285. // WORD crc1 = *(WORD*)(pData + iLen - 2);
  286. // WORD crc2 = GetCRC(pData, iLen - 2);
  287. // if (crc1 == crc2)
  288. // return iLen;
  289. // else
  290. // return 0;
  291. //}
  292. /*
  293. int PktAssembleBuff::IsValidPkt_JDSP(BYTE* pData, int iLen)
  294. {
  295. if (iLen < 26)
  296. return 0;
  297. char head[30] = { 0 };
  298. memcpy(head, pData, 29);
  299. string strHead = head;
  300. char tail[30] = { 0 };
  301. memcpy(tail, pData + iLen - 1 - 28, 29);
  302. string strTail = tail;
  303. if (strHead.find("\"<\"") != std::string::npos)
  304. {
  305. if (strTail.find("\">\"") != std::string::npos)
  306. {
  307. return iLen;
  308. }
  309. }
  310. return 0;
  311. }*/
  312. //int PktAssembleBuff::IsValidPkt_JDSP(BYTE* pData, int iLen)
  313. //{
  314. // if (iLen < 15)//{"<":"",">":""} 至少15个, formated可能会额外有回车 空格字符
  315. // return 0;
  316. // if (pData[0] != '{') //头尾先检测,提高大数据包的检测效率,避免不断寻找 > 字符
  317. // return 0;
  318. //
  319. // //支持两个\r\n分包
  320. // for (int i = 0; i < iLen - 3; i++)
  321. // {
  322. // if (pData[i] == '\r' && pData[i + 1] == '\n' && pData[i + 2] == '\r' && pData[i + 3] == '\n')
  323. // {
  324. // return i + 4;
  325. // }
  326. // }
  327. // //支持两个\n分包
  328. // for (int i = 0; i < iLen - 3; i++)
  329. // {
  330. // if (pData[i] == '\n' && pData[i + 1] == '\n')
  331. // {
  332. // return i + 2;
  333. // }
  334. // }
  335. //
  336. // char* pBuf = new char[iLen + 1];
  337. // memcpy(pBuf, pData, iLen);
  338. // pBuf[iLen] = 0;//否则下面这行会有潜在的bug
  339. // string strBuf = pBuf;
  340. // delete[] pBuf;
  341. // string::size_type pos = 0;
  342. // if (strBuf.find("\"<\"") != std::string::npos) {
  343. // if ((pos = strBuf.find("\">\"")) != std::string::npos) {
  344. // string::size_type pos1 = 0;
  345. // string strBufTmp = strBuf.substr(pos, iLen - pos);
  346. // if ((pos1 = strBufTmp.find("}")) != std::string::npos) {
  347. // return (pos + pos1 + 1);
  348. // }
  349. // }
  350. // }
  351. // return 0;
  352. //}
  353. //
  354. //int PktAssembleBuff::IsValidPkt_WEBSOCKET(BYTE* pData, int iLen)
  355. //{
  356. // CWSPPkt req;
  357. // if (WS_ERROR_FRAME != req.UnPackWS((char*)pData, iLen))
  358. // {
  359. // return req.iFrmLen;
  360. // }
  361. // return 0;
  362. //}