| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- #include "StdAfx.h"
- #include "PktAssembleBuff.h"
- #include <CSM315Protocol.h>
- void PktAssembleBuff::Resize(BYTE*& pData, int& iLen, int iNewSize)
- {
- //拷贝原始数据
- BYTE* pNewData = new (std::nothrow)BYTE[iNewSize];
- if (pData && iLen && pNewData)
- memcpy_s(pNewData, iNewSize, pData, min(iLen, iNewSize));
- delete[] pData;
- //修改缓存对象
- pData = pNewData;
- iLen = pNewData == nullptr ? 0 : iNewSize;
- }
- void PktAssembleBuff::ResizeStreamBuff(int iNewSize)
- {
- Resize(m_tcpStreamData, m_iStreaBuffSize, iNewSize);
- }
- void PktAssembleBuff::ResizePopPktBuff(int iNewSize)
- {
- Resize(pkt, iPktBuffSize, iNewSize);
- }
- void PktAssembleBuff::PushStream(BYTE* pData, int iLen)
- {
- if (m_tcpStreamData == nullptr)
- {
- m_iStreaBuffSize = 0;
- m_iStreamLen = 0;
- }
- if (m_iStreamLen + iLen > m_iStreaBuffSize)
- ResizeStreamBuff(m_iStreamLen + iLen);
- memcpy_s(m_tcpStreamData + m_iStreamLen, m_iStreaBuffSize, pData, iLen);
- m_iStreamLen += iLen;
- }
- BOOL PktAssembleBuff::PopPkt(APP_LAYER_PROTO_TYPE cpt)
- {
- if (m_tcpStreamData == nullptr)
- {
- m_iStreamLen = 0;
- m_iStreaBuffSize = 0;
- return FALSE;
- }
- for (int i = 0; i < m_iStreamLen; i++)
- {
- int ilen = 0;
- //if (ilen == 0 &&
- // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_DSP))
- //{
- // ilen = IsValidPkt_DSP(m_tcpStreamData + i, m_iStreamLen - i);
- // if (ilen > 0)
- // {
- // m_protocolType = PROTOCOL_DSP;
- // }
- //}
- if (ilen == 0 &&
- (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_315))
- {
- ilen = IsValidPkt_315(m_tcpStreamData + i, m_iStreamLen - i);
- if (ilen > 0)
- {
- m_protocolType = PROTOCOL_315;
- }
- }
- //if (ilen == 0 &&
- // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_JEP))
- //{
- // ilen = IsValidPkt_JEP(m_tcpStreamData + i, m_iStreamLen - i);
- // if (ilen > 0)
- // {
- // m_protocolType = PROTOCOL_JEP;
- // }
- //}
- //if (ilen == 0 &&
- // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_MODBUS_RTU))
- //{
- // //modbus数据每一次回调pushStream都认为是完整包。如果校验失败,则为错误数据,因此不在每一个位置上进行modbus校验
- // //modbus的通讯方式是发送前清空AssenbleBuff,并认为回调回来的一定是完整包,因此只对整个buff进行一次校验
- // if (i == 0)
- // {
- // ilen = IsValidPkt_ModbusRTU(m_tcpStreamData + i, m_iStreamLen - i);
- // if (ilen > 0)
- // {
- // m_protocolType = PROTOCOL_MODBUS_RTU;
- // }
- // }
- //}
- //if (ilen == 0 &&
- // (cpt == PROTOCOL_UNKNOWN || cpt == PROTOCOL_JDSP))
- //{
- // if (i == 0)
- // {
- // ilen = IsValidPkt_JDSP(m_tcpStreamData + i, m_iStreamLen - i);
- // if (ilen > 0)
- // {
- // m_protocolType = PROTOCOL_JDSP;
- // }
- // }
- //}
- //if (ilen == 0 &&
- // (cpt == PROTOCOL_WEBSOCKET))
- //{
- // if (i > 0)
- // break;
- // ilen = IsValidPkt_WEBSOCKET(m_tcpStreamData + i, m_iStreamLen - i);
- // if (ilen > 0)
- // {
- // m_protocolType = PROTOCOL_WEBSOCKET;
- // }
- //}
- //如果成功检测到包,拷贝出包数据。从原始的stream的buff中删除
- if (ilen)
- {
- if (ilen > iPktBuffSize)
- ResizePopPktBuff(ilen);
- //拷贝有效包到输出pkt
- memcpy_s(pkt, iPktBuffSize, m_tcpStreamData + i, ilen);
- iPktLen = ilen;
- //从组包缓冲中删除提取出的包 和 包前面的无效数据
- memcpy_s(m_tcpStreamData, m_iStreaBuffSize, m_tcpStreamData + i + ilen, m_iStreamLen - i - ilen);
- m_iStreamLen -= i + ilen;
- iAbandonBytes += i;
- //释放无用的内存
- ResizeStreamBuff(m_iStreamLen);
- return TRUE;
- }
- }
- return FALSE;
- }
- BOOL PktAssembleBuff::PopAllAs(APP_LAYER_PROTO_TYPE cpt)
- {
- if (m_iStreamLen > iPktBuffSize)
- ResizePopPktBuff(m_iStreamLen);
- memcpy_s(pkt, m_iStreamLen, m_tcpStreamData, m_iStreamLen);
- iPktLen = m_iStreamLen;
- m_iStreamLen = 0;
- ResizeStreamBuff(m_iStreamLen);
- m_protocolType = cpt;
- if (iPktLen > 0)
- return 1;
- return 0;
- }
- //
- //int PktAssembleBuff::IsValidPkt_DSP(BYTE* pData, int iLen)
- //{
- // if (iLen < 26)//dsp协议数据包最短长度
- // return 0;
- //
- // if (pData[0] != 0x55 || pData[1] != 0xBB)
- // return 0;
- //
- // const DWORD len = *((DWORD*)(pData + 2));
- //
- // if (len + 6 > iLen)
- // return 0;
- //
- // if (pData[len + 4] != 0xAA)
- // return 0;
- //
- // return (len + 6);
- //}
- int PktAssembleBuff::IsValidPkt_315(BYTE* pData, int iLen)
- {
- if (iLen < 16) return 0;//315协议数据包最短长度
- if (pData[0] != 0x71 || pData[1] != 0x6B || pData[2] != 0x6E || pData[3] != 0x65 || pData[4] != 0x74) return 0;//帧头校验
- if (pData[5] != 0x02 && pData[5] != 0x80) return 0;
- auto a = pData[7];
- if (a != FRAME_TYPE_DATA && a != FRAME_TYPE_HEARTBEAT) return 0; //2023.5.18 新增JSON数据帧 scz
- DWORD frameLen = *(DWORD*)(pData + 8);
- if (frameLen + 16 > iLen) return 0;
- BYTE* pFrameEnd = pData + frameLen + 12;
- if (pFrameEnd[0] != 0xFF || pFrameEnd[1] != 0xFF || pFrameEnd[2] != 0xFF || pFrameEnd[3] != 0xFF)
- return 0;
- return frameLen + 16;
- }
- //
- //int PktAssembleBuff::IsValidPkt_JEP(BYTE* pData, int iLen)
- //{
- // if (iLen < 7)//最短长度
- // return 0;
- //
- // if (pData[0] != 0x68)
- // return 0;
- //
- // JEP_LEN_REGION* plr = (JEP_LEN_REGION*)(pData + 1);
- // int icmdlen = plr->dlen;
- //
- // if (icmdlen + 7 > iLen)
- // return 0;
- //
- // if (pData[icmdlen + 6] != 0x97)
- // return 0;
- //
- //
- // BYTE check = 0;
- // BYTE* pos = (LPBYTE)pData;
- // for (int i = 0; (UINT)i < 1 + 4 + icmdlen; ++i)
- // check += pos[i];
- //
- // if (pData[icmdlen + 5] != check)
- // return 0;
- //
- // return icmdlen + 7;
- //}
- //
- //BOOL PktAssembleBuff::Request315Pkt(BYTE cmd, BYTE* pPkt, int& iLen, void* pInData)
- //{
- // pPkt[0] = 0x71;
- // pPkt[1] = 0x6B;
- // pPkt[2] = 0x6E;
- // pPkt[3] = 0x65;
- // pPkt[4] = 0x74;
- //
- // pPkt[5] = 0x02;//协议码
- // pPkt[6] = 0x00;//未处理
- // pPkt[7] = 0x8F;
- //
- // DWORD dwFrameLen = 0;
- // switch (cmd)
- // {
- // case CMD_CODE_GAPCFG:
- // {
- // dwFrameLen = 1;
- // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
- // pPkt[12] = CMD_CODE_GAPCFG;
- // break;
- // }
- // case CMD_CODE_GAPVAL:
- // {
- // dwFrameLen = 1;
- // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
- // pPkt[12] = CMD_CODE_GAPVAL;
- // break;
- // }
- // case CMD_CODE_IMGINFO:
- // {
- // dwFrameLen = 11;
- // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
- // pPkt[12] = CMD_CODE_IMGINFO;
- // ImgInfoRequest* pInfo = (ImgInfoRequest*)pInData;
- // memcpy_s(pPkt + 13, iPktBuffSize - 13, &pInfo->iZZJNo, 2);
- // memcpy_s(pPkt + 15, iPktBuffSize - 15, &pInfo->time, 4);
- // pPkt[16] = 0;
- // memset(pPkt + 17, 0xFF, 3);
- // break;
- // }
- // case CMD_CODE_LASTGAPIMG:
- // {
- // dwFrameLen = 3;
- // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
- // pPkt[12] = CMD_CODE_LASTGAPIMG;
- // LastImgInfoRequest* pInfo = (LastImgInfoRequest*)pInData;
- // WORD iZZJNo = pInfo->iZZJNo;
- // memcpy_s(pPkt + 13, iPktBuffSize - 13, &iZZJNo, 2);
- // break;
- // }
- // case CMD_CODE_IMGLIST:
- // {
- // dwFrameLen = 19;
- // memcpy_s(pPkt + 8, iPktBuffSize - 8, &dwFrameLen, 4);
- // pPkt[12] = CMD_CODE_IMGLIST;
- // ImgListRequest* pInfo = (ImgListRequest*)pInData;
- // memcpy_s(pPkt + 13, iPktBuffSize - 13, &pInfo->iZZJNo, 2);
- // memcpy_s(pPkt + 15, iPktBuffSize - 15, &pInfo->time, 4);
- // memcpy_s(pPkt + 19, iPktBuffSize - 19, &pInfo->endTime, 4);
- // memcpy_s(pPkt + 23, iPktBuffSize - 23, &pInfo->imgType, 1);
- // memset(pPkt + 24, 0xFF, 3);
- // break;
- // }
- // default:
- // {
- // return FALSE;
- // break;
- // }
- // }
- // memset(pPkt + 12 + dwFrameLen, 0xFF, 4);
- // iLen = dwFrameLen + 16;
- // return TRUE;
- //}
- //
- //int PktAssembleBuff::IsValidPkt_ModbusRTU(BYTE* pData, int iLen)
- //{
- // if (iLen < 4)
- // return 0;
- //
- // WORD crc1 = *(WORD*)(pData + iLen - 2);
- // WORD crc2 = GetCRC(pData, iLen - 2);
- // if (crc1 == crc2)
- // return iLen;
- // else
- // return 0;
- //}
- /*
- int PktAssembleBuff::IsValidPkt_JDSP(BYTE* pData, int iLen)
- {
- if (iLen < 26)
- return 0;
- char head[30] = { 0 };
- memcpy(head, pData, 29);
- string strHead = head;
- char tail[30] = { 0 };
- memcpy(tail, pData + iLen - 1 - 28, 29);
- string strTail = tail;
- if (strHead.find("\"<\"") != std::string::npos)
- {
- if (strTail.find("\">\"") != std::string::npos)
- {
- return iLen;
- }
- }
- return 0;
- }*/
- //int PktAssembleBuff::IsValidPkt_JDSP(BYTE* pData, int iLen)
- //{
- // if (iLen < 15)//{"<":"",">":""} 至少15个, formated可能会额外有回车 空格字符
- // return 0;
- // if (pData[0] != '{') //头尾先检测,提高大数据包的检测效率,避免不断寻找 > 字符
- // return 0;
- //
- // //支持两个\r\n分包
- // for (int i = 0; i < iLen - 3; i++)
- // {
- // if (pData[i] == '\r' && pData[i + 1] == '\n' && pData[i + 2] == '\r' && pData[i + 3] == '\n')
- // {
- // return i + 4;
- // }
- // }
- // //支持两个\n分包
- // for (int i = 0; i < iLen - 3; i++)
- // {
- // if (pData[i] == '\n' && pData[i + 1] == '\n')
- // {
- // return i + 2;
- // }
- // }
- //
- // char* pBuf = new char[iLen + 1];
- // memcpy(pBuf, pData, iLen);
- // pBuf[iLen] = 0;//否则下面这行会有潜在的bug
- // string strBuf = pBuf;
- // delete[] pBuf;
- // string::size_type pos = 0;
- // if (strBuf.find("\"<\"") != std::string::npos) {
- // if ((pos = strBuf.find("\">\"")) != std::string::npos) {
- // string::size_type pos1 = 0;
- // string strBufTmp = strBuf.substr(pos, iLen - pos);
- // if ((pos1 = strBufTmp.find("}")) != std::string::npos) {
- // return (pos + pos1 + 1);
- // }
- // }
- // }
- // return 0;
- //}
- //
- //int PktAssembleBuff::IsValidPkt_WEBSOCKET(BYTE* pData, int iLen)
- //{
- // CWSPPkt req;
- // if (WS_ERROR_FRAME != req.UnPackWS((char*)pData, iLen))
- // {
- // return req.iFrmLen;
- // }
- // return 0;
- //}
|