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