1、1 / 8基于 Jabber 协议的移动即时通讯系统研究与实现摘 要 本文利用支持 Jabber 协议的开源服务器WildFire,在基于 J2ME 平台的手机上实现了一个移动即时通讯系统,该系统不但具有传统即时通讯的文本信息传递功能,还具备拍照、传递照片、群组聊天以及查看资讯等功能。 关键字 J2ME;即时通讯;Jabber;WildFire;XML;XMPP 1 课题研究背景 移动IM(Instant Message),也就是移动即时信息(即时通信、即时通讯)工具,是移动终端与即时通讯工具的结合。从最初的移动 QQ、手机 MSN,到陆续出现的“飞信” 、 “超信” 、“灵信” ,当然还有不
2、容忽视的 PICA,各类型的移动即时通讯工具让用户通过手机就可以与朋友或工作伙伴进行实时交谈、互传信息、娱乐消遣,它们正改变着我们的沟通模式甚至生活习惯。但长期以来各 IM 软件厂商推出的 IM 软件相互独立,缺乏基于统一标准的互用性,使得各种 IM 系统之间无法互相发送信息,例如 AOL 与 Yahoo,MSN 与AOL,MSN 与 QQ 等,它们之间就不能相互通信。 因此,制订一种统一的协议就迫在眉睫,这种统一协议应当可用于E-mail、Web 和语音流的简单邮件传输协议(SMTP)、HTTP和实时协议(RTP)等 IM 应用。由 Jabber 组织发展的 Jabber2 / 8协议,其中
3、包含支持符合 IETF 规范的即时消息和 Presence技术的基本协议形成了 XMPP 协议,XMPP(Extensible Messaging and Presence Protocol,即可扩展消息处理现场协议)为用于现场的消息路由处理的 XML 数据流协议,被确立为 IETF 标准。 本文的研究工作正是基于这一背景。2 总体方案设计 总体思路 移动 IM 采用的是客户/服务器架构的体系结构,具有服务器端和客户端,其中服务器可以分为两个部分:Jabber 服务器和数据库系统。服务器采用基于 Jabber 的开源服务器 WildFire ,用户数据和系统信息的存储由 MySQL 数据库实现
4、,客户端 J2ME 进行开发。 Jabber 与 WildFire 服务器 Jabber 就像 ICQ,MSN 一样,是一个基于 Internet 的即时通讯系统,但是同这些即时通讯软件不同的是,它是一个开放的即时通讯系统,也是一个基于 XML Stream 的协议,用于在 Internet 上的两个实体之间交换信息,现场状态(presence)和其它的结构化信息。你可以自己架设自己的 Jabber 服务器,使用不同的Jabber Client 软件,而不像 ICQ 或 MSN,依赖于 AIM 或MSN 的服务器和软件。IETF 已经将 Jabber 定为即时通讯和现场技术的标准协议,称为 X
5、MPP(Extensible Messaging and Presence Protocol),相关的规范是 RFC3920 和RFC3921。 Wildfire 是一款获得许多荣誉的 Jabber 即时消息服务器,采用 Java 开发,可以使用任何支持 Jabber 的3 / 8客户端如 psi、gaim 等连接。其主要特点有易于安装、管理、定制以及和其它应用程序集成,有基于 GPL 的开放源代码版本和商业版本。 J2ME 介绍 J2ME 是 SUN 公司在小型设备上的开发平台,它的主要技术优势在于:良好的跨平台能力与 J2EE 后端无缝的结合能力和 Java 语言的优良特色,如简单安全以及
6、现有的 Java 平台上的开发工具。3 关键技术研究 与 MSN、OICQ 系统通讯 Jabber 服务器中的Transport 组件是沟通 Jabber 和非 Jabber 协议之间差异的组件。当使用 Jabber 服务器访问非 Jabber 系统时,Transport 组件隐藏了系统之间的差异,这样,用户在访问的时候根本感觉不到自己访问的是外部的系统。但是,当用户第一次访问非 Jabber 系统时,需要向 Jabber transport 注册,注册内容就是用户名和将要使用的外部系统之类的信息。一旦注册成功之后,就可以在外部系统上发送和接收消息。 网络连接策略 本文的移动即时通讯系统支持
7、Http 和 Socket 两种连接方式。其中,Socket 连接方式为默认连接方式,但是不同品牌和型号的手机以及中国移动各地区网络对 Socket 的支持有差异,所以当 Socket连接不被支持的时候系统会自动切换到 HTTP 连接方式。 此外,在国际上,使用 Http 连接方式通常只有一种 GPRS接入方式,但中国有 CMWAP 和 CMNET 两种方式。其中 CMNET拥有完全的 Internet 访问权,而中国移动对 CMWAP 做了一4 / 8定的限制,主要表现在 CMWAP 接入时只能访问 GPRS 网络内的 IP(:80),而无法通过路由访问 Internet(少数地区的移动网络
8、可能不存在这一限制)。我们用 CMWAP 访问Internet 就是通过 WAP 网关协议或它提供的 HTTP 代理服务实现的。 拍照及照片传送技术 客户端通过mobilemediaapi(mmapi)中的 videocontrol 来实现,通过调用 videocontrol 的 getsnapshot()方法实现。然后,对数据进行 base64 编码转换为字符串嵌入 xml 流;服务器收到收据后解码并利用 J2ME 的 Image 类还原图像。 消息传递中编码考虑 在系统实际开发中,我们通常面临不同的移动终端,有些设备的编码就必须特殊处理。比如,本文采用 NOKIA 的 S60 平台机型,N
9、OKIA 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 关键模块实现
10、 本文实现的移动即时通讯系统支持群组消息模式。在群组消息模5 / 8块中,登录的注册用户可以通过手机来实现传统 PC 平台的聊天室功能。Jabber 的群组聊天或会议机制允许多人同时进行交流,这是对传统即时通讯功能的扩展。具体的业务流程是首先由用户读取群组列表选择登录目标。然后,进行登录并将用户 ID 注册到这个组中。完成注册后,系统会将本组内的其它成员信息(比如成员列表)发送到当前用户的客户端上。这时系统的会话组件已经为这个群组内地成员做好了消息传递准备,也就是说某个用户的信息可以被服务器传递到群组中的每一个成员。具体的实现过程如下:读取群组列表名单 当用户进入聊天室模块时,客户端首先发送一
11、个 xml 语句向服务器发出请求,服务器收到后返回一个 xml 语句,客户端解析后读出聊天室列表,并进行屏幕显示,供用户选择。发送的 xml 语句: 接收的 xml 语句: 用户的在群组中的登记 需要加入一个指定的群组时(它的 ID 已经由用户指定或在接到聊天邀请时确定),首先发送一个元素。注意在发送中不要添加 resource 名,这是老的 groupchat 的做法,现在的 conference 已经不采用了。如果你需要向下兼容性,可以发送 resource name。 接下来,发送包含 xmlns=”Jabber:iq:browse”的,这个请求包含了一个或多个元素,它指明了你希望加入的
12、会议的别名。一旦你接到一个成功回应,也就意味着你已经加入这个聊天室。 客户端接收成员信息语句:163 当客户端开6 / 8始接收信息时,就意味指着请求成功了,那么客户端需要建立一个 GroupChat 实例,并且不断将接收的信息添加到这个实例中。 群组成员列表的读取 每个群组都有成员列表,表明当前在群组中的人员。它会随着人员加入或离开而改变。 本系统通过在 GroupChat 类中设置一个 MUCUser的属性,它是一个 Vector 的变量,每一个元素都是一个MUCUser 实例,存放着每一个聊天室成员的个人信息,如jid、昵称、等级、级别等。客户端每收到一条 presence语句,解析后都
13、会更新这个属性。群组成员的 presence 语句:24 群组中即时消息的发送 一般来说群组消息传递时有两种最基本的形式,一种是公共消息,就是对所有人发送的信息,这种信息当前群内的所有成员都可以收到;另一种是私有信息,这种信息其实是群中的点对点消息传递,也就是说虽然是在群中,但服务器只会将其发送给群组中指定的成员。在本系统的群组消息模块中,成功的实现了这两种方式。 群组消息的格式与点对点消息传递的格式基本相同,它们都是通过 Message 对象进行封装的。它们的区别在于 type 类型一个是groupchat ,而另一个是chat。服务器端收到消息后,会根据 type 的值来判断这条消息是否群
14、组消息。下面各给出一条 xml 语句来说明:公共消息格式:你好私有消息格式:hello 在 Gm 即时通讯系统中,对于客户端来说,一个聊天室就是一个7 / 8GroupChat 类型的对象,那么加入一个聊天室,本质上就是创建一个 GroupChat 对象的实例。对 GroupChat 实例的访问我们可以群组消息传递的所有功能。GroupChat 类继承了Chat 类,而 Chat 类又继承至 Conversation 类,可以说它是一个由一个基本会话类不断扩展而来的,即一个功能更强大的会话类。它的最主要的功能就是对当前聊天室内的成员以及他们的发言进行管理,比如添加新的信息(新的发言)、成员的变
15、更等等。GroupChat 还有一个非常重要的方法,就是 broadcast()方法。通过这个方法将用户的 jid 信息,说话的对象,发言的内容等封装为一个标准的 Message xml 语句,然后交给通讯线程发送出去。 图 1、图 2 是软件运行的部分功能截图。 图 1 群组消息传递截图图 2 好友列表读取显示截图 5 结论 本系统不但实现了传统即时通讯的文本信息传递功能,还具备了拍照、传递照片、群组聊天以及查看资讯等功能。另外,针对国内手机网络和用户的特点和现状,系统对网络连接进行了优化。它能够支持 Socket 和 Http 两种网络连接方式,并且当客户端发现当前网络和手机不支持 Soc
16、ket 连接时,能够自动切换到Http 连接方式。 此外,本文主要工作在Nokia、Motorola、SE 等品牌主流机型都得到实现,整个系统目前运转正常,现注册用户已超过 50 万,取得了一定的社会和经济效益。参考文献1. Jabber, Inc. 8 / 8Advantages of Jabber as a Platform for Developing Collaborative Applications, May 20022. Jabber, Inc. The Presence Value of Presence: Leveraging your Instant Messaging I
17、nvestment. August,20173. Shigeoka I. Instant Messaging in Java. 20024. Peter Saint-Andre. Jabber Technology Overview. Jabber,Inc.,June 2002 5. DJ Adams. Programming Jabber, 20026. Madoka Mitsuoka et al. Instant Messaging with Mobil Phones to Support Awareness, 20017.张弛等. 基于 J2ME 平台的 IPv6 Jabber 系统实现. 计算机应用研究, 2017(6)