| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- #include "pch.h"
- #include "IDPMSComm.h"
- #include "XSocket.h"
- #include "LOG.h"
- #include "IDCMParser.h"
- IDPMSComm::IDPMSComm()
- {
- // 初始化Socket
- m_pSocket = new CXSocket();
- ASSERT(m_pSocket);
- m_pSocket->Init();
- }
- IDPMSComm::~IDPMSComm()
- {
- if (m_pSocket != NULL)
- {
- delete m_pSocket;
- m_pSocket = NULL;
- }
- }
- /**************************************************************************************************
- 函 数 名 :Open
- 功能描述 :打开IDPMS通讯服务
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :void
- **************************************************************************************************/
- BOOL IDPMSComm::Open()
- {
- bool bRes = m_pSocket->QConnect(Utils::IP_STR2DW(g_szIDPMSHost), g_iIDPMSPort);
- if (bRes != true)
- {
- LOG::E(_T("IDPMS连接失败!"));
- return FALSE ;
- }
- return TRUE;
- }
- /**************************************************************************************************
- 函 数 名 :Close
- 功能描述 :关闭IDPMS通讯服务
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :void
- **************************************************************************************************/
- BOOL IDPMSComm::Close()
- {
- m_pSocket->Close();
- return TRUE;
- }
- /**************************************************************************************************
- 函 数 名 :SendCommand
- 功能描述 :向IDPMS发送Command,并获取返回消息
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :void
- **************************************************************************************************/
- int IDPMSComm::SendCommand(LPCTSTR szCommand, DMSResponse *&pRes, LPCTSTR szEndFlag)
- {
- CString szCmd(szCommand);
- CString szRes;
- int ilenSent = 0;
- char resBuff[IDPMS_MAX_SIZE]; // 应答缓冲区
- int iSizeRecevied = 0;
- IDCMParser *pIDCM = new IDCMParser();
- BOOL bCompleted = FALSE;
- //int iRcvTimes = 0;
- //int iRecMaxTimes = 5;
- int iLen = szCmd.GetLength()+1;
- if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
- {
- LOG::E(szCommand, _T("发送失败!"));
- return -1;
- }
-
- CString szLog;
- szLog.Format("发送:%s", szCmd);
- LOG::D(CString(szLog));
- // 循环接收数据,直到超时退出
- while (TRUE)
- {
- memset(resBuff, 0, IDPMS_MAX_SIZE);
- int iRet1 = m_pSocket->Recv(resBuff, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
- if (iRet1 == E_XSOCKET_SUCCESS)
- {
- // 处理接收数据
- return pIDCM->Parser(resBuff, pRes, szEndFlag);
- }
- else if (iRet1 == E_XSOCKET_TIMEDOUT)
- {
- continue;
- }
- else
- {
- LOG::E(szCmd.GetBuffer(), CString("处理错误"));
- return 0;
- }
- }
-
- return 0;
- }
- /**************************************************************************************************
- 函 数 名 :SendCommand
- 功能描述 :向IDPMS发送Command,并获取返回消息
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :略
- **************************************************************************************************/
- int IDPMSComm::SendCommand(LPCTSTR szCommand, DMSResponse *&pRes, int nMaxReplyPackages)
- {
- CString szCmd(szCommand);
- CString szRes;
- int ilenSent = 0;
- char resBuff[IDPMS_MAX_SIZE]; // 应答缓冲区
- int iSizeRecevied = 0;
- int iRet = 0;
- IDCMParser *parser = new IDCMParser();
- BOOL bCompleted = FALSE;
- int iReplayNum = 0;
- int iLen = szCmd.GetLength()+1;
- LOG::D(szCmd);
- if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
- {
- LOG::E(szCommand, _T("发送失败!"));
- return -1;
- }
- CString szLog;
- szLog.Format("发送:%s", szCmd);
- LOG::D(CString(szLog));
-
- // 循环接收数据,直到超时退出
- while (TRUE)
- {
- iReplayNum++;
- memset(resBuff, 0, IDPMS_MAX_SIZE);
- iRet = m_pSocket->Recv(resBuff, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
- if (iRet == E_XSOCKET_SUCCESS)
- {
- // 解析返回数据
- int iRet2 = parser->Parser(resBuff, pRes);
- if (iReplayNum >= nMaxReplyPackages) return 1;
- return iRet2;
- }
- else if (iRet == E_XSOCKET_TIMEDOUT)
- {
- // Time out, failed
- return 0;
- }
- else
- {
- LOG::E(szCmd.GetBuffer(), _T("处理错误"));
- return 0;
- }
- }
-
- return 0;
- }
- /**************************************************************************************************
- 函 数 名 :SendCommand
- 功能描述 :向IDPMS发送Command,并获取返回消息
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :void
- **************************************************************************************************/
- int IDPMSComm::SendDataCommand(LPCTSTR szCommand, DMSResponse *&pRes, void *pData)
- {
- CString szCmd(szCommand);
- CString szRes;
- int ilenSent = 0;
- char resBuff[IDPMS_MAX_SIZE]; // 应答缓冲区
- int iSizeRecevied = 0;
- BOOL bCompleted = FALSE;
- IDCMParser *parser = new IDCMParser();
- int iLen = szCmd.GetLength()+1;
- if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
- {
- LOG::E(szCommand, _T("发送失败!"));
- return -1;
- }
- CString szLog;
- szLog.Format("发送:%s", szCmd);
- LOG::D(CString(szLog));
- // 循环接收数据,直到超时退出
- while (TRUE)
- {
- memset(resBuff, 0, IDPMS_MAX_SIZE);
- int iRet1 = m_pSocket->Recv(resBuff, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
- if (iRet1 == E_XSOCKET_SUCCESS)
- {
- // 处理接收数据
- CString szLine(resBuff);
- if (szLine.FindOneOf(_T("IDPMS-CR:点发送开始")) > 0)
- {
- continue;
- }
- else if (szLine.FindOneOf(_T("IDPMS-CR:点发送结束")) > 0)
- {
- parser->ParseData(resBuff, pRes, pData);
- return 1;
- }
- else
- {
- parser->ParseData(resBuff, pRes, pData);
- }
- }
- else
- {
- LOG::E(szCmd.GetBuffer(), _T("处理错误"));
- return 0;
- }
- }
-
- return 0;
- }
- /**************************************************************************************************
- 函 数 名 :Send
- 功能描述 :向IDPMS发送Command,只发送
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :void
- **************************************************************************************************/
- BOOL IDPMSComm::Send(LPCTSTR szCommand)
- {
- CString szLog;
- szLog.Format("发送:%s", szCommand);
- LOG::D(CString(szLog));
- CString szCmd(szCommand);
- int ilenSent = 0;
- int iLen = szCmd.GetLength() + 1;
- if (m_pSocket->Send(szCmd.GetBuffer(), iLen, ilenSent, IDPMS_MAX_DURATION) != E_XSOCKET_SUCCESS)
- {
- LOG::E(szCommand, _T("发送失败!"));
- return FALSE;
- }
- return TRUE;
- }
- /**************************************************************************************************
- 函 数 名 :Send
- 功能描述 :向IDPMS发送Command,只发送
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :void
- **************************************************************************************************/
- BOOL IDPMSComm::Receive(char *pBuf)
- {
- int iSizeRecevied = 0;
- memset(pBuf, 0, IDPMS_MAX_SIZE);
- int iRet1 = m_pSocket->Recv(pBuf, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
- if (iRet1 != E_XSOCKET_SUCCESS)
- {
- LOG::E(_T("数据接收失败!"));
- return FALSE;
- }
- CString szCmd(pBuf);
- int iCmdSize = szCmd.GetLength();
- CString szLog(pBuf);
- szLog.Format("接收:%s", szCmd);
- LOG::D(CString(szLog));
- if (iSizeRecevied > iCmdSize + 1)
- {
- char* szTmp = pBuf + iCmdSize + 1;
- CString szLog(szTmp);
- }
- int iStart = szCmd.GetLength() + 2;
- return TRUE;
- }
- /**************************************************************************************************
- 函 数 名 :Send
- 功能描述 :向IDPMS发送Command,只发送
- 输入参数 :无
- 输出参数 :无
- 返 回 值 :void
- **************************************************************************************************/
- BOOL IDPMSComm::Receive(CStringArray &szDataArray)
- {
- char pBuf[IDPMS_MAX_SIZE];
- int iSizeRecevied = 0;
- memset(pBuf, 0, IDPMS_MAX_SIZE);
- int iRet1 = m_pSocket->Recv(pBuf, IDPMS_MAX_SIZE, iSizeRecevied, IDPMS_MAX_DURATION);
- if (iRet1 != E_XSOCKET_SUCCESS)
- {
- LOG::E(_T("数据接收失败!"));
- return FALSE;
- }
- CString szLog;
- szLog.Format("接收:%s", pBuf);
- LOG::D(CString(szLog));
- int iNum = 0;
- iNum = Utils::StrSplit(pBuf, iSizeRecevied, '\0', szDataArray);
- return TRUE;
- }
|