#include "StdAfx.h" #include "NetworkVs.h" #include "DeviceMgr.h" #include "Config.h" SINGLETON_IMPLEMENT(CNetworkVs) CNetworkVs::CNetworkVs(void) { } CNetworkVs::~CNetworkVs(void) { } /***************************************************************** **【函数名称】 __onDisconnect **【函数功能】 连接断开处理 **【参数】 **【返回值】 ****************************************************************/ void CNetworkVs::__onDisconnect() { CDeviceMgr::GetInstance().hangupAllLine(); } /***************************************************************** **【函数名称】 init **【函数功能】 初始化连接 **【参数】 **【返回值】 ****************************************************************/ bool CNetworkVs::init( void ) { // 初始化命令配置 #ifdef _DEBUG CPduDataFormat::getInstance()->Load("../NetLib/PDUFormat.ini"); //../NetLib/PDUFormat.ini #else CPduDataFormat::getInstance()->Load("./PDUFormat.ini"); #endif // 订阅sckoet连接和通讯事件 IPduLink* pPduLink = CInterfaceWindow::getLinkInstance(); IPduComm* pPduComm = CInterfaceWindow::getCommInstance(); pPduLink->RegistPduLinkProc(this, TRUE); pPduComm->RegistPduCommProc(this, TRUE); // 获取Cti服务器ip和端口 CString Ip = CConfig::ctiIp(); int Port = CConfig::ctiPort(); // 创建scoket客户端 int nDevType = CDeviceMgr::GetInstance().getDevType(); if(nDevType == 0) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 网络环境初始化失败, 无法获取本地连接类型")); return false; } // 连接到CTI if(pPduLink->CreatePduClient(Ip, Port, static_cast (nDevType), 0, PDU_DEV_TYPE_CTI, 0, true)) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Net}: 网络环境初始化成功")); return true; } else { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常"), Ip, Port); return false; } } /***************************************************************** **【函数名称】 release **【函数功能】 释放连接 **【参数】 **【返回值】 ****************************************************************/ void CNetworkVs::release( void ) { CInterfaceWindow::getLinkInstance()->StopAll(); } /***************************************************************** **【函数名称】 SendCmdToCti **【函数功能】 给CTI发送命令 **【参数】 **【返回值】 ****************************************************************/ bool CNetworkVs::sendPduToCti( CPduEntity* a_pPduEntity ) { ASSERT(a_pPduEntity != NULL); return CInterfaceWindow::getCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_CTI, 0) == TRUE; } /***************************************************************** **【函数名称】 OnRecvCommand **【函数功能】 命令接收初步处理 **【参数】 **【返回值】 ****************************************************************/ void CNetworkVs::OnRecvCommand( CPduEntity* a_pPduEntity ) { ASSERT(a_pPduEntity != NULL); PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType(); // 注册命令返回以及心跳包不处理 if(Type == PDU_CMD_REG || Type == PDU_CMD_LISTEN) return; // 设备管理类处理命令 CDeviceMgr::GetInstance().procCmd(a_pPduEntity); } /***************************************************************** **【函数名称】 OnLinkStateChanged **【函数功能】 连接状态改变处理 **【参数】 **【返回值】 ****************************************************************/ void CNetworkVs::OnLinkStateChanged( const PduLinkContent& linkContent ) { // 连接状态变化分析 switch(linkContent.nLinkState) { case PDU_LINK_STATE_SUCCESSED: ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Net}: 连接CTI成功")); break; case PDU_LINK_STATE_FAILED: ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接CTI失败")); break; case PDU_LINK_STATE_REG_OK: ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Net}: 注册CTI成功, 可以进行通讯")); break; case PDU_LINK_STATE_REG_FAILED: ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 注册CTI失败, 通讯被禁止")); break; case PDU_LINK_STATE_DISCONNECTED: ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 与CTI连接中断")); __onDisconnect(); break; default: break; } }