基于Jabber协议的移动即时通讯系统研究与实现

摘  要  本文利用支持Jabber协议的开源服务器WildFire,在基于J2ME平台的手机上实现了一个移动即时通讯系统,该系统不但具有传统即时通讯的文本信息传递功能,还具备拍照、传递照片、群组聊天以及查看资讯等功能。

    关键字  J2ME;即时通讯;Jabber;WildFire;XML;XMPP
 

 

1  课题研究背景

    移动IM(Instant Message),也就是移动即时信息(即时通信、即时通讯)工具,是移动终端与即时通讯工具的结合。从最初的移动QQ、手机MSN,到陆续出现的“飞信”、“超信”、“灵信”,当然还有不容忽视的PICA,各类型的移动即时通讯工具让用户通过手机就可以与朋友或工作伙伴进行实时交谈、互传信息、娱乐消遣,它们正改变着我们的沟通模式甚至生活习惯。但长期以来各IM软件厂商推出的IM软件相互独立,缺乏基于统一标准的互用性,使得各种IM系统之间无法互相发送信息,例如AOL与Yahoo,MSN与AOL,MSN与QQ等,它们之间就不能相互通信。
    因此,制订一种统一的协议就迫在眉睫,这种统一协议应当可用于E-mail、Web和语音流的简单邮件传输协议(SMTP)、HTTP和实时协议(RTP)等IM应用。由Jabber组织 发展的Jabber协议,其中包含支持符合IETF规范的即时消息和Presence技术的基本协议形成了XMPP协议,XMPP(Extensible Messaging and Presence Protocol,即可扩展消息处理现场协议)为用于现场的消息路由处理的XML数据流协议,被确立为IETF标准。
    本文的研究工作正是基于这一背景。(本文缺陷则是未能实现音视频通讯,这块可以在后续的功能扩展中得以改善,考虑引用成熟的视音频平台AnyChat SDK。)

2  总体方案设计

2.1  总体思路

    移动IM采用的是客户/服务器架构的体系结构,具有服务器端和客户端,其中服务器可以分为两个部分:Jabber服务器和数据库系统。服务器采用基于Jabber的开源服务器WildFire 3.0.1,用户数据和系统信息的存储由MySQL数据库实现,客户端J2ME进行开发。

2.2  Jabber与WildFire服务器

    Jabber就像ICQ,MSN一样,是一个基于Internet的即时通讯系统,但是同这些即时通讯软件不同的是,它是一个开放的即时通讯系统,也是一个基于XML Stream 的协议,用于在Internet上的两个实体之间交换信息,现场状态(presence)和其它的结构化信息。你可以自己架设自己的Jabber服务器,使用不同的Jabber Client 软件,而不像ICQ或MSN,依赖于AIM或MSN的服务器和软件。IETF已经将Jabber定为即时通讯和现场技术的标准协议,称为XMPP(Extensible Messaging and Presence Protocol),相关的规范是RFC3920和RFC3921。
    Wildfire是一款获得许多荣誉的Jabber即时消息服务器,采用Java开发,可以使用任何支持Jabber的客户端如psi、gaim等连接。其主要特点有易于安装、管理、定制以及和其它应用程序集成,有基于GPL的开放源代码版本和商业版本。

2.3  J2ME介绍

    J2ME是SUN公司在小型设备上的开发平台,它的主要技术优势在于:良好的跨平台能力与J2EE后端无缝的结合能力和Java语言的优良特色,如简单安全以及现有的Java平台上的开发工具。

3  关键技术研究

3.1  与MSN、OICQ系统通讯

    Jabber服务器中的Transport组件是沟通Jabber和非Jabber协议之间差异的组件。当使用Jabber服务器访问非Jabber系统时,Transport组件隐藏了系统之间的差异,这样,用户在访问的时候根本感觉不到自己访问的是外部的系统。但是,当用户第一次访问非Jabber系统时,需要向Jabber transport注册,注册内容就是用户名和将要使用的外部系统之类的信息。一旦注册成功之后,就可以在外部系统上发送和接收消息。

3.2  网络连接策略

    本文的移动即时通讯系统支持Http和Socket两种连接方式。其中,Socket连接方式为默认连接方式,但是不同品牌和型号的手机以及 中国移动各地区网络对Socket的支持有差异,所以当Socket连接不被支持的时候系统会自动切换到HTTP连接方式。
    此外,在国际上,使用Http连接方式通常只有一种GPRS接入方式,但中国有CMWAP和CMNET两种方式。其中CMNET拥有完全的Internet访问权,而中国移动对CMWAP做了一定的限制,主要表现在CMWAP接入时只能访问GPRS网络内的IP(10.0.0.172:80),而无法通过路由访问Internet(少数地区的移动网络可能不存在这一限制)。我们用CMWAP访问Internet就是通过WAP网关协议或它提供的HTTP代理服务实现的。

3.3  拍照及照片传送技术

    客户端通过mobile media api(mmapi)中的videocontrol来实现,通过调用videocontrol的getsnapshot()方法实现。然后,对数据进行base64编码转换为字符串嵌入xml流;服务器收到收据后解码并利用J2ME的Image类还原图像。

3.4  消息传递中编码考虑

    在系统实际开发中,我们通常面临不同的移动终端,有些设备的编码就必须特殊处理。比如,本文采用NOKIA的S60平台机型,NOKIA S60手机在接收ISO8859-1编码时不是与大多数手机那样直接以UTF-8编码方式接收,它只支持ISO8859-1方式接收。但是这种方式接收后,封装在ISO8859-1流中的xml的数据会又一次被进行ISO8859-1编码转换,等于是在对这条封装在ISO8859-1流中的xml语句又封装了一个ISO8859-1的外壳。所以客户端要想得到UTF-8的数据,必须进行两次编码转换,首先剥掉这层ISO8859-1的外壳,得到正常的ISO8859-1数据流,才能向其它机型那样进行正常的ISO8859-1向UTF-8编码的转换。

4  关键模块实现

    本文实现的移动即时通讯系统支持群组消息模式。在群组消息模块中,登录的注册用户可以通过手机来实现传统PC平台的聊天室功能。Jabber的群组聊天或会议机制允许多人同时进行交流,这是对传统即时通讯功能的扩展。具体的业务流程是首先由用户读取群组列表选择登录目标。然后,进行登录并将用户ID注册到这个组中。完成注册后,系统会将本组内的其它成员信息(比如成员列表)发送到当前用户的客户端上。这时系统的会话组件已经为这个群组内地成员做好了消息传递准备,也就是说某个用户的信息可以被服务器传递到群组中的每一个成员。具体的实现过程如下:

4.1  读取群组列表名单

    当用户进入聊天室模块时,客户端首先发送一个xml语句向服务器发出请求,服务器收到后返回一个xml语句,客户端解析后读出聊天室列表,并进行屏幕显示,供用户选择。
发送的xml语句:
<iq id='discoRooms' to='conference.occo' type='get'>
<query xmlns='http://Jabber.org/protocol/disco#items'/>
</iq>
接收的xml语句:
<iq to='605414@occo/p.ne680.13.0' id='discoRooms' from= 'conference.occo' type='result'>
<query xmlns='http://Jabber.org/protocol/disco#items'>
<item maxusers='30' name='绿色军营' jid='[email protected]' occupants='25'>
</item>
<item maxusers='30' name='缘分天空' jid='[email protected]' occupants='18'>
</item>
<item maxusers='20' name='玫瑰情话' jid='[email protected]' occupants='8'>
</item>
</query>
</iq>

4.2  用户的在群组中的登记

    需要加入一个指定的群组时(它的ID已经由用户指定或在接到聊天邀请时确定),首先发送一个<presence>元素。注意在发送中不要添加resource名,这是老的groupchat的做法,现在的conference已经不采用了。如果你需要向下兼容性,可以发送resource name。
    接下来,发送包含xmlns=”Jabber:iq:browse”的<iq type=”set”>,这个请求包含了一个或多个<nick>元素,它指明了你希望加入的会议的别名。一旦你接到一个成功回应,也就意味着你已经加入这个聊天室。
    客户端接收成员信息语句:
<presence to='605414@occo/p.ne680.13.0' id='chatlog' from= '[email protected]/月儿'>
<icon>16</icon><level>3</level>
<x xmlns='http://Jabber.org/protocol/muc#user'>
<item affiliation='none' icon='16' jid='639139@occo/p.sek700.11.0' role='participant'>
</item>
</x>
</presence>
    当客户端开始接收信息时,就意味指着请求成功了,那么客户端需要建立一个GroupChat实例,并且不断将接收的信息添加到这个实例中。

4.3  群组成员列表的读取

    每个群组都有成员列表,表明当前在群组中的人员。它会随着人员加入或离开而改变。
    本系统通过在GroupChat类中设置一个MUCUser的属性,它是一个Vector的变量,每一个元素都是一个MUCUser实例,存放着每一个聊天室成员的个人信息,如jid、昵称、等级、级别等。客户端每收到一条presence语句,解析后都会更新这个属性。
群组成员的presence语句:
<presence to='605414@occo/p.ne680.13.0' id='chatlog' from= '[email protected]/月儿'>
<icon>2</icon>
<level>4</level>
<x xmlns='http://Jabber.org/protocol/muc#user'>
<item role='participant' jid='605414@occo/p.ne680. 13.0' affiliation='none'></item>
</x>
</presence>

4.4  群组中即时消息的发送

    一般来说群组消息传递时有两种最基本的形式,一种是公共消息,就是对所有人发送的信息,这种信息当前群内的所有成员都可以收到;另一种是私有信息,这种信息其实是群中的点对点消息传递,也就是说虽然是在群中,但服务器只会将其发送给群组中指定的成员。在本系统的群组消息模块中,成功的实现了这两种方式。
    群组消息的格式与点对点消息传递的格式基本相同,它们都是通过Message对象进行封装的。它们的区别在于type类型一个是’groupchat’,而另一个是’chat’。服务器端收到消息后,会根据type的值来判断这条消息是否群组消息。下面各给出一条xml语句来说明:
公共消息格式:
<message to='605414@occo/p.ne680.13.0' from='20_sky@ conference.occo/月亮' type='groupchat'>
<body>你好</body>
<x stamp='2006/11/19/  18:21:48' xmlns='Jabber:x:delay'></x>
<x time='2006/11/19/  18:21:48' xmlns='Jabber:x:delay'></x>
<x stamp='20061119T10:23:07' from='733865@occo/ p.n3230.12.0' xmlns='Jabber:x:delay'>
</x>
</message>
私有消息格式:
<message type='chat' from = '605414@occo' to ='30_eye@ conference. occo/太阳'>
<body>hello</body>
<x xmlns='Jabber:x:delay' stamp='2006/11/19/  12:0:16'/>
</message>
    在Gm即时通讯系统中,对于客户端来说,一个聊天室就是一个GroupChat类型的对象,那么加入一个聊天室,本质上就是创建一个GroupChat对象的实例。对GroupChat实例的访问我们可以群组消息传递的所有功能。GroupChat类继承了Chat类,而Chat类又继承至Conversation类,可以说它是一个由一个基本会话类不断扩展而来的,即一个功能更强大的会话类。它的最主要的功能就是对当前聊天室内的成员以及他们的发言进行管理,比如添加新的信息(新的发言)、成员的变更等等。GroupChat还有一个非常重要的方法,就是broadcast()方法。通过这个方法将用户的jid信息,说话的对象,发言的内容等封装为一个标准的Message xml语句,然后交给通讯线程发送出去。
    图1、图2是软件运行的部分功能截图。
基于Jabber协议的移动即时通讯系统研究与实现   
图1  群组消息传递截图
基于Jabber协议的移动即时通讯系统研究与实现
图2  好友列表读取显示截图

5  结论

    本系统不但实现了传统即时通讯的文本信息传递功能,还具备了拍照、传递照片、群组聊天以及查看资讯等功能。另外,针对国内手机 网络和用户的特点和现状,系统对网络连接进行了优化。它能够支持Socket和Http两种网络连接方式,并且当客户端发现当前网络和手机不支持Socket连接时,能够自动切换到Http连接方式。
    此外,本文主要工作在Nokia、Motorola、SE等品牌主流机型都得到实现,整个系统目前运转正常,现注册用户已超过50万,取得了一定的社会和 经济效益。

参考文献

[1]. Jabber, Inc. Advantages of Jabber as a Platform for Developing Collaborative Applications, May 2002
[2]. Jabber, Inc. The Presence Value of Presence: Leveraging your Instant Messaging Investment. August,2003
[3]. Shigeoka I. Instant Messaging in Java. 2002
[4]. Peter Saint-Andre. Jabber Technology Overview. Jabber,Inc.,June 2002
[5]. DJ Adams. Programming Jabber, 2002
[6]. Madoka Mitsuoka et al. Instant Messaging with Mobil Phones to Support Awareness, 2001
[7].张弛等. 基于J2ME平台的IPv6 Jabber系统实现. 计算机应用研究, 2005(6)

你可能感兴趣的:(应用服务器,socket,网络协议,网络应用,中国移动)