中间件底层,websocket

NetworkAcd.cpp 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #include "StdAfx.h"
  2. #include "NetworkAcd.h"
  3. #include "AcdCore.h"
  4. #include "Config.h"
  5. #include "./ACD.h"
  6. SINGLETON_IMPLEMENT(CNetworkAcd)
  7. CNetworkAcd::CNetworkAcd(void) : m_CtiDevID(0), m_IsCtiConnected(false), m_IsHpServerConnected(false)
  8. {
  9. }
  10. CNetworkAcd::~CNetworkAcd(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 OnLinkStateChanged
  15. **【函数功能】 PDU连接状态变化事件处理(重载函数)
  16. **【参数】
  17. **【返回值】
  18. ****************************************************************/
  19. void CNetworkAcd::OnLinkStateChanged( const PduLinkContent& linkContent )
  20. {
  21. CString Msg;
  22. LOG_LEVEL Level = LOG_LEVEL_NORMAL;
  23. switch (linkContent.nLinkState)
  24. {
  25. case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
  26. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接成功..."),
  27. linkContent.szFarIp,
  28. linkContent.nFarPort);
  29. break;
  30. case PDU_LINK_STATE_FAILED: // 请求连接失败
  31. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接失败..."),
  32. linkContent.szFarIp,
  33. linkContent.nFarPort);
  34. Level = LOG_LEVEL_ERROR;
  35. break;
  36. case PDU_LINK_STATE_ACCEPTED: // 已接受对端连接
  37. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 已接受远端网络连接..."),
  38. linkContent.szFarIp,
  39. linkContent.nFarPort);
  40. break;
  41. case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
  42. {
  43. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接已断开..."),
  44. linkContent.szFarIp,
  45. linkContent.nFarPort);
  46. Level = LOG_LEVEL_ERROR;
  47. m_IsCtiConnected = false;
  48. m_IsHpServerConnected = false;
  49. CAcdCore::GetInstance().onNetCtiLinkDown(); // 2022-11-03
  50. CAcdCore::GetInstance().onNetHpServerLinkDown();
  51. }
  52. break;
  53. case PDU_LINK_STATE_REG_OK: // 注册成功
  54. {
  55. Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d], Hint = 网络连接注册成功..."),
  56. linkContent.nFarType,
  57. linkContent.nFarId,
  58. linkContent.szFarIp,
  59. linkContent.nFarPort);
  60. }
  61. break;
  62. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  63. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."),
  64. linkContent.szFarIp,
  65. linkContent.nFarPort);
  66. Level = LOG_LEVEL_ERROR;
  67. break;
  68. default:
  69. Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d]"),
  70. linkContent.nFarType,
  71. linkContent.nFarId,
  72. linkContent.szFarIp,
  73. linkContent.nFarPort);
  74. break;
  75. } // end switch
  76. ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, "%s", Msg);
  77. }
  78. /*****************************************************************
  79. **【函数名称】 OnRecvCommand
  80. **【函数功能】 接收具体命令并进行处理
  81. **【参数】
  82. **【返回值】
  83. ****************************************************************/
  84. void CNetworkAcd::OnRecvCommand( CPduEntity* a_pPduEntity )
  85. {
  86. PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType();
  87. // 心跳包不处理
  88. if (Type == PDU_CMD_LISTEN) {
  89. return;
  90. }
  91. else if (PDU_CMD_DEV_ONLINE_LIST == Type) {
  92. auto devList = a_pPduEntity->GetDataString(0);
  93. CString dev;
  94. dev.Format("|%d|", PDU_DEV_TYPE_CTI);
  95. auto newCtiConnected = devList.Find(dev) < 0 ? false : true;
  96. dev.Format("|%d|", PDU_DEV_TYPE_SERVER);
  97. auto newHttpServer = devList.Find(dev) < 0 ? false : true;
  98. if (m_IsCtiConnected && !newCtiConnected) { // cti连接断开
  99. m_IsCtiConnected = newCtiConnected;
  100. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, "[CTI]---连接断开");
  101. CAcdCore::GetInstance().onNetCtiLinkDown();
  102. pushCtiState(m_IsCtiConnected);
  103. }
  104. else if (!m_IsCtiConnected && newCtiConnected) {
  105. m_IsCtiConnected = newCtiConnected;
  106. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "[CTI]---已连接");
  107. pushCtiState(m_IsCtiConnected);
  108. }
  109. if (m_IsHpServerConnected && !newHttpServer) { // HpServer连接断开
  110. m_IsHpServerConnected = newHttpServer;
  111. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR , "[HpServer]---连接断开");
  112. CAcdCore::GetInstance().onNetHpServerLinkDown();
  113. }
  114. else if (!m_IsHpServerConnected && newHttpServer) {
  115. m_IsHpServerConnected = newHttpServer;
  116. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "[HpServer]---已连接");
  117. }
  118. }
  119. else {
  120. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "CNetworkAcd,PduCmdType=%d", a_pPduEntity->GetCmdType());
  121. CAcdCore::GetInstance().onRecvCommand(a_pPduEntity);
  122. }
  123. }
  124. /*****************************************************************
  125. **【函数名称】 init
  126. **【函数功能】 初始化
  127. **【参数】
  128. **【返回值】
  129. ****************************************************************/
  130. bool CNetworkAcd::init( void )
  131. {
  132. // 初始化命令配置
  133. auto pClient = CNetInterface::getNetInstance();
  134. pClient->setLinkStateChanged(std::bind(&CNetworkAcd::OnLinkStateChanged, this, std::placeholders::_1));
  135. pClient->setRecvCommand(std::bind(&CNetworkAcd::OnRecvCommand, this, std::placeholders::_1));
  136. // 连接到CTI
  137. CString Ip = CConfig::ctiIp();
  138. int Port = CConfig::ctiPort();
  139. if(!pClient->CreatePduClient(Ip, Port, PDU_DEV_TYPE_ACD, 1, true))
  140. {
  141. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接ws服务器[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port);
  142. return false;
  143. } // end if
  144. return true;
  145. }
  146. /*****************************************************************
  147. **【函数名称】 release
  148. **【函数功能】 连接释放
  149. **【参数】
  150. **【返回值】
  151. ****************************************************************/
  152. void CNetworkAcd::release( void )
  153. {
  154. CNetInterface::getNetInstance()->ClosePduClient(PDU_DEV_TYPE_ACD,1);
  155. }
  156. /*****************************************************************
  157. **【函数名称】 send2Cti
  158. **【函数功能】 发送PDU到CTI
  159. **【参数】
  160. **【返回值】
  161. ****************************************************************/
  162. bool CNetworkAcd::send2Cti( CPduEntity* a_pPduEntity )
  163. {
  164. if(!m_IsCtiConnected)
  165. return false;
  166. return CNetInterface::getNetInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID) == TRUE;
  167. }
  168. /*****************************************************************
  169. **【函数名称】 send2Agent
  170. **【函数功能】 发送PDU到Agent
  171. **【参数】
  172. **【返回值】
  173. ****************************************************************/
  174. bool CNetworkAcd::send2Agent( int a_AgentId, CPduEntity* a_pPduEntity )
  175. {
  176. return CNetInterface::getNetInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  177. }
  178. /*****************************************************************
  179. **【函数名称】 getAgentLinkInfo
  180. **【函数功能】 获取Agent连接信息
  181. **【参数】
  182. **【返回值】
  183. ****************************************************************/
  184. //bool CNetworkAcd::getAgentLinkInfo( int a_AgentId, CString& a_AgentIp, int& a_AgentPort )
  185. //{
  186. // return CNetInterface::getNetInstance()->GetLinkInfo(a_AgentIp, a_AgentPort, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  187. //}
  188. /*****************************************************************
  189. **【函数名称】 shutDownAgentLink
  190. **【函数功能】 关闭Agent连接
  191. **【参数】
  192. **【返回值】
  193. ****************************************************************/
  194. //bool CNetworkAcd::shutDownAgentLink( int a_AgentId )
  195. //{
  196. // return CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  197. //}
  198. /*****************************************************************
  199. **【函数名称】 getPduSource
  200. **【函数功能】 获取PDU来源
  201. **【参数】
  202. **【返回值】
  203. ****************************************************************/
  204. //bool CNetworkAcd::getPduSource( CPduEntity* a_pCmd, CString& a_SourceIp )
  205. //{
  206. // return CInterfaceWindow::getIocpLinkInstance()->GetPeerIp(a_SourceIp, a_pCmd) == TRUE;
  207. //}
  208. bool CNetworkAcd::send2Server( CPduEntity* a_pPduEntity )
  209. {
  210. return CNetInterface::getNetInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_SERVER,0) == TRUE;
  211. }