基于OSGi和RCP的融合通信客户端的设计与实现 2010-8 《电信科学》
王晓鹏1, 2 王纯1, 2
(1.北京邮电大学网络与交换技术国家重点实验室北京100876,
2.东信北邮信息技术有限公司北京 100191)
摘 要:在客户端的设计开发中,松耦合、易扩展、易维护一直是开发者所追求的,本文提出了一种较好的设计实现思路。本文基于OSGi(Open Service Gateway Initiative) 以及Eclipse RCP(Rich Client Platform)技术,分析了融合通信业务的功能特点,给出了客户端系统具体的架构设计,指出了采用这种设计方式的优势并进行了具体实现。最后,指出了在模块化设计开发越来越流行的今天,OSGi必将得到更多的重视。
关键字:OSGi RCP 融合通信
Design and Implementation of Converged Communication Client Based on OSGi and RCP
Wang Xiaopeng1, 2 Wang Chun1, 2
(1.
State Key Laboratory of Networking and Switching Technology, Beijing University of Posts and Telecommunications, Beijing 100876)
2. EBUPT Information Technology Co. Ltd., Beijing 100191)
【Abstract】During the client's design and development, loose coupling, easy extension, easy maintenance has been pursued by developers, this paper puts forward a better design idea. Based on the OSGi (Open Service Gateway Initiative) and the Eclipse RCP (Rich Client Platform) technologies, this paper analyzes the features of converged communication services, gives a specific client system architecture design, points out the advantages of using this design approach and carries out a concrete implementation. Finally, with the modular design getting more and more popular today, this paper specifies that OSGi will get more attention.
【Key words】OSGi, RCP, converged communication
1. 引言
融合通信是目前业界关注的热点,其本质是通过实现传统电信业务与IT信息应用的整合。充分发挥电信网与互联网融合的配合,为客户带来全新的通信体验,能够向用户提供不受时间、空间限制的融合语音、数据和视频的多媒体通信。融合通讯平台基于互联网、电话网、移动网三网合一的通讯手段的门户,在一个平台上提供多种通讯方式(网络电话、电子传真、短信、电话会议、视频会议),并支持与现有的各个通讯系统做整合,实现在一个平台统一展现出来,也提供通讯接口供其他业务系统调用,实现在业务系统中的通讯应用[1]。
目前常用的很多融合通信客户端的实现都是不支持动态化部署,客户端的可扩展性以及可维护性都较差。用户也不能根据自己的需要灵活地对功能进行定制。因此,探寻一种更好的客户端设计方式,使得开发者能够简单地基于当前客户端进行开发扩展,用户能够自由地对客户端的功能进行按需定制,是非常必要的。
2.开发技术简介
用过开源IDE工具Eclipse的人都知道,Eclipse拥有众多功能强大、界面友好、风格统一的插件,开发者可以基于Eclipse开放的插件开发环境轻松开发自己的插件,用户也可以对Eclipse安装的插件进行定制,而这恰恰是本文要设计实现的融合通信客户端的目标。所以,我们可以借鉴Eclipse的实现机制来完成融合通信客户端的设计开发。
Eclipse是怎么做到的呢?通过对Eclipse的架构研究,发现它主要运用了两个技术:一个是OSGi(Open Service Gateway Initiative) ,Eclipse自己实现了一个OSGi 开源框架,取名为Equinox;另一个就是RCP,它是Eclipse提供的一个开放的插件开发平台[2]。这两个技术的运用,使得Eclipse具有很好的动态性和扩展性。因此我们可以考虑采用OSGi和RCP相结合的方式实现融合通信客户端。接下来对这两种技术分别进行简要的介绍。
2.1OSGi简介
OSGi,即开放服务网关协议。它的定义为:The Dynamic Module System For Java。它是一个模块化的标准,主要职责是让开发者能够构建一个动态化、模块化的Java系统,主要目标是组件级的复用[3]。
OSGi 的体系架构是基于插件式的软件结构,包括一个 OSGi框架和一系列插件,在OSGi中,插件称为 Bundle,其中, OSGi框架规范是 OSGi规范的核心部分,它提供了一个通用的、安全可管理的 Java 框架,通过这个框架,可以支持 Bundle 服务应用的部署和扩展[4]。Bundle 之间可以通过 Import Package 和 Require-Bundle 来共享 Java 类,在 OSGi 服务平台中,用户通过开发 Bundle 来提供需要的功能,这些 Bundle 可以动态加载和卸载,或者根据需要远程下载和升级。OSGi体系结构图如图 1 所示:
图1 OSGi体系结构
既然OSGI是模块化、动态化、插件化的,那么在设计融合通信客户端时可以借鉴OSGi的这些思想,将OSGi的体系框架融入到客户端的设计架构中,这样就可以设计出一个插件式的具备良好的模块性和动态性的客户端。这种合理设计的客户端同时也会兼备OSGi动态性、稳定性、可复用性强、可扩展性强以及可维护性强的特点。
2.2RCP简介
所谓RCP,即富客户端平台,是Eclipse组织向用户提供的强大的开放性开发平台,能够使用户方便地创建自己的基于Eclipse的应用程序,并且这些应用程序能够得到Eclipse的底层支持。RCP本质上是Eclipse的插件,所以当开发RCP应用程序时,可以利用Eclipse平台UI外观和框架来快速地进行开发。
采用Eclipse RCP技术主要有以下几个优点:组件化、跨平台、本地观感、可扩展性强、强大的开发工具支持和完善的本地帮助文档、广泛的java开发社区支持以及强大的企业级背景[5]。所以,将RCP技术应用到融合通信客户端的UI设计中,不仅可以加快开发进度,同时也可以实现客户端的平台无关性。
3.融合通信客户端设计实现
3.1需求分析
融合通信业务是为集团客户提供的,以企业统一通信录为核心,以VPMN (Virtual Private Mobile Network)业务为基础,面向企业、集团用户,基于统一通信号码,集成通信录、语音、视频、即时消息、会议等多类应用的企业综合通信解决方案。
融合通信客户端主要实现的功能有:好友、群组、通讯录、presence、文件传输、即时消息、VOIP通话、多媒体会议,同时还需要具备扩展集成第三方业务插件的能力[1]。
-
好友、群组、通讯录是基础数据功能,可以实现企业内部数据的共享以及企业员工之间的即时交互。
-
Presence即在线状态,它具有动态性、实时性、隐私性和多样化性。它是通信系统中业务发生、进行、结束等各个阶段中通信环境的上下文信息,这些信息有助于为用户提供更实时的服务[6]。
-
文件传输是用来在企业办公中传输文档、图片、音视频文件等信息。
-
即时消息用来实现企业办公中的及时消息交互(聊天功能)。
-
VoIP会话用来实现企业办公的音视频通话。
-
多媒体会议用来实现企业办公中多人的音视频会议。
鉴于融合通信整体的功能可以划分为多个独立的子功能模块,客户端设计宜采用开放的分层式架构,内部采用高内聚、松耦合的模块化设计,各业务能力或应用以插件形式组合到架构中,通过第二部分的介绍可知OSGi能够满足松耦合、模块化、底层业务插件化的需求,而RCP则能够很容易的基于扩展点实现UI的插件式开发,并能实时的对UI进行动态刷新。所以在对功能模块进行粒度划分后,基于RCP和OSGi组合的方式进行客户端架构设计就能很好的满足要求。这种组合主要具有以下几点优势:
-
各个模块之间的耦合性下降;
-
开发过程中可以采取并行开发的方式,加速开发进度;
-
RCP的采用使得客户端的UI界面开发简单,并支持动态化改变;
-
客户端具有了较好的可扩展性和可维护性[7]。
3.2客户端架构设计
设计时主要考虑的是实现客户端的动态化以及易扩展性,所以在设计时根据融合通信客户端的功能可以细分为好友、群组、通讯录、IM(即时消息)、文件传输、VoIP通话几个功能部分。每个功能主要包含两个部分:UI以及底层业务逻辑,UI用来与用户进行交互,而业务逻辑则是对用户的请求进行处理并将结果返回到UI呈现给用户。这样在整个客户端的架构中就会有很多功能模块的UI(即时消息界面、VoIP会话界面、会议界面等),它们跟主UI的关系应该是聚合关系而不是继承关系,这也是采用RCP的原因所在。
考虑到客户端底层要与服务器进行交互,对功能特点进行分析后,采用的协议栈主要有有:XCAP(XML Configuration Access Protocol)协议栈、SIP(Session Initiation Protocol)协议栈以及MSRP( Message Session Relay Protocol)协议栈。XCAP协议栈实际上是对HTTP协议栈的一个封装,主要用来从服务器上获取好友、群组以及通讯录的XML文档;SIP主要用来进行登录、群组文档变更及presence信息的订阅及通知、会话的发起、消息的发送[8]等;MSRP协议栈主要用来进行文件传输。
基于OSGi的模块化思想以及MVC的设计理念,客户端的设计架构图如图2所示。
从图2中可以看出,客户端的设计是分层的。每个功能部分都是单独的自上而下的设计方式:UI—>业务逻辑—>业务引擎—>底层基础协议栈,其中业务逻辑对于每一部分功能来说都是不同的,可以通过不同的bundle来实现。业务引擎主要是提供了对底层依赖的封装,方便上层的调用。
架构图中的数据融合模块是一个数据处理的综合模块,它的设计见图3。
图3 融合通信模块设计
这样设计的原因是获取到presence信息(在线状态)后,需要将这些信息与对应的好友或群组成员及时融合并呈现给用户。而好友、群组分别位于不同的bundle中,如果不增加一个额外的数据融合层来处理,就需要上层UI来进行这些操作,这样有两个缺陷:首先,当好友、群组数量庞大时,会对UI造成很大的性能影响,客户端内存开销也会增大;其次,UI进行处理势必要在UI层做很多逻辑处理,这样UI就需要与底层的业务进行很多不必要的交互,违背了MVC的设计思想。数据融合层就是定义了一个包含了presence信息的统一的成员数据结构,这个数据结构在获取到presence变化信息后会及时更新并通过监听器上报UI,此时UI只需要刷新一下即可显示最新的presence信息,大大减轻了UI的负担。
客户端有一个启动的主界面,它是基于Eclipse的RCP实现的,同时其中定义了各个子功能UI的扩展点(以快捷键或是侧边栏的方式)以及菜单栏部分的扩展点,子功能的UI就可以通过实现这些扩展点而将自己与主UI联系起来,具有很好的动态性和可扩展性。设计时将UI分为两类,一种是嵌入到主UI中显示的,比如群组、好友、VoIP呼叫,这类UI可以通过实现快捷键或侧边栏Tab页扩展点的方式将自己嵌入到主UI中;另一种就是单独弹出UI窗体显示,比如IM、会议等,这类UI主要是通过实现主UI中定义的菜单栏扩展点将对应的操作集成到主UI中,通过这种方式还能实现主UI菜单栏的动态改变[2]。这里要特别说明的一点就是登录界面,登录有两种实现方式,一种是弹出一个独立对话框,另一种是复用主UI。第一种类似QQ登录方式,登录成功后才显示主界面,第二种类似MSN登录方式,登陆本身就是在主UI中,只有登录成功后界面才切换到登录后的页面。本文采用的是第二种方式实现,所以图中将登录UI放到了主UI中。
在本客户端的设计中,还用到了一些第三方的组件,主要有JMF(Java Media Framework)、第三方的RadVision会议插件以及一个日志管理插件。JMF主要用于VoIP通话中媒体的处理,而RadVision会议插件则是用于实现多媒体会议,日志管理插件主要是通过封装了开源工具Log4J的接口,采用Façade设计模式重新提供接口,进行客户端日志管理。
从整个客户端管理的角度上提供了网络管理、安全管理等模块,主要用来进行网络监测以及信息的有效性校验等功能。除此之外,最重要的还提供了一个插件管理模块,这个模块主要是为了便于用户进行业务定制,它是基于对OSGi提供的bundle管理功能进行抽象封装实现的,能够实现客户端功能模块的热插拔。
3.3客户端的实现
客户端的架构完全是基于OSGi来设计的,所以架构图中的每一模块都是一个独立的bundle,bundle之间的调用是自上而下的,下层的bundle不能调用上层的,这是为了防止开发过程中出现bundle的循环引用,同时也使得逻辑更清晰。下层的bundle通过启动时注册自己提供的服务,上层的bundle在需要的时候可以通过OSGi的服务获取策略获取相应的服务,这样就能实现上层对下层业务的调用。
图4 客户端bundle之间依赖关系图
图4是按照设计的客户端架构实现后,工程中所有bundle的一个结构图,其中要注意的一点就是在具体实现时,将业务逻辑部分划分为业务逻辑实现以及业务逻辑适配层两部分,这样是为了将底层业务逻辑与上层应用隔离开来,通过中间的适配层(主要是封装的接口)来交互,这也就是模块化编程中强调的将接口和实现分离,这样只需要对上层应用export接口即可,只要保证接口的稳定性,底层业务逻辑实现方式的改变不会对上层造成任何影响。业务引擎部分本身就是对底层基础依赖的封装,也是基于这个原理。
图4中左侧功能管理部分包括具体业务功能管理、安全管理、日志管理以及网络管理等。数据融合部分将接收到的数据转换成定义的数据结构后提供给业务逻辑适配层的DataIntegration,DataIntegration部分就是通过对这部分的数据进行融合,从而能更方便的为那些需要将这些数据进行组合的需求提供服务。同时数据融合部分也是客户端需要进行数据保存的地方(需要与数据库进行交互)。
为了更好的体现OSGi基于组件化的思想,实现时采用了OSGi 提供的一个Declarative Service服务[3],它是基于“依赖注入”的方式实现的,可以通过在MANIFEST.MF中增加一个Service-Component节点定义其动态服务配置文件component.xml文件路径。各bundle在动态服务配置文件component.xml中注册发布服务或者动态绑定其他组件提供的服务。
以图4中群组服务为例,ServiceInterface是所有对上层提供服务的接口层,它包含了群组服务的接口,并export其群组服务接口。GroupService通过import该接口并实现具体的群组服务功能,然后通过Declarative Service服务配置 component.xml文件注册发布群组服务,上层GUIGroup使用群组服务时只需import ServiceInterface的接口即可。客户端启动时,GroupService尚未启动,依据Declarative Service服务原理,GUIGroup启动的条件不满足,不会启动;一旦GroupService启动,OSGi的动态服务框架就会马上去查找是否有使用该服务的bundle,此时就会查找到GUIGroup bundle并将服务注册到该bundle中。接下来查看该bundle的启动条件是否满足,如果满足就会启动该bundle,从而GUIGroup就可以获得群组服务。这种基于接口提供服务的方式对上层隐藏了服务的具体实现,任何实现了ServiceInterface群组服务接口的包都可以被用来提供服务,这就保证了客户端的可扩展性。同时通过提供服务实现包的启动停止就能很方便地进行功能的定制。
3.4典型业务流程
图5展示了客户端一些基本的流程交互(注册、消息、文件传输、呼叫),通过该图可以对融合通信客户端的流程有一个更清楚地认识。
图5 客户端流程交互图
下面对流程简要说明一下:
-
流程1-8:客户端登录,GUIBase显示登录窗口,用户输入用户名和密码后选择登录,此时,GUIBase会获取注册服务,GUIBase中引用的是ServiceInterface中的接口,动态绑定到RegistryService,RegistryService调用SIPAgent构造注册请求,然后通过底层SIP协议栈发送注册请求(通过SIP的Register消息)注册到注册服务器。接收到注册服务器回应的200 OK说明登录成功。
-
流程9-20:客户端的即时消息交互,用户选取一个好友发送即时消息,GUIBase调
-
用GUIIM进行即时消息发送,GUIIM获取动态绑定的IMService服务来发送消息,IMService调用SIPAgent构造即时消息(SIP的Message消息)并通过底层SIP协议栈来发送消息到IM服务器,并且接收IM服务器的响应(提示消息发送成功还是失败),同时对对方回应的消息进行接收并呈现给用户
-
流程21-30:客户端的文件传输过程,用户在消息窗口中发起文件传输请求,此时GUIIM动态获取到文件传输服务MSRPService,并将文件传输的请求传送给MSRPService,MSRPService调用SIPAgent构造文件传输请求(SIP的Invite消息)并通过底层发送给文件传输服务器,接收到对方同意的响应后,建立一条到对方的http连接并且通过MSRPStack来进行文件传输(基于MSRP协议)。文件传输完成后,如果没有后续的文件传输请求,关闭http连接。
-
流程31-47:客户端呼叫过程,从GUIBase切换到呼叫界面GUIVoIP,然后输入被叫者号码(或从列表中选择),然后依次调用VoIPApp、VoIPService传递呼叫请求,VoIPService调用SIPAgent构造呼叫请求(SIP的Invite消息),然后通过SIP协议栈发送到呼叫服务器,当双方媒体协商完成后,调用MediaService来进行语音流、视频流的传输和管理(基于JMF技术实现),直到会话结束。
-
48-52:客户端退出,流程同1-8。
4.结束语
随着互联网的飞速发展,各种业务不断推陈出新,同时用户的需求也是越来越多样化,本文基于OSGi和RCP技术详细讨论了融合通信客户端系统的设计与实现,提出了一种全新的融合通信客户端开发方式,这种方式融合了OSGi动态化、模块化、插件化的特性以及RCP扩展点开发的特性,既能满足企业快速开发、易于维护的需求,同时也能够满足用户自定制的意愿。该客户端已经通过测试,得益于OSGi的微核、低耦合、模块化以及RCP的插件式扩展点特性,本客户端具有较好的稳定性、动态性、可扩展性和可维护性。虽然目前OSGi在桌面终端的应用不是很多,也没有引起太多的关注,但是插件式结构和模块化开发是一种趋势,而OSGi则是二者的集大成者,相信随着OSGi功能的不断增强和体系的不断完善,会得到越来越多的关注。
参考文献
[1]彭巍等.中国移动融合通信业务规范.2008,11
[2]陈刚.Eclipse 从入门到精通(第2版) .清华大学出版社.2007年7月
[3]林昊,曾宪杰.OSGi原理与最佳实践.电子工业出版社.2009年8月
[4]The OSGi Alliance.OSGi Service Platform Core Specification Release 4,Version 4.2.2009.6
[5] 马吉荣.基于Eclipse RCP的应用开发.程序员.2006年第5期 P65-67
[6]沈奇威,廖建新.一种新的Presence建模方法.高技术通讯.2007,17(2) P124~126
[7] 李鸣亚,邹晓峰.浅谈插件化软件开发.广西轻工业.2009年第8期
[8]望玉梅,董文宇,周胜.IMS:IP多媒体概念和服务(原书第2版) .机械工业出版社.2007年7月
_______________________________________________
*基金项目:国家杰出青年科学基金(No. 60525110);国家973计划项目(No.2007CB307100,2007CB307103);国家自然科学基金(No. 60902051);中央高校基本科研业务费专项资金(BUPT2009RC0505);电子信息产业发展基金项目(基于3G的移动业务应用系统)