Ei kuvausta

NetworkAcd.cpp 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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)
  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_WARNING;
  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. if (linkContent.nFarType == PDU_DEV_TYPE_CTI)
  47. m_IsCtiConnected = false;
  48. CAcdCore::GetInstance().onNetLinkDown(linkContent); // 后续处理
  49. // 2022-08-10 acd连接断开,提醒cti是否正常运行
  50. if (linkContent.nFarType == PDU_DEV_TYPE_CTI)
  51. CWarningPush::getInstance()->pushInfo2DingDing("ACD连接断开,请检查CTI是否正常");
  52. }
  53. break;
  54. case PDU_LINK_STATE_REG_OK: // 注册成功
  55. {
  56. Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d], Hint = 网络连接注册成功..."),
  57. linkContent.nFarType,
  58. linkContent.nFarId,
  59. linkContent.szFarIp,
  60. linkContent.nFarPort);
  61. if(linkContent.nFarType == PDU_DEV_TYPE_CTI)
  62. {
  63. m_IsCtiConnected = true;
  64. m_CtiDevID = linkContent.nFarId;
  65. }
  66. }
  67. break;
  68. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  69. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."),
  70. linkContent.szFarIp,
  71. linkContent.nFarPort);
  72. Level = LOG_LEVEL_WARNING;
  73. break;
  74. default:
  75. Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d]"),
  76. linkContent.nFarType,
  77. linkContent.nFarId,
  78. linkContent.szFarIp,
  79. linkContent.nFarPort);
  80. break;
  81. } // end switch
  82. // 2022-09-13 保存cti连接状态
  83. pushCtiState(m_IsCtiConnected);
  84. ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, "%s", Msg);
  85. }
  86. /*****************************************************************
  87. **【函数名称】 OnRecvCommand
  88. **【函数功能】 接收具体命令并进行处理
  89. **【参数】
  90. **【返回值】
  91. ****************************************************************/
  92. void CNetworkAcd::OnRecvCommand( CPduEntity* a_pPduEntity )
  93. {
  94. PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType();
  95. CWarningPush::getInstance()->heartMonitor(a_pPduEntity->GetLocalDevType(), a_pPduEntity->GetPeerDevType());
  96. // 心跳包不处理
  97. if (Type == PDU_CMD_LISTEN)
  98. {
  99. return;
  100. }
  101. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "CNetworkAcd,PduCmdType=%d", a_pPduEntity->GetCmdType());
  102. CAcdCore::GetInstance().onRecvCommand(a_pPduEntity);
  103. }
  104. /*****************************************************************
  105. **【函数名称】 init
  106. **【函数功能】 初始化
  107. **【参数】
  108. **【返回值】
  109. ****************************************************************/
  110. bool CNetworkAcd::init( void )
  111. {
  112. // 初始化命令配置
  113. #ifdef _DEBUG
  114. CPduDataFormat::getInstance()->Load("../NetLib/PDUFormat.ini");
  115. #else
  116. CPduDataFormat::getInstance()->Load("./PDUFormat.ini");
  117. #endif
  118. // 注册事件响应接口
  119. CInterfaceWindow::getIocpLinkInstance()->RegistPduLinkProc(this, TRUE);
  120. CInterfaceWindow::getIocpCommInstance()->RegistPduCommProc(this, TRUE);
  121. // 连接到CTI
  122. CString Ip = CConfig::ctiIp();
  123. int Port = CConfig::ctiPort();
  124. // 创建SOCKET SERVER
  125. int ListenPort = CConfig::listenPort();
  126. if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduServer(ListenPort, PDU_DEV_TYPE_ACD, 0))
  127. {
  128. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 创建网络服务端失败, ListenPort = %d"), ListenPort);
  129. return false;
  130. }
  131. if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduClient(Ip, Port, PDU_DEV_TYPE_ACD, 0, PDU_DEV_TYPE_CTI, 0, true))
  132. {
  133. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port);
  134. return false;
  135. } // end if
  136. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Net}: 创建网络服务端成功, ListenPort = %d"), ListenPort);
  137. return true;
  138. }
  139. /*****************************************************************
  140. **【函数名称】 release
  141. **【函数功能】 连接释放
  142. **【参数】
  143. **【返回值】
  144. ****************************************************************/
  145. void CNetworkAcd::release( void )
  146. {
  147. CInterfaceWindow::getIocpLinkInstance()->StopAll();
  148. }
  149. /*****************************************************************
  150. **【函数名称】 send2Cti
  151. **【函数功能】 发送PDU到CTI
  152. **【参数】
  153. **【返回值】
  154. ****************************************************************/
  155. bool CNetworkAcd::send2Cti( CPduEntity* a_pPduEntity )
  156. {
  157. if(!m_IsCtiConnected)
  158. return false;
  159. CSingleLock Lock(&m_Lock4CTi, TRUE);
  160. return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID) == TRUE;
  161. }
  162. /*****************************************************************
  163. **【函数名称】 send2Agent
  164. **【函数功能】 发送PDU到Agent
  165. **【参数】
  166. **【返回值】
  167. ****************************************************************/
  168. bool CNetworkAcd::send2Agent( int a_AgentId, CPduEntity* a_pPduEntity )
  169. {
  170. return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  171. }
  172. /*****************************************************************
  173. **【函数名称】 getAgentLinkInfo
  174. **【函数功能】 获取Agent连接信息
  175. **【参数】
  176. **【返回值】
  177. ****************************************************************/
  178. bool CNetworkAcd::getAgentLinkInfo( int a_AgentId, CString& a_AgentIp, int& a_AgentPort )
  179. {
  180. return CInterfaceWindow::getIocpLinkInstance()->GetLinkInfo(a_AgentIp, a_AgentPort, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  181. }
  182. /*****************************************************************
  183. **【函数名称】 shutDownAgentLink
  184. **【函数功能】 关闭Agent连接
  185. **【参数】
  186. **【返回值】
  187. ****************************************************************/
  188. bool CNetworkAcd::shutDownAgentLink( int a_AgentId )
  189. {
  190. return CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  191. }
  192. /*****************************************************************
  193. **【函数名称】 getPduSource
  194. **【函数功能】 获取PDU来源
  195. **【参数】
  196. **【返回值】
  197. ****************************************************************/
  198. bool CNetworkAcd::getPduSource( CPduEntity* a_pCmd, CString& a_SourceIp )
  199. {
  200. return CInterfaceWindow::getIocpLinkInstance()->GetPeerIp(a_SourceIp, a_pCmd) == TRUE;
  201. }
  202. bool CNetworkAcd::send2Server( CPduEntity* a_pPduEntity )
  203. {
  204. return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_SERVER,0) == TRUE;
  205. }