Package.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // CommPackageImp.h: interface for the CCommPackageImp class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_)
  5. #define AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "RVCComm.h"
  10. #include <winpr/collections.h>
  11. #include <vector>
  12. #include "des.h"
  13. #pragma warning(disable:4200)
  14. #pragma pack(1)
  15. // 包头定义
  16. struct CPackageHeader
  17. {
  18. WORD m_nFlag; // 标志位
  19. WORD m_nPackageLen; // 整包长
  20. BYTE m_nVersion; // 版本号
  21. BYTE m_nStructNum; // 不同接口数量
  22. char m_arrServiceCode[8]; // 服务代码
  23. DWORD m_nReqTime; // 请求时间(2000年开始秒数)
  24. WORD m_nSN; // 请求序号
  25. DWORD m_nAnsTime; // 应答时间(2000年开始秒数)
  26. BYTE m_arrMac[8]; // 校验码,整包校验值,在计算前把字段位置填为0x0
  27. CPackageHeader()
  28. {
  29. memset(this, 0, sizeof(CPackageHeader));
  30. m_nFlag = 0xA5C3;
  31. m_nVersion = 1;
  32. }
  33. };
  34. // 接口定义类
  35. struct CStructDef
  36. {
  37. WORD m_nTargetLen; // 目标长度(数组所有成员长度)
  38. WORD m_nSourceLen; // 源长度(数组所有成员长度)
  39. WORD m_nArrayNum; // 数组长度
  40. char m_cEncCode; // 加密标志
  41. char m_cZipCode; // 压缩标志
  42. char m_arrName[8]; // 接口名称
  43. BYTE *m_pData;
  44. CStructDef()
  45. {
  46. memset(this, 0, sizeof(CStructDef));
  47. }
  48. // 取接口定义体长度
  49. static int GetStructDefLen()
  50. {
  51. //return sizeof(CStructDef) - sizeof(BYTE *) *2 ;
  52. return sizeof(CStructDef)-sizeof(BYTE *);
  53. }
  54. };
  55. // 错误信息
  56. struct CErrorReturn
  57. {
  58. //char m_arrErrCode[8];
  59. DWORD m_dwSysCode; // 系统错误代码
  60. DWORD m_dwUserCode; // 用户错误代码
  61. char m_arrErrMsg[0]; // 变长,0-256
  62. };
  63. // 会话握手请求
  64. struct CSessionShakeReq
  65. {
  66. DWORD m_dwTokenHash; // 取TokenID Hash前4个字节
  67. DWORD m_dwSessionID; // 取SessionKey Hash前4个字节
  68. };
  69. // 使用共享会话密钥请求
  70. struct CUseSharedSKReq
  71. {
  72. char m_arrTerminalNo[16];
  73. DWORD m_dwSharedSKHash;
  74. };
  75. #pragma pack()
  76. struct CCommPackage : IPackage
  77. {
  78. public:
  79. CCommPackage(const BYTE sessionKey[16], const char *pServiceCode);
  80. CCommPackage(CCommPackage *pkg);
  81. virtual ~CCommPackage();
  82. // 增加接口数据,nBufLen包括所有数组元素的总长度,nArrayNum指定数组个数
  83. void AddStruct(const char *pStructName, bool bZip, bool bEncrypt,
  84. BYTE *pDataBuf, int nBufLen, int nArrayNum = 1);
  85. // 取接口数据长度
  86. int GetStructLen(const char *pStructName);
  87. // 取接口数据
  88. bool GetStructData(const char *pStructName, BYTE *pDataBuf,
  89. int *pBufLen, int *pArrayNum);
  90. // 解析接收包数据
  91. bool ParseRecvData(BYTE *pData, int *pLen, string& strErrMsg);
  92. // 生成发送包数据
  93. bool GenerateSendData(BYTE *pData, int *pLen);
  94. // 取发送包总长度
  95. int GetPackageLen();
  96. // 生成请求标识
  97. string GetPackageReqID();
  98. // 取服务代码
  99. string GetServiceCode();
  100. // 增加错误接口信息
  101. void SetErrMsg(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg);
  102. // 检查并返回错误信息
  103. bool GetErrMsg(DWORD& dwSysCode, DWORD& dwUserCode, string& rErrMsg);
  104. private:
  105. void Clear();
  106. bool ZipData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, int *pDestLen);
  107. bool UnzipData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, int *pDestLen);
  108. bool EncryptData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, int *pDestLen);
  109. bool DecryptData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, int *pDestLen);
  110. bool GenerateMac(BYTE *pData, int nLen, BYTE mac[8]);
  111. private:
  112. std::vector<CStructDef*> m_Structs;
  113. CPackageHeader m_Header;
  114. BYTE m_SessionKey[16];
  115. bool m_bHasSessionKey;
  116. DES_key_schedule m_DesKey;
  117. //BYTE m_DesIVec[8];
  118. static DWORD m_nLastReqTime;
  119. static WORD m_nLastReqSN;
  120. };
  121. #endif // !defined(AFX_COMMPACKAGEIMP_H__6A4C03CE_9B9C_4AB1_AE7F_C02DA4A5012E__INCLUDED_)