#include "StdAfx.h" #include "NetworkAcd.h" #include "AcdCore.h" #include "Config.h" #include "./ACD.h" SINGLETON_IMPLEMENT(CNetworkAcd) CNetworkAcd::CNetworkAcd(void) : m_CtiDevID(0), m_IsCtiConnected(false), m_IsHpServerConnected(false) { } CNetworkAcd::~CNetworkAcd(void) { } /***************************************************************** **【函数名称】 OnLinkStateChanged **【函数功能】 PDU连接状态变化事件处理(重载函数) **【参数】 **【返回值】 ****************************************************************/ void CNetworkAcd::OnLinkStateChanged( const PduLinkContent& linkContent ) { CString Msg; LOG_LEVEL Level = LOG_LEVEL_NORMAL; switch (linkContent.nLinkState) { case PDU_LINK_STATE_SUCCESSED: // 请求连接成功 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接成功..."), linkContent.szFarIp, linkContent.nFarPort); break; case PDU_LINK_STATE_FAILED: // 请求连接失败 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接失败..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_ERROR; break; case PDU_LINK_STATE_ACCEPTED: // 已接受对端连接 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 已接受远端网络连接..."), linkContent.szFarIp, linkContent.nFarPort); break; case PDU_LINK_STATE_DISCONNECTED: // 连接已断开 { Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接已断开..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_ERROR; m_IsCtiConnected = false; m_IsHpServerConnected = false; CAcdCore::GetInstance().onNetCtiLinkDown(); // 2022-11-03 CAcdCore::GetInstance().onNetHpServerLinkDown(); } break; case PDU_LINK_STATE_REG_OK: // 注册成功 { Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d], Hint = 网络连接注册成功..."), linkContent.nFarType, linkContent.nFarId, linkContent.szFarIp, linkContent.nFarPort); } break; case PDU_LINK_STATE_REG_FAILED: // 注册失败 Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_ERROR; break; default: Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d]"), linkContent.nFarType, linkContent.nFarId, linkContent.szFarIp, linkContent.nFarPort); break; } // end switch ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, "%s", Msg); } /***************************************************************** **【函数名称】 OnRecvCommand **【函数功能】 接收具体命令并进行处理 **【参数】 **【返回值】 ****************************************************************/ void CNetworkAcd::OnRecvCommand( CPduEntity* a_pPduEntity ) { PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType(); // 心跳包不处理 if (Type == PDU_CMD_LISTEN) { return; } else if (PDU_CMD_DEV_ONLINE_LIST == Type) { auto devList = a_pPduEntity->GetDataString(0); CString dev; dev.Format("|%d|", PDU_DEV_TYPE_CTI); auto newCtiConnected = devList.Find(dev) < 0 ? false : true; dev.Format("|%d|", PDU_DEV_TYPE_SERVER); auto newHttpServer = devList.Find(dev) < 0 ? false : true; if (m_IsCtiConnected && !newCtiConnected) { // cti连接断开 m_IsCtiConnected = newCtiConnected; ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, "[CTI]---连接断开"); CAcdCore::GetInstance().onNetCtiLinkDown(); pushCtiState(m_IsCtiConnected); } else if (!m_IsCtiConnected && newCtiConnected) { m_IsCtiConnected = newCtiConnected; ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "[CTI]---已连接"); pushCtiState(m_IsCtiConnected); } if (m_IsHpServerConnected && !newHttpServer) { // HpServer连接断开 m_IsHpServerConnected = newHttpServer; ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR , "[HpServer]---连接断开"); CAcdCore::GetInstance().onNetHpServerLinkDown(); } else if (!m_IsHpServerConnected && newHttpServer) { m_IsHpServerConnected = newHttpServer; ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "[HpServer]---已连接"); } } else { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "CNetworkAcd,PduCmdType=%d", a_pPduEntity->GetCmdType()); CAcdCore::GetInstance().onRecvCommand(a_pPduEntity); } } /***************************************************************** **【函数名称】 init **【函数功能】 初始化 **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::init( void ) { // 初始化命令配置 auto pClient = CNetInterface::getNetInstance(); pClient->setLinkStateChanged(std::bind(&CNetworkAcd::OnLinkStateChanged, this, std::placeholders::_1)); pClient->setRecvCommand(std::bind(&CNetworkAcd::OnRecvCommand, this, std::placeholders::_1)); // 连接到CTI CString Ip = CConfig::ctiIp(); int Port = CConfig::ctiPort(); if(!pClient->CreatePduClient(Ip, Port, PDU_DEV_TYPE_ACD, 1, true)) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接ws服务器[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port); return false; } // end if return true; } /***************************************************************** **【函数名称】 release **【函数功能】 连接释放 **【参数】 **【返回值】 ****************************************************************/ void CNetworkAcd::release( void ) { CNetInterface::getNetInstance()->ClosePduClient(PDU_DEV_TYPE_ACD,1); } /***************************************************************** **【函数名称】 send2Cti **【函数功能】 发送PDU到CTI **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::send2Cti( CPduEntity* a_pPduEntity ) { if(!m_IsCtiConnected) return false; return CNetInterface::getNetInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID) == TRUE; } /***************************************************************** **【函数名称】 send2Agent **【函数功能】 发送PDU到Agent **【参数】 **【返回值】 ****************************************************************/ bool CNetworkAcd::send2Agent( int a_AgentId, CPduEntity* a_pPduEntity ) { return CNetInterface::getNetInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE; } /***************************************************************** **【函数名称】 getAgentLinkInfo **【函数功能】 获取Agent连接信息 **【参数】 **【返回值】 ****************************************************************/ //bool CNetworkAcd::getAgentLinkInfo( int a_AgentId, CString& a_AgentIp, int& a_AgentPort ) //{ // return CNetInterface::getNetInstance()->GetLinkInfo(a_AgentIp, a_AgentPort, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE; //} /***************************************************************** **【函数名称】 shutDownAgentLink **【函数功能】 关闭Agent连接 **【参数】 **【返回值】 ****************************************************************/ //bool CNetworkAcd::shutDownAgentLink( int a_AgentId ) //{ // return CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE; //} /***************************************************************** **【函数名称】 getPduSource **【函数功能】 获取PDU来源 **【参数】 **【返回值】 ****************************************************************/ //bool CNetworkAcd::getPduSource( CPduEntity* a_pCmd, CString& a_SourceIp ) //{ // return CInterfaceWindow::getIocpLinkInstance()->GetPeerIp(a_SourceIp, a_pCmd) == TRUE; //} bool CNetworkAcd::send2Server( CPduEntity* a_pPduEntity ) { return CNetInterface::getNetInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_SERVER,0) == TRUE; }