中间件底层,websocket

NetworkClient.cpp 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include "StdAfx.h"
  2. #include "NetworkClient.h"
  3. #include "TransCodeToString.h"
  4. #include "../Logger/Logger.h"
  5. SINGLETON_IMPLEMENT(CNetworkClient)
  6. CNetworkClient::CNetworkClient(void) : m_AcdDevID(0), m_IsAcdConnected(false), m_acdRecvMsgFun(nullptr)
  7. {
  8. }
  9. CNetworkClient::~CNetworkClient(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 OnLinkStateChanged
  14. **【函数功能】 PDU连接状态变化事件处理(重载函数)
  15. **【参数】
  16. **【返回值】
  17. ****************************************************************/
  18. void CNetworkClient::OnLinkStateChanged(const PduLinkContent& linkContent)
  19. {
  20. CString Msg;
  21. LOG_LEVEL Level = LOG_LEVEL_NORMAL;
  22. switch (linkContent.nLinkState)
  23. {
  24. case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
  25. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接成功..."),
  26. linkContent.szFarIp,
  27. linkContent.nFarPort);
  28. break;
  29. case PDU_LINK_STATE_FAILED: // 请求连接失败
  30. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接失败..."),
  31. linkContent.szFarIp,
  32. linkContent.nFarPort);
  33. Level = LOG_LEVEL_ERROR;
  34. break;
  35. case PDU_LINK_STATE_ACCEPTED: // 已接受对端连接
  36. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 已接受远端网络连接..."),
  37. linkContent.szFarIp,
  38. linkContent.nFarPort);
  39. break;
  40. case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
  41. {
  42. m_IsAcdConnected = false;
  43. m_IsCtiConnected = false;
  44. Msg.Format(_T("{Net}: Far End[Type=%d,IP = %s, Port = %d,AcdConnect=%d], Hint = 网络连接已断开..."),
  45. linkContent.nFarType,
  46. linkContent.szFarIp,
  47. linkContent.nFarPort,
  48. m_IsAcdConnected);
  49. Level = LOG_LEVEL_ERROR;
  50. }
  51. break;
  52. case PDU_LINK_STATE_REG_OK: // 注册成功
  53. {
  54. Msg.Format(_T("{Net}:Far End[Type=%d,ID =%d,IP=%s,Port= %d]注册成功"),
  55. linkContent.nFarType,
  56. linkContent.nFarId,
  57. linkContent.szFarIp,
  58. linkContent.nFarPort);
  59. }
  60. break;
  61. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  62. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."),
  63. linkContent.szFarIp,
  64. linkContent.nFarPort);
  65. Level = LOG_LEVEL_ERROR;
  66. break;
  67. default:
  68. Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d]"),
  69. linkContent.nFarType,
  70. linkContent.nFarId,
  71. linkContent.szFarIp,
  72. linkContent.nFarPort);
  73. break;
  74. } // end switch
  75. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, Msg.GetBuffer(0));
  76. Msg.ReleaseBuffer();
  77. }
  78. /*****************************************************************
  79. **【函数名称】 OnRecvCommand
  80. **【函数功能】 接收具体命令并进行处理
  81. **【参数】
  82. **【返回值】
  83. ****************************************************************/
  84. void CNetworkClient::OnRecvCommand(CPduEntity* a_pPduEntity)
  85. {
  86. PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType();
  87. if (Type == PDU_CMD_LISTEN || PDU_CMD_REG == Type) return;
  88. else if (PDU_CMD_DEV_ONLINE_LIST == Type) {
  89. auto devList = a_pPduEntity->GetDataString(0);
  90. CString dev;
  91. dev.Format("|%d|", PDU_DEV_TYPE_CTI);
  92. auto newCtiConnected = devList.Find(dev) < 0 ? false : true;
  93. dev.Format("|%d|", PDU_DEV_TYPE_ACD);
  94. auto newAcdConnected = devList.Find(dev) < 0 ? false : true;
  95. bool isAutoConn = false; // cti,acd是否刚好两个都连接,达到条件可以自动签入
  96. if (m_IsAcdConnected && !newAcdConnected) { // ACD 连接断开
  97. m_IsAcdConnected = newAcdConnected;
  98. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, "[ACD]---连接断开");
  99. }
  100. else if (!m_IsAcdConnected && newAcdConnected) { // ACD 连接
  101. m_IsAcdConnected = newAcdConnected;
  102. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "[ACD]---已连接");
  103. isAutoConn = newCtiConnected;
  104. }
  105. if (m_IsCtiConnected && !newCtiConnected) { // CTI 连接断开
  106. m_IsCtiConnected = newCtiConnected;
  107. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, "[CTI]---连接断开");
  108. }
  109. else if (!m_IsCtiConnected && newCtiConnected) { // CTI 连接
  110. m_IsCtiConnected = newCtiConnected;
  111. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "[CTI]---已连接");
  112. isAutoConn = m_IsAcdConnected;
  113. }
  114. if (isAutoConn && this->m_acdRecvMsgFun != nullptr) {
  115. this->m_acdRecvMsgFun(a_pPduEntity);
  116. }
  117. }
  118. else {
  119. CString strCMD = TransCodeToString(Type);
  120. CString strShow;
  121. strShow.Format("ACD->SERVER : 收到【 %s 】结果 即将转发至坐席", strCMD);
  122. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, strShow.GetBuffer(0));
  123. if (this->m_acdRecvMsgFun != nullptr) {
  124. this->m_acdRecvMsgFun(a_pPduEntity);
  125. }
  126. }
  127. }
  128. /*****************************************************************
  129. **【函数名称】 init
  130. **【函数功能】 初始化
  131. **【参数】
  132. **【返回值】
  133. ****************************************************************/
  134. bool CNetworkClient::init(void)
  135. {
  136. // 初始化命令配置
  137. auto pClient = CNetInterface::getNetInstance();
  138. pClient->setLinkStateChanged(std::bind(&CNetworkClient::OnLinkStateChanged, this, std::placeholders::_1));
  139. pClient->setRecvCommand(std::bind(&CNetworkClient::OnRecvCommand, this, std::placeholders::_1));
  140. CString Ip = "127.0.0.1";
  141. int Port = 8811;
  142. #ifdef ISUSEDYAMLCONFIG
  143. Ip.Format("%s", YamlConfig::GetInstance()->GetWsServerIP().c_str());
  144. Port = YamlConfig::GetInstance()->GetWsServerPort();
  145. #endif // !ISUSEDYAMLCONFIG
  146. if (!pClient->CreatePduClient(Ip, Port, PDU_DEV_TYPE_SERVER, 0, true))
  147. {
  148. ::MessageBoxA(NULL, "Link To wsServer Failed", "ERROR", 0);
  149. ::SendMessageA(hwndd, WM_CLOSE, NULL, NULL);
  150. return false;
  151. } // end if
  152. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "服务端与wsServer建立连接,注册中....");
  153. return true;
  154. }
  155. /*****************************************************************
  156. **【函数名称】 release
  157. **【函数功能】 连接释放
  158. **【参数】
  159. **【返回值】
  160. ****************************************************************/
  161. void CNetworkClient::release(void)
  162. {
  163. CNetInterface::getNetInstance()->ClosePduClient(PDU_DEV_TYPE_SERVER, 0);
  164. }
  165. /*****************************************************************
  166. **【函数名称】 send2Cti
  167. **【函数功能】 发送PDU到CTI
  168. **【参数】
  169. **【返回值】
  170. ****************************************************************/
  171. bool CNetworkClient::send2ACD(CPduEntity* a_pPduEntity)
  172. {
  173. BOOL bOk = CNetInterface::getNetInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_ACD, m_AcdDevID);
  174. PDU_CMD_TYPE type = a_pPduEntity->GetCmdType();
  175. CString strCMD = TransCodeToString(type);
  176. // char szCurrentDateTime[32];
  177. // CTime nowtime;
  178. // nowtime = CTime::GetCurrentTime();
  179. //
  180. // sprintf(szCurrentDateTime, "%4d-%.2d-%.2d %.2d:%.2d:%.2d",
  181. // nowtime.GetYear(), nowtime.GetMonth(), nowtime.GetDay(),
  182. // nowtime.GetHour(), nowtime.GetMinute(), nowtime.GetSecond());
  183. int t_agent_id = a_pPduEntity->GetDataUInt(2);
  184. CString strShow;
  185. strShow.Format("SERVER->ACD [%d]: 向ACD发送【 %s 】命令,%d,Agent=%d", bOk, strCMD, m_AcdDevID, t_agent_id);
  186. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  187. return bOk;
  188. }