APP下载

群组聊天业务在IMS客户端的设计与实现

2011-09-07朱春江丁革媛贾军营

计算机工程与设计 2011年7期
关键词:管理器群组聊天

朱春江, 丁革媛, 孙 咏, 贾军营

(1.中国科学院研究生院,北京100049;2.中国科学院沈阳计算技术研究所网络与通信实验室,辽宁沈阳110171;3.沈阳工业大学工程学院,辽宁沈阳111003)

0 引 言

IM(instantmessaging)的飞速发展使得它一跃成为互联网三大基础应用之首,超过了搜索引擎和电子邮件。在网络融合的背景下,IMS客户端必然会选择包含IM这项极具商业价值的业务。IMS架构中指定SIMPLE(SIP for instant messaging and presence leverage extension)[1]作为IM业务的标准规范。一般认为,SIMPLE IM业务主要包括,一对一聊天、群组聊天(预定义群组和临时群组)、文件传输、离线消息和历史消息存储等。IMS客户端中这些业务拥有旺盛的需求,特别是群组聊天。目前业界IMS客户端支持的业务一般都包括一对一聊天、离线消息、历史消息存储等,而在最新的标准中定义的群组聊天和文件传输,还很少有 IMS客户端支持。Ericsson的IMS-M客户端支持临时群组、文件传输,但没有预定义群组;法国优秀的IMS客户端Mercuro只支持文件传输,不支持群组聊天。因此,市场上还没有一个IMS客户端完整地支持群组聊天业务,群组聊天业务是目前IMS客户端需求最迫切的业务。

为了弥补完整的群组聊天业务在 IMS客户端上的空白,本文依据OMA最新发布的SIMPLEIM标准,研究其中关于群组聊天业务的定义,在IMS客户端体系架构上添加了群组聊天组件,设计出分别针对预定义群组和临时群组的管理器,讨论了群组初始化的过程,并实现在SIPHelloIMS客户端上。经测试表明,群组初始化、群组操作、群会话操作、群组消息收发、事件包订阅通知等均正确运行,群组聊天业务得以成功实现。

1 群组聊天标准介绍

1.1 SIMPLE IM

SIMPLE和XMPP(extensible messaging and presence protocol)是目前IM的两个主要标准。SIMPLE IM是SIP协议针对IM和Presence的扩展。它最早是由IETF SIMPLE工作组于2001年2月提出的。之后,OMA也就SIMPLEIM提出了版本V1.0的一系列规范,分别定义了业务功能架构、业务需求、技术规范。V1.0版本仍是Candidate状态,OMA和IETF正在对此标准进行进一步完善。

SIMPLEIM会涉及到OMA定义的另外一些网元,如XDM(XMLdocumentmanagement)[2-3]。OMA 将 IM、Presence、XDM 等功能部件分别定义为一个网元。这些网元拥有各自的一些功能规范,某些网元需要调用其他网元的功能。例如,IM和Presence都会使用XDM来管理XML文件。

1.2 预定义群组和临时群组

SIMPLE IM将群组分为预定义群组(pre-defined group)和临时群组(Ad-hoc group)。这两种群组的区别在于,预定义群组拥有群组结构文件保存在XDMS,此XML文件的XMLSchema见文献[4],它保存着此预定义群组的各项属性和内容,例如群组名称,显示名称,群组成员列表,群组初始化时是否邀请成员,最大邀请人数以及定义了各个成员属性(如允许匿名,允许订阅群会话conference[5]事件包,允许私有信息,允许动态加入成员,是否接收群广告,是否是关键用户,允许别人加入群组等)的规则集。预定义群组中“预定义”3个字的含义应该就在于,每一个预定义群组都拥有一个对应的群组结构文件存储在XDMS上。临时群组,如同它的名字,是一种临时创建、临时销毁的群组。它的特点是简单方便。

1.3 3种通信模式

SIMPLEIM的通信模式有3种:PagerMode,LargeMessage Mode和SessionMode。PagerMode使用SIP的拓展请求MESSAGE方法,信息直接携带在消息体中,传输过程不需要会话的建立。但是,Pager Mode每个MESSAGE消息只能传输最多1300字节的内容,当需要传送大数据量时不适用。为了克服此缺点,提出了Large Message Mode。此模式每次需要传输信息时就建立起MSRP[6]通道,传输完毕后就撤销MSRP通道。这种方式很好的解决了PagerMode的大消息传送问题,然而,当频繁发送消息时,MSRP通道的频繁建立销毁就成为了巨大的负载。Session Mode则在通信双方之间保持着MSRP通道(IM session),期间可以利用此通道接收发送消息;MSRP通道的销毁是由用户自身或者定时器来触发的。

上述3种通信模式都可以用于预定义群组和临时群组。但Pager Mode和Large Message Mode只能用于群组消息的发送和接收;只有Session Mode才有群会话操作。

1.4 群组操作和群会话操作

顾名思义,群组操作和群会话操作分别是针对群组和群会话的。预定义群组中,群组是由群组结构文件定义的,所以群组操作是指操纵群组结构文件的操作,在任何通信模式下都可以通过XCAP协议[7]进行;群会话操作是指操纵群会话的操作,只有在拥有群会话时才存在,即必须是在Session Mode下进行的。临时群组中,群组的概念更多的是指SessionMode下的群会话,因为PagerMode和LargeMessageMode只能进行简单的群组消息收发,不能进行复杂的群组操作。因此,临时群组下群组操作就是群会话操作。

群组操作包括,新建群组、加入群组、邀请别人加入群组、退出群组、将成员从群组中删除掉、销毁群组等。它们虽然没有在标准中明确地被提出,但可以从XDM[2-3]和RFC4825[7]中推导出操作的方法。它们都是通过XCAP协议PUT、GET、DELETE方法操纵IM XDMS上群组结构文件来实现的。

群会话操作包括,发起群会话、取消发起的群会话、加入群会话、邀请成员加入群会话、离开群会话、从群会话中删除成员、结束群会话等。它们的具体细节在标准中定义得比较详细。下面简要介绍客户端的过程:

(1)发起群会话:使用INVITE消息,设置Request-Uri是预定义群组 Uri或临时群组 Conference-Factory-Uri。消息携带SDP Offer协商MSRP通道。

(2)取消发起的群会话:使用CANCEL消息,前提是客户端还没有接收到INVITE请求的最终响应。

(3)加入群会话:使用INVITE消息,设置Request-Uri是预定义群组Uri或临时群组Session Uri。消息携带SDP Offer协商MSRP通道。

(4)邀请成员加入群会话:使用REFER消息,设置Request-Uri是Session Uri。Refer-To字段设置为被邀请成员Uri,邀请多个成员时可以使用RFC4826[8]中定义的Resource-List来携带。Method字段是INVITE方法。

(5)离开群会话:使用BYE消息,设置Request-Uri是SessionUri。

(6)从群会话中删除成员:使用REFER消息,设置Request-Uri是Session Uri。Refer-To字段设置为要删除的成员Uri,删除多个成员时可以使用RFC4826[8]中定义的Resource-List来携带。Method字段是BYE方法。

(7)结束群会话:预定义群组时,群组管理员执行销毁群组的操作,或者群主离开群会话时群组结构文件中Session Release Policy中auto-release字段的值是true[1],此群会话就被结束了。临时群组时,群主离开群会话一定会引起该群会话的结束。

2 群组聊天业务设计

2.1 客户端体系架构

群组聊天业务是一项客户端、服务器端紧密交互的系统。在此,我们主要关注客户端。为了构建群组聊天业务,我们在客户端的体系架构上添加群组聊天组件,如图1所示。

图1 客户端体系架构

图1显示了“用户层——UACore——网络层”3层体系结构。最上层是用户层,负责接收用户的操作命令和显示结果至用户。第二层是整个架构的核心UACore,这一层相当于一个容器,包含着所有核心栈及管理器,如封装好的信令栈、媒体栈、Presence管理器等。笔者在该层添加了预定义群组和临时群组两个管理器,负责一切与群组相关的操作,管理器的具体设计见2.2。最底层是网络层,负责与真实网络的交互。

2.2 管理器设计

图2 管理器框架

在图2中,预定义群组管理器包括群组部件、群会话部件、XCAP-DIFF[9]事件包订阅通知部件、Conference[5]事件包订阅通知部件、预定义群组消息收发部件等。而临时群组管理器只包括群会话部件、Conference事件包订阅通知部件、临时群组消息收发部件等。其中,群组部件通过XCAP协议与IMXDMS进行交互,群会话部件通过SIP协议(INVITE,BYE,REFER等方法)与IMServer交互;XCAP-DIFF和Conference事件包的订阅通知部件基于RFC3265的事件通知机制。图2中事件包订阅通知接口和群组消息收发接口在2.3和2.4进行介绍。

2.3 群组消息收发接口设计

在图2中可见,群组消息收发接口相当于一个与IMServer联系,汇总、分发群组消息的接口。发送消息时,两个管理器中预定义群组消息收发部件和临时群组收发部件负责从用户层把要发送的消息、发送的目的地等信息收集起来,然后经过群组消息收发接口发送至IMServer。接收消息时,从IMServer得到消息后,判断目标群组是预定义群组还是临时群组,然后把消息传送至相应的部件,在那里传送至用户层进行显示和记录等操作。

根据通信模式的不同,群组消息收发接口与IM Server交互的方式也不同。PagerMode下使用的是SIP拓展请求MESSAGE,Session Mode和Large Message Mode都是基于会话的模式,它们使用RFC3862[10]中定义的message/cpim MIME格式进行群组消息的收发。因此,根据上述两种不同的情况设计不同的函数接口:Pager Mode下使用函数SendHtmlMessageTo和SendMessageTo分别用于发送MIME格式为txt/html或txt/plain的消息体,接收MESSAGE消息的回调则是pfunReceivedPage;Session Mode和 Large Message Mode下使用函数 SendMsrp-DataTo发送Msrp数据,接收Msrp数据的回调设计为pfunOn-MsrpRecvIM。上述5个函数的具体参数设计介绍如下:

(2)发送Html格式消息函数SendHtmlMessageTo,参数列表为unsigned int prof_id,const char*target,const char*txt,int len,int cookie,分别代表ProfileId、发送目标、发送消息和长度、cookie。

(3)发送Plain纯文本消息函数SendMessageTo,参数列表是short nProfId,const char*target,const char*txt,long len,int cookie,分别代表ProfileId、发送目标、发送消息和长度、cookie。

(4)Msrp数据接收回调pfunOnMsrpRecvIM,参数列表是long sesId,long strmId,char*buf,int buflen,int contenttype,分别代表Session Id、Stream Id、消息内容及长度、MIME格式。

(5)发送Msrp数据函数SendMsrpDataTo,参数列表是const char*uri,constchar*buffer,intlen,constintcontenttype,boolbPriority,分别代表目的Uri、消息内容及长度、MIME格式、优先级。

2.4 事件包订阅通知接口设计

从图2中可见,和群组消息收发接口类似,事件包订阅通知接口是一个汇总订阅、分发通知的接口。订阅时,预定义群组管理器中XCAP-DIFF事件包订阅通知部件把订阅资源uri,通知方法diff-processing等信息传送给此接口,此接口再向IM XDMS订阅。两个管理器中Conference事件包订阅通知部件把要订阅的群会话uri等信息传送给此接口,之后此接口再统一向IM Server订阅。通知时,IMXDMS和IMServer等Notifier把Notify消息传送至此接口,此接口判断Notify消息的事件包名是XCAP-DIFF还是Conference,订阅资源属于预定义群组还是临时群组等信息,再把Notify消息传送至对应的部件。

数码互动系统是形态学实验教学的一项重大改革,是一种有效的教学辅助手段。有利于开展互动化教学方式和远程教学,有利于学生对形态学的理解和学习能力水平的提高,经过多年实践,发现学生的学习成绩有很大的提高,形态学实验教学水平明显提升。

有了以上分析,笔者设计了适用于通用事件的订阅函数AddSubscription、RefreshSubscription、RemoveSubscription以及事件包通知的回调pfunOnSubscriptionActive、pfunOnSubscription-Terminated、pfunOnSubscriptionPending等,事件包订阅通知接口直接使用这些函数和回调就可以实现。下面介绍它们的具体参数设计:

(1)添加订阅函数AddSubscription,参数列表是constchar*uri,constchar*ev,constintexpire,分别代表订阅资源、订阅事件包和过期时间。

(2)刷新订阅函数RefreshSubscription,参数列表是constchar*uri,const char*ev,代表订阅资源和订阅事件包。

(3)删除订阅函数RemoveSubscription,参数列表是constchar*uri,const char*ev,代表订阅资源和订阅事件包。

(4)订阅成功回调pfunOnSubscriptionActive,参数列表是int32 prf_id,const char8*uri,const char8*ev,const char8*strContent,int32 len,const char8*mimetype,分别代表 Profile Id、订阅资源Uri、订阅事件包、消息体内容及长度、MIME类型。

(5)订阅终止回调pfunOnSubscriptionTerminated,参数列表是int32 prf_id,const char8*uri,const char8*ev,const char8*reason,分别代表ProfileId、订阅资源Uri、订阅事件包、终止原因。

(6)订阅挂起回调pfunOnSubscriptionPending,参数列表是int32prf_id,constchar8*uri,constchar8*ev,分别代表 ProfileId、订阅资源Uri、订阅事件包。

2.5 群组初始化讨论

群组初始化是指IMS客户端用户登录成功后的初始化工作,主要是把该用户所参与的群组加载完毕。群组初始化只针对预定义群组的初始化,不包括临时群组的初始化,因为临时群组是用户登录后临时创建的,用户刚登录时是不应该存在任何临时群组的。预定义群组的加载就是取得群组结构文件,解析后放入内存,并进行相应的界面显示。笔者认为,群组初始化过程存在两个关键问题,下面具体讨论。

2.5.1 用户参与的群组

初始化时,用户需要知道他参与了哪些群组。群组结构文件只是说明某个群组的各项属性,并不包含这个用户参与了哪些群组的信息。最直观的想法是,对XDMS中所有用户树下的群组结构文件进行搜索,把群组成员列表中包含某特定用户的群组给搜索出来,也就知道了该用户所参与的所有群组,但显然搜索过程会引入巨大的时间开销,不适合在初始化过程中使用。在此,定义了一个XML文件,文件名是BelongGroups.xml,每个用户都拥有一份自己的BelongGroups.xml存放在XDMS该用户的用户树下,作用是指明该用户所参与的所有预定义群组。注意,文件名BelongGroups.xml必须定义为关键字,防止它与同目录下的群组结构文件的文件名混淆。它的XML Schema如图3所示。

从图3的XMLSchema中可以看出,元素belong-groups下有多个one-group子元素,代表该用户所参与的多个群组;而一个元素 one-group代表一个群组,记录着这个群组的群组Uri、群组创建者Uri和群组结构文件的文件名。有了这些信息,用户就可以取得群组结构文件进行初始化了。

2.5.2 本地存档文件

本地需要存档 BelongGroups.xml和各个群组的群组结构文件。因为IM XDMS出现故障时,用户无法获得上述文件就无法初始化,用户体验下降。虽然本地存档的文件不一定是服务器上最新的版本,但某种程度上给予用户一定的参考价值。

下一个需要考虑的问题就是,初始化时如何设计服务器上远程文件或本地文件的加载顺序。逻辑上,应该是先加载远程的BelongGroups.xml,加载成功就继续加载各个群组远程的群组结构文件,所有群组的群组结构文件都加载成功后初始化就成功结束了。如果上述过程出现不成功,就加载本地BelongGroups.xml,接着加载本地的群组结构文件。具体流程图见图4。

图3 BelongGroups.xml的XML Schema

图4 群组初始化加载文件流程

3 验证与测试

笔者在VC7.1开发平台上基于SIPHelloIMSClient上实现了群组聊天业务。测试阶段测试项目涵盖了:

(1)群组初始化流程,构造条件使程序通过图4中不同分支分别加载远程和本地文件。

(2)各项群组操作,测试这些操作是否导致IMXDMS上对应群组结构文件正确地改变;改变后,Notifier是否发送XCAP-DIFF事件包Notify消息,订阅了群组结构文件XCAP-DIFF事件包的群组成员是否接收到Notify消息,是否正确地解析消息体并修改本地存档文件。

(3)各项群会话操作,测试这些操作是否导致群会话状态的正确改变;群会话状态改变后Notifier是否会发送Conference事件包的Notify消息,群会话中订阅了群会话Conference事件包的成员是否接收到此Notify消息,是否正确地解析消息体并修改群会话状态。

(4)群组消息收发,测试预定义群组和临时群组消息的发送和接收是否正确。

经测试,群组初始化、群组操作、群会话操作、群组消息收发以及事件包订阅通知等操作正确运行,拥有一定的稳定性。这也验证了本文SIMPLEIM群组聊天业务在IMS客户端上的设计是正确有效的。

4 结束语

IMS客户端市场对群组聊天业务需求旺盛,而业内IMS客户端产品都没有完整地提供该业务,这块空缺造就了群组聊天业务的迫切需求。本文根据最新的SIMPLE IM标准,对群组聊天业务进行详细分析,在IMS客户端体系架构上添加了群组聊天组件,设计出针对预定义群组和临时群组的管理器,特别讨论了群组初始化流程及其问题,并实现在SIPHello IMSClient上。测试表明群组初始化、群组操作、群会话操作、群组消息收发以及事件包订阅通知等均运行成功。下一步工作是继续紧跟SIMPLE IM标准,对标准中的更新对设计进行进一步修改,保持与标准的一致,保证与别的遵循SIMPLEIM标准的IMS客户端产品之间的互联互通。

[1]OMA.Instant messaging using simple[Z].OMA-TS-SIMPLE_IM-V1_0-20080903-C,2008.

[2]OMA.XML document management(XDM)specifi-cation[S].OMA-TS-XDM_Core-V1_1-20080627-A,2008.

[3]OMA.Shared group XDM Specification[Z].OMA-TS-XDM_Shared_Group-V1_0-20090810-C,2008.

[4]OMA.PoC-List Service[S].OMA-SUP-XSD_poc_list-Service-V1_0_2-20090922-A,2009.

[5]Rosenberg J,Schulzrinne H,Levin O.A session initiation protocol(SIP)event package for conference state[S].IETF RFC 4575,2006.

[6]Campbell B,Mahy R,Jennings C.The message session relay protocol(MSRP)[S].IETF RFC 4975,2007.

[7]Rosenberg J.The extensible markup language(XML)configuration Access protocol(XCAP)[S].IETF RFC 4825,2007.

[8]Rosenberg J.Extensible markup language(XML)formats for representing resource lists[S].IETF RFC 4826,2007.

[9]Urpalainen J,Willis D.An extensible markup language(XML)configuration access protocol(XCAP)Diff event package[Z].draft-ietf-sip-xcapevent-08,2009.

[10]Klyne G,Atkins D.Common presence and instant messaging(CPIM):message format[S].IETF RFC 3862,2004.

猜你喜欢

管理器群组聊天
启动Windows11任务管理器的几种方法
应急状态启动磁盘管理器
Boids算法在Unity3D开发平台中模拟生物群组行为中的应用研究
Windows文件缓冲处理技术概述
我就是不想跟你聊天了
敞开门聊天
在Win 7下利用凭据管理器提高访问速度等
聊天不倒王
你我聊天桌等