IDPMSComm.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #include "pch.h"
  2. #include "IDPMSComm.h"
  3. #include "XSocket.h"
  4. #include "LOG.h"
  5. #include "IDCMParser.h"
  6. IDPMSComm::IDPMSComm()
  7. {
  8. // 初始化Socket
  9. m_pSocket = new CXSocket();
  10. ASSERT(m_pSocket);
  11. m_pSocket->Init();
  12. }
  13. IDPMSComm::~IDPMSComm()
  14. {
  15. if (m_pSocket != NULL)
  16. {
  17. delete m_pSocket;
  18. m_pSocket = NULL;
  19. }
  20. }
  21. /**************************************************************************************************
  22. 函 数 名 :Open
  23. 功能描述 :打开IDPMS通讯服务
  24. 输入参数 :无
  25. 输出参数 :无
  26. 返 回 值 :void
  27. **************************************************************************************************/
  28. BOOL IDPMSComm::Open()
  29. {
  30. bool bRes = m_pSocket->QConnect(Utils::IP_STR2DW(g_szIDPMSHost), g_iIDPMSPort);
  31. if (bRes != true)
  32. {
  33. LOG::E(_T("IDPMS连接失败!"));
  34. return FALSE ;
  35. }
  36. return TRUE;
  37. }
  38. /**************************************************************************************************
  39. 函 数 名 :Close
  40. 功能描述 :关闭IDPMS通讯服务
  41. 输入参数 :无
  42. 输出参数 :无
  43. 返 回 值 :void
  44. **************************************************************************************************/
  45. BOOL IDPMSComm::Close()
  46. {
  47. m_pSocket->Close();
  48. return TRUE;
  49. }
  50. /**************************************************************************************************
  51. 函 数 名 :SendCommand
  52. 功能描述 :向IDPMS发送Command,并获取返回消息
  53. 输入参数 :无
  54. 输出参数 :无
  55. 返 回 值 :void
  56. **************************************************************************************************/
  57. int IDPMSComm::SendCommand(LPCTSTR szCommand, DMSResponse *&pRes, LPCTSTR szEndFlag)
  58. {
  59. CString szCmd(szCommand);
  60. CString szRes;
  61. int ilenSent = 0;
  62. char resBuff[IDPMS_MAX_SIZE]; // 应答缓冲区
  63. int iSizeRecevied = 0;
  64. IDCMParser *pIDCM = new IDCMParser();
  65. BOOL bCompleted = FALSE;
  66. //int iRcvTimes = 0;
  67. //int iRecMaxTimes = 5;
  68. int iLen = szCmd.GetLength()+1;
  69. if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
  70. {
  71. LOG::E(szCommand, _T("发送失败!"));
  72. return -1;
  73. }
  74. CString szLog;
  75. szLog.Format("发送:%s", szCmd);
  76. LOG::D(CString(szLog));
  77. // 循环接收数据,直到超时退出
  78. while (TRUE)
  79. {
  80. memset(resBuff, 0, IDPMS_MAX_SIZE);
  81. int iRet1 = m_pSocket->Recv(resBuff, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
  82. if (iRet1 == E_XSOCKET_SUCCESS)
  83. {
  84. // 处理接收数据
  85. return pIDCM->Parser(resBuff, pRes, szEndFlag);
  86. }
  87. else if (iRet1 == E_XSOCKET_TIMEDOUT)
  88. {
  89. continue;
  90. }
  91. else
  92. {
  93. LOG::E(szCmd.GetBuffer(), CString("处理错误"));
  94. return 0;
  95. }
  96. }
  97. return 0;
  98. }
  99. /**************************************************************************************************
  100. 函 数 名 :SendCommand
  101. 功能描述 :向IDPMS发送Command,并获取返回消息
  102. 输入参数 :无
  103. 输出参数 :无
  104. 返 回 值 :略
  105. **************************************************************************************************/
  106. int IDPMSComm::SendCommand(LPCTSTR szCommand, DMSResponse *&pRes, int nMaxReplyPackages)
  107. {
  108. CString szCmd(szCommand);
  109. CString szRes;
  110. int ilenSent = 0;
  111. char resBuff[IDPMS_MAX_SIZE]; // 应答缓冲区
  112. int iSizeRecevied = 0;
  113. int iRet = 0;
  114. IDCMParser *parser = new IDCMParser();
  115. BOOL bCompleted = FALSE;
  116. int iReplayNum = 0;
  117. int iLen = szCmd.GetLength()+1;
  118. LOG::D(szCmd);
  119. if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
  120. {
  121. LOG::E(szCommand, _T("发送失败!"));
  122. return -1;
  123. }
  124. CString szLog;
  125. szLog.Format("发送:%s", szCmd);
  126. LOG::D(CString(szLog));
  127. // 循环接收数据,直到超时退出
  128. while (TRUE)
  129. {
  130. iReplayNum++;
  131. memset(resBuff, 0, IDPMS_MAX_SIZE);
  132. iRet = m_pSocket->Recv(resBuff, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
  133. if (iRet == E_XSOCKET_SUCCESS)
  134. {
  135. // 解析返回数据
  136. int iRet2 = parser->Parser(resBuff, pRes);
  137. if (iReplayNum >= nMaxReplyPackages) return 1;
  138. return iRet2;
  139. }
  140. else if (iRet == E_XSOCKET_TIMEDOUT)
  141. {
  142. // Time out, failed
  143. return 0;
  144. }
  145. else
  146. {
  147. LOG::E(szCmd.GetBuffer(), _T("处理错误"));
  148. return 0;
  149. }
  150. }
  151. return 0;
  152. }
  153. /**************************************************************************************************
  154. 函 数 名 :SendCommand
  155. 功能描述 :向IDPMS发送Command,并获取返回消息
  156. 输入参数 :无
  157. 输出参数 :无
  158. 返 回 值 :void
  159. **************************************************************************************************/
  160. int IDPMSComm::SendDataCommand(LPCTSTR szCommand, DMSResponse *&pRes, void *pData)
  161. {
  162. CString szCmd(szCommand);
  163. CString szRes;
  164. int ilenSent = 0;
  165. char resBuff[IDPMS_MAX_SIZE]; // 应答缓冲区
  166. int iSizeRecevied = 0;
  167. BOOL bCompleted = FALSE;
  168. IDCMParser *parser = new IDCMParser();
  169. int iLen = szCmd.GetLength()+1;
  170. if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
  171. {
  172. LOG::E(szCommand, _T("发送失败!"));
  173. return -1;
  174. }
  175. CString szLog;
  176. szLog.Format("发送:%s", szCmd);
  177. LOG::D(CString(szLog));
  178. // 循环接收数据,直到超时退出
  179. while (TRUE)
  180. {
  181. memset(resBuff, 0, IDPMS_MAX_SIZE);
  182. int iRet1 = m_pSocket->Recv(resBuff, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
  183. if (iRet1 == E_XSOCKET_SUCCESS)
  184. {
  185. // 处理接收数据
  186. CString szLine(resBuff);
  187. if (szLine.FindOneOf(_T("IDPMS-CR:点发送开始")) > 0)
  188. {
  189. continue;
  190. }
  191. else if (szLine.FindOneOf(_T("IDPMS-CR:点发送结束")) > 0)
  192. {
  193. parser->ParseData(resBuff, pRes, pData);
  194. return 1;
  195. }
  196. else
  197. {
  198. parser->ParseData(resBuff, pRes, pData);
  199. }
  200. }
  201. else
  202. {
  203. LOG::E(szCmd.GetBuffer(), _T("处理错误"));
  204. return 0;
  205. }
  206. }
  207. return 0;
  208. }
  209. /**************************************************************************************************
  210. 函 数 名 :Send
  211. 功能描述 :向IDPMS发送Command,只发送
  212. 输入参数 :无
  213. 输出参数 :无
  214. 返 回 值 :void
  215. **************************************************************************************************/
  216. BOOL IDPMSComm::Send(LPCTSTR szCommand)
  217. {
  218. CString szLog;
  219. szLog.Format("发送:%s", szCommand);
  220. LOG::D(CString(szLog));
  221. CString szCmd(szCommand);
  222. int ilenSent = 0;
  223. int iLen = szCmd.GetLength() + 1;
  224. if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
  225. {
  226. LOG::E(szCommand, _T("发送失败!"));
  227. return FALSE;
  228. }
  229. return TRUE;
  230. }
  231. /**************************************************************************************************
  232. 函 数 名 :Send
  233. 功能描述 :向IDPMS发送Command,只发送
  234. 输入参数 :无
  235. 输出参数 :无
  236. 返 回 值 :void
  237. **************************************************************************************************/
  238. BOOL IDPMSComm::Receive(char *pBuf)
  239. {
  240. int iSizeRecevied = 0;
  241. memset(pBuf, 0, IDPMS_MAX_SIZE);
  242. int iRet1 = m_pSocket->Recv(pBuf, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
  243. if (iRet1 != E_XSOCKET_SUCCESS)
  244. {
  245. LOG::E(_T("数据接收失败!"));
  246. return FALSE;
  247. }
  248. CString szCmd(pBuf);
  249. int iCmdSize = szCmd.GetLength();
  250. CString szLog(pBuf);
  251. szLog.Format("接收:%s", szCmd);
  252. LOG::D(CString(szLog));
  253. if (iSizeRecevied > iCmdSize + 1)
  254. {
  255. char* szTmp = pBuf + iCmdSize + 1;
  256. CString szLog(szTmp);
  257. }
  258. int iStart = szCmd.GetLength() + 2;
  259. return TRUE;
  260. }
  261. /**************************************************************************************************
  262. 函 数 名 :Send
  263. 功能描述 :向IDPMS发送Command,只发送
  264. 输入参数 :无
  265. 输出参数 :无
  266. 返 回 值 :void
  267. **************************************************************************************************/
  268. BOOL IDPMSComm::Receive(CStringArray &szDataArray)
  269. {
  270. char pBuf[IDPMS_MAX_SIZE];
  271. int iSizeRecevied = 0;
  272. memset(pBuf, 0, IDPMS_MAX_SIZE);
  273. int iRet1 = m_pSocket->Recv(pBuf, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
  274. if (iRet1 != E_XSOCKET_SUCCESS)
  275. {
  276. LOG::E(_T("数据接收失败!"));
  277. return FALSE;
  278. }
  279. CString szLog;
  280. szLog.Format("接收:%s", pBuf);
  281. LOG::D(CString(szLog));
  282. int iNum = 0;
  283. iNum = Utils::StrSplit(pBuf, iSizeRecevied, '\0', szDataArray);
  284. return TRUE;
  285. }