基于Doubango的座席控件的设计与实现
2015-11-08田海
田海
(江西九江供电公司,江西九江332000)
基于Doubango的座席控件的设计与实现
田海
(江西九江供电公司,江西九江332000)
为了实现将发送及接收SIP Message消息的功能封装成一个供第三方调用的独立模块,在使用Doubango库的基础之上,通过ActiveX控件及动态链接库等关键技术,设计了良好紧凑的软件架构,封装了SIP Message消息的发送及接收功能,并充分考虑用户体验,完成了C/S和B/S架构均可调用的座席控件。通过预定义SIP消息ID及消息体格式,用户可以发送并响应服务器支持的所有消息,指出了本控件的不足之处并说明了以后的研究方向。
座席控件SIP Doubango ActiveX
1 引言
座席端软件在一个完整的会议控制系统中占有十分重要的地位。座席操作员通过座席端软件与CDMS(呼叫调度管理服务器,用于管理与座席控件之间的信息交互,执行系统逻辑功能)服务器进行交互,完成对通讯设备的控制和相关信息的交换,如座席的登录、注销、呼出、应答、形成会议和释放会议等动作,以上操作都是通过座席端软件与CDMS的通信完成的[1]。
为了加快座席端软件的开发速度,同时减少软件模块间的耦合度,通常把座席端软件分为业务模块和通信模块。由于用户需求经常变化,业务模块也会随着变更,所以该模块一般都需要进行定制开发。而通信模块的功能则相对固定,所以可以将通信模块封装为一个独立的控件,供上层业务模块调用[2]。业务模块开发者不必掌握Socket通信相关技术,更不用了解座席端与服务器间的通信协议,开发者只需访问控件的属性和方法并响应控件的事件,就能够为座席端软件添加相应的通信控制功能[3]。
2 关键技术
2.1SIP
会话初始化协议(Session Initiation Protocol,SIP)是由因特网工程任务组(Internet Engineering Task Force,IETF)制定的多媒体通信协议。它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话[4]。广泛应用于下一代网络(Next Generation Network,NGN)以及IP多媒体子系统(IP Multimedia Subsystem,IMS)的网络中,可以支持并应用于语音、视频和数据等多媒体业务,同时也可以应用于呈现和即时消息等特色业务。
2.2Doubango
Doubango是一个开源的VOIP基础平台,并能用于桌面系统和嵌入式的开源框架,该框架底层和中间层使用ANSI-C编写,它是一系列API的集合,实现多种协议功能。TinyWRAP是一个由C++实现的包装类,封装Doubango工程所有API,并使用SWIG技术提供了C#接口。TinySIP实现了SIP协议,定义了SIP事件的参数,该框架还包含TinyMedia、TinyRTP、TinyDAV、TinySDP、TinyMSRP和TinyXCAP等子项目[5]。
2.3ActiveX
ActiveX控件是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。作为针对Internet应用开发的技术,ActiveX被广泛应用于Web服务器以及客户端的各个方面。
3 设计方案
3.1系统设计
座席控件以动态链接库的形式存在,供C/S、B/S客户端调用(B/S调用时需将控件封装成.cab包,首次访问控件时浏览器会自动安装该控件),通过SIP信令与软交换进行交互,使用时需要占用软交换系统中的一个号码资源。
座席业务功能通过本控件收发Sip Message消息来实现。座席端软件与CDMS之间的通信是建立在TCP/IP的基础上,具体的通信包为发送自定义格式的SIP Message消息,不同类型的消息具有唯一的消息ID以及相应的格式。
上层调用者要实现某项功能时,调用接口函数发送相应的Sip消息。该函数首先创建私有消息对象,然后根据AGENT消息格式生成Sip Message Body字符串,发送至软交换服务器,再由软交换服务器转发至CDMS处理。接收CDMS服务器返回的消息结果后,首先解析其消息字符串生成私有消息对象,然后根据消息的ID调用已经定义的事件,将消息结果传给上层调用者,如图1所示。
图1 座席控件系统结构
4 系统实现
4.1控件接口
ISeatCtrl接口类定义了供第三方调用的属性、接口函数及事件。调用者只需使用这些公开的信息即可调用该控件所用功能。
属性为座席的各项信息,座席通过改变属性值来设置应急指挥/呼叫中心平台和自己相关的各项参数,如AgentID、AgentPassword、AgentName和绑定的分机号码等信息,以及服务端的各项参数,如服务器地址和端口号等。
接口函数即是提供给调用者的各个功能,如注册SipRegister()、组请求GroupReq()和登录LogIn()等接口函数,事件用来通知调用者调用某接口函数后的结果。因为本控件采用异步操作,调用者调用某接口后不会阻塞,控件的接收消息线程捕获服务器返回的操作结果后,通过事件通知调用者。如注册结果事件OnSipRegisterResult、组请求结果事件OnGroupReqResult和登录结果事件OnLoginResult等。
4.2具体实现
SeatCtrl实现了ISeatCtrl接口,提供了对接口及事件的具体实现,定义了常量、消息结构和若干私有工具函数。此外,该类还实现了IObjectSafety接口,用来以ActiveX形式加载至浏览器中,该控件主要UML类图如图2所示。
消息结构定义:
其中消息IDwMessageID定义了消息的类型,取值范围为事先定义的常量集合。如
GroupAsk代表AGENT请求组消息。同时定义该消息内容sMessage为“座席标识(6)”,(6)代表6个字符。
图2 主要UML类图
GroupAns代表AGENT请求组结果。同时定义该消息内容sMessage为“座席标识(6)+组标识(4)+组名(20)+…”,“…”代表若干个“组标识”和“组名”的集合。
以上说明了消息的结构及主要字段的含义,下面介绍Sip注册、发送SIP Message消息等功能的实现过程。
控件的核心类是SipService类。该类主要成员变量为SIP协议栈sipStack、回调函数sipCallback、注册会话regSession,这些成员变量的类定义依赖于Doubango库。主要成员函数为开启服务Start()、停止服务Stop()、注册Register()和注销UnRegister()等。此外还定义了注册事件onRegistrationEvent和消息事件onMessagingEvent等。
控件的注册接口SipRegister最终调用SipService的注册接口Register()。注册函数首先依据控件各属性初始化SIP协议栈sipStack,并将该协议栈和回调函数sipCallback绑定,然后调用sipStack.start()启动SIP协议栈,最后根据该协议栈初始化注册会话regSession,并且调用regSession.register()注册控件,完成控件的注册操作。
控件的注销接口SipUnRegister最终调用SipService的注销接口UnRegister()。注销时采用新的线程调用SIP协议栈的sipStack.stop()即可完成注销操作。服务器返回的注册结果被sipCallback捕获,然后触发SipService的onRegistrationEvent事件。用户只要监听该事件,即可获得注册结果。
控件发送座席命令是通过发送SIP Message消息完成的。各命令接口中发送的SIP Message以消息ID和消息内容区分。下面以组请求命令为例介绍发送SIP Message的过程。
生成消息字符串分为3步。首先,创建消息结构SendMessage,并为各字段赋值,消息ID和消息内容如消息结构中所述。然后,将SendMessage转化为字节数组,并添加校验字节码。最后,为了避免传输过程中解析内容出错,将字节数组转化为十六进制表示的字符串,每个字节占用2个字符,所以生成的字符串长度为字节数组长度的2倍。
接下来是发送消息。首先通过SipService的SipStack生成发送消息会话MyMessagingSession,该会话类依赖于Doubango库。然后为该会话添加自定义的"Content-Type"属性:AGENT_OCX。最后将字符串转化为UTF8编码的字节数组,调用send函数发送消息。
服务器返回处理消息命令的结果被sipCallback捕获,然后触发SipService的onMessagingEvent事件。用户只要监听该事件,即可获取处理结果。
加载控件时,在控件的构造函数中,实例化SeatCtrlServiceManager类,该类作为全局服务的管理类,所以采用单例模式实现,保证只被实例化一次。该类实现了Sip相关服务的初始化以及提供全局访问的SipService属性。实例化SeatCtrlServiceManager时初始化SipStack,调用了依赖于Doubango库的SipStack.initialize(),然后调用该类的Start()接口,其中调用SipService的Start()接口,启动SipService服务。同时为SeatCtrlServiceManager的SipService属性的onRegistrationEvent和onMessagingEvent事件分别添加监听函数。
在注册事件onRegistrationEvent的监听函数中,根据参数注册事件类型RegistrationEventArgs的值判断注册结果。如返回REGISTRATION_OK,则调用自定义事件OnSipRegisterResult,告知第三方调用者注册结果。
在消息事件onMessagingEvent的监听函数中,当接收到Message消息后,则创建新的线程执行解析收到的字节数组,完成和发送SIP Message时相反的一系列操作,即将字节数组先转化为对应的字符串,然后解析字符串生成长度减半的字节数组,最后根据字节数组转化为消息结构体,并作为参数传至MessageComCase函数。根据消息ID及预定义的格式解析消息内容,生成调用事件时的参数并触发相应的事件。如消息ID为GroupAns,则从消息内容中提取出组标识和组名,并触发OnGroupReqResult事件。
5 结束语
用户通过使用该座席控件可以在桌面软件和浏览器中发送座席命令,完成呼叫、群呼、形成会议、释放会议、会议控制、磋商呼叫、强插、强拆和抢接等操作。经测试,控件响应快速、稳定性强和API调用方式友好,满足对座席功能的需求。但是由于只有IE支持ActiveX插件,所以在以B/S方式加载该控件时,只能使用IE浏览器。其他浏览器访问时还需安装支持ActiveX的插件,用户使用时不够方便,所以开发更为通用的插件可以作为以后的研究方向。
[1]孙晶波.机场呼叫中心座席系统的设计与实现[D].济南:山东大学,2012.
[2]冯帅.交通银行信用卡座席系统设计与实现[D].成都:电子科技大学,2013.
[3]董恭甫.基于ActiveX的呼叫中心座席驱动的设计与实现[D].北京:北京邮电大学,2012.
[4]张友波,张焕强,孙利民.基于SIP的视频会议系统设计与实现[J].计算机工程,2005(21):167-169.
[5]姜懿恒,孙勇,温向明.统一框架Doubango下的IMS客户端元素[J].计算机系统应用,2012,21(10):86-90,113.
[6]刘立峻.基于ActiveX控件的Internet功能实现[J].武汉工业学院学报,2004(2):14-17.
Design and Implementation of Agent Control Based on Doubango
TIAN Hai
(State Grid Jiujiang Power Supply Company,Jiujiang Jiangxi 332000,China)
In order to encapsulate the function of sending and receiving SIP Message into an independent module for third party invoking,on the basis of Doubango library,a kind of compact software architecture is designed through Active X control,dynamic link library and other key technologies.In such software architecture,the function of sending and receiving SIP Message is encapsulated,the user experience is fully considered and the agent control that can be invoked by both C/S and B/S is completed.By predefining the ID and message content formulate of SIP message,the user can send and respond to all messages supported by the server.Finally,the disadvantages of the control are pointed out,and the future development direction is indicated.
agent control;SIP;Doubango;Active X
TP311.1
A
1008-1739(2015)19-68-4
定稿日期:2015-09-12