#include "StdAfx.h" #include "NetworkIvr.h" #include "Config.h" #include "IvrCore.h" #include "MsgCenter.h" SINGLETON_IMPLEMENT(CNetworkIvr) CNetworkIvr::CNetworkIvr(void) : m_CtiDevID(0), m_IsCtiConnected(false) { } CNetworkIvr::~CNetworkIvr(void) { } /***************************************************************** **【函数名称】 init **【函数功能】 初始化 **【参数】 **【返回值】 ****************************************************************/ BOOL CNetworkIvr::init( void ) { // 初始化命令配置 auto pClient = CNetInterface::getNetInstance(); pClient->setLinkStateChanged(std::bind(&CNetworkIvr::OnLinkStateChanged, this, std::placeholders::_1)); pClient->setRecvCommand(std::bind(&CNetworkIvr::OnRecvCommand, this, std::placeholders::_1)); // 连接到CTI CString Ip = CConfig::ctiIp(); int Port = CConfig::ctiPort(); if (!pClient->CreatePduClient(Ip, Port, PDU_DEV_TYPE_IVR, 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 CNetworkIvr::release( void ) { CNetInterface::getNetInstance()->ClosePduClient(PDU_DEV_TYPE_IVR, 1); } /***************************************************************** **【函数名称】 Send **【函数功能】 发送消息 **【参数】 设备类型,命令内容 **【返回值】 ****************************************************************/ BOOL CNetworkIvr::send(CPduEntity& a_PduEntity) { if (!m_IsCtiConnected) return false; // 2022-11-24 添加if条件,判断pdu消息本端设备类型是否是cti,防止重复发送消息到cit if (a_PduEntity.GetIsExecReturn() && PDU_DEV_TYPE_CTI != a_PduEntity.GetLocalDevType()) CNetInterface::getNetInstance()->Send(&a_PduEntity, a_PduEntity.GetLocalDevType(), a_PduEntity.GetLocalDevId()); return CNetInterface::getNetInstance()->Send(&a_PduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID); } /***************************************************************** **【函数名称】 OnLinkStateChanged **【函数功能】 连接状态变化事件 **【参数】 linkContent 连接信息 **【返回值】 ****************************************************************/ void CNetworkIvr::OnLinkStateChanged( const PduLinkContent& linkContent ) { CString Msg; LOG_LEVEL Level = LOG_LEVEL_NORMAL; switch(linkContent.nLinkState) { case PDU_LINK_STATE_SUCCESSED: // 请求连接成功 Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接成功..."), linkContent.szFarIp, linkContent.nFarPort); break; case PDU_LINK_STATE_FAILED: // 请求连接失败 Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接失败..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_ERROR; break; case PDU_LINK_STATE_DISCONNECTED: // 连接已断开 { Msg.Format(_T("Far End[Ip = %s, Port = %d], Hint = 网络连接已断开..."), linkContent.szFarIp, linkContent.nFarPort); m_IsCtiConnected = false; CIvrCore::GetInstance().onNetLinkUpdated(false); Level = LOG_LEVEL_ERROR; } break; case PDU_LINK_STATE_REG_OK: // 注册成功 { Msg.Format(_T("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("Far End[Ip = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."), linkContent.szFarIp, linkContent.nFarPort); Level = LOG_LEVEL_ERROR; break; default: Msg.Format(_T("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, _T("%s"), Msg); } /***************************************************************** **【函数名称】 OnRecvCommand **【函数功能】 接收具体命令并进行处理 **【参数】 **【返回值】 ****************************************************************/ void CNetworkIvr::OnRecvCommand(CPduEntity* a_pPduEntity) { PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType(); // 注册命令返回以及心跳包不处理 if (Type == PDU_CMD_REG || 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); bool newCtiConnected = devList.Find(dev) < 0 ? false : true; CString Msg; LOG_LEVEL Level = LOG_LEVEL_NORMAL; if (!m_IsCtiConnected&&newCtiConnected) { m_IsCtiConnected = newCtiConnected; Msg.Format("[CTI]---已连接"); Level = LOG_LEVEL_NORMAL; ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, _T("%s"), Msg); CIvrCore::GetInstance().onNetLinkUpdated(m_IsCtiConnected); } else if (m_IsCtiConnected && !newCtiConnected) { m_IsCtiConnected = newCtiConnected; Msg.Format("[CTI]---连接断开"); Level = LOG_LEVEL_ERROR; ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, _T("%s"), Msg); CIvrCore::GetInstance().onNetLinkUpdated(m_IsCtiConnected); } } else { CPduEntity* pNewPdu = new CPduEntity(*a_pPduEntity); CMsgCenter::GetInstance().pushMsg(IVR_MSG_PDU_RECIVE, pNewPdu); } }