#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; }