中间件底层,websocket

NetworkIvr.cpp 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "StdAfx.h"
  2. #include "NetworkIvr.h"
  3. #include "Config.h"
  4. #include "IvrCore.h"
  5. #include "MsgCenter.h"
  6. SINGLETON_IMPLEMENT(CNetworkIvr)
  7. CNetworkIvr::CNetworkIvr(void) : m_CtiDevID(0), m_IsCtiConnected(false)
  8. {
  9. }
  10. CNetworkIvr::~CNetworkIvr(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 init
  15. **【函数功能】 初始化
  16. **【参数】
  17. **【返回值】
  18. ****************************************************************/
  19. BOOL CNetworkIvr::init( void )
  20. {
  21. // 初始化命令配置
  22. auto pClient = CNetInterface::getNetInstance();
  23. pClient->setLinkStateChanged(std::bind(&CNetworkIvr::OnLinkStateChanged, this, std::placeholders::_1));
  24. pClient->setRecvCommand(std::bind(&CNetworkIvr::OnRecvCommand, this, std::placeholders::_1));
  25. // 连接到CTI
  26. CString Ip = CConfig::ctiIp();
  27. int Port = CConfig::ctiPort();
  28. if (!pClient->CreatePduClient(Ip, Port, PDU_DEV_TYPE_IVR, 1, true))
  29. {
  30. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接ws服务器[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port);
  31. return false;
  32. } // end if
  33. return TRUE;
  34. }
  35. /*****************************************************************
  36. **【函数名称】 release
  37. **【函数功能】 连接释放
  38. **【参数】
  39. **【返回值】
  40. ****************************************************************/
  41. void CNetworkIvr::release( void )
  42. {
  43. CNetInterface::getNetInstance()->ClosePduClient(PDU_DEV_TYPE_IVR, 1);
  44. }
  45. /*****************************************************************
  46. **【函数名称】 Send
  47. **【函数功能】 发送消息
  48. **【参数】 设备类型,命令内容
  49. **【返回值】
  50. ****************************************************************/
  51. BOOL CNetworkIvr::send(CPduEntity& a_PduEntity)
  52. {
  53. if (!m_IsCtiConnected)
  54. return false;
  55. // 2022-11-24 添加if条件,判断pdu消息本端设备类型是否是cti,防止重复发送消息到cit
  56. if (a_PduEntity.GetIsExecReturn() && PDU_DEV_TYPE_CTI != a_PduEntity.GetLocalDevType())
  57. CNetInterface::getNetInstance()->Send(&a_PduEntity, a_PduEntity.GetLocalDevType(), a_PduEntity.GetLocalDevId());
  58. return CNetInterface::getNetInstance()->Send(&a_PduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID);
  59. }
  60. /*****************************************************************
  61. **【函数名称】 OnLinkStateChanged
  62. **【函数功能】 连接状态变化事件
  63. **【参数】 linkContent 连接信息
  64. **【返回值】
  65. ****************************************************************/
  66. void CNetworkIvr::OnLinkStateChanged( const PduLinkContent& linkContent )
  67. {
  68. CString Msg;
  69. LOG_LEVEL Level = LOG_LEVEL_NORMAL;
  70. switch(linkContent.nLinkState)
  71. {
  72. case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
  73. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接成功..."),
  74. linkContent.szFarIp,
  75. linkContent.nFarPort);
  76. break;
  77. case PDU_LINK_STATE_FAILED: // 请求连接失败
  78. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接失败..."),
  79. linkContent.szFarIp,
  80. linkContent.nFarPort);
  81. Level = LOG_LEVEL_ERROR;
  82. break;
  83. case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
  84. {
  85. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接已断开..."),
  86. linkContent.szFarIp,
  87. linkContent.nFarPort);
  88. m_IsCtiConnected = false;
  89. CIvrCore::GetInstance().onNetLinkUpdated(false);
  90. Level = LOG_LEVEL_ERROR;
  91. }
  92. break;
  93. case PDU_LINK_STATE_REG_OK: // 注册成功
  94. {
  95. Msg.Format(_T("Far End[Type = %d, Id = %d, Ip = %s, Port = %d], Hint = 网络连接注册成功..."),
  96. linkContent.nFarType,
  97. linkContent.nFarId,
  98. linkContent.szFarIp,
  99. linkContent.nFarPort);
  100. }
  101. break;
  102. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  103. Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."),
  104. linkContent.szFarIp,
  105. linkContent.nFarPort);
  106. Level = LOG_LEVEL_ERROR;
  107. break;
  108. default:
  109. Msg.Format(_T("Far End[Type = %d, Id = %d, Ip = %s, Port = %d]"),
  110. linkContent.nFarType,
  111. linkContent.nFarId,
  112. linkContent.szFarIp,
  113. linkContent.nFarPort);
  114. break;
  115. } // end switch
  116. ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, _T("%s"), Msg);
  117. }
  118. /*****************************************************************
  119. **【函数名称】 OnRecvCommand
  120. **【函数功能】 接收具体命令并进行处理
  121. **【参数】
  122. **【返回值】
  123. ****************************************************************/
  124. void CNetworkIvr::OnRecvCommand(CPduEntity* a_pPduEntity)
  125. {
  126. PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType();
  127. // 注册命令返回以及心跳包不处理
  128. if (Type == PDU_CMD_REG || Type == PDU_CMD_LISTEN) {
  129. return;
  130. }
  131. else if (PDU_CMD_DEV_ONLINE_LIST == Type) {
  132. auto devList = a_pPduEntity->GetDataString(0);
  133. CString dev;
  134. dev.Format("|%d|", PDU_DEV_TYPE_CTI);
  135. bool newCtiConnected = devList.Find(dev) < 0 ? false : true;
  136. CString Msg;
  137. LOG_LEVEL Level = LOG_LEVEL_NORMAL;
  138. if (!m_IsCtiConnected&&newCtiConnected) {
  139. m_IsCtiConnected = newCtiConnected;
  140. Msg.Format("[CTI]---已连接");
  141. Level = LOG_LEVEL_NORMAL;
  142. ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, _T("%s"), Msg);
  143. CIvrCore::GetInstance().onNetLinkUpdated(m_IsCtiConnected);
  144. }
  145. else if (m_IsCtiConnected && !newCtiConnected) {
  146. m_IsCtiConnected = newCtiConnected;
  147. Msg.Format("[CTI]---连接断开");
  148. Level = LOG_LEVEL_ERROR;
  149. ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, _T("%s"), Msg);
  150. CIvrCore::GetInstance().onNetLinkUpdated(m_IsCtiConnected);
  151. }
  152. }
  153. else {
  154. CPduEntity* pNewPdu = new CPduEntity(*a_pPduEntity);
  155. CMsgCenter::GetInstance().pushMsg(IVR_MSG_PDU_RECIVE, pNewPdu);
  156. }
  157. }