基于MQTT协议的移动IM系统设计与实现

时间:2022-09-26 01:10:58

基于MQTT协议的移动IM系统设计与实现

【摘 要】为降低移动即时通讯应用的功耗和流量消耗,设计并实现了一个基于MQTT协议的移动即时通讯系统。在保持MQTT标准控制报文结构的基础上,扩展PUBLISH控制报文的有效载荷,设计了即时通讯协议MQTT-IM,通过设计主题订阅,对MQTT的开源实现Moquette进行扩展,增加Moquette-IM模块实现了通讯录、即时通信、状态呈现等系统核心功能。通过数据对比显示,该系统可有效降低功耗和流量消耗,具有很高的实用价值。

【关键词】MQTT协议 即时通讯 移动平台

1 引言

随着移动互联网技术的发展,即时通讯(IM)已经成为最常用的通信工具之一[1]。然而,随着即时通讯各类功能的不断丰富,移动终端不断增长的能耗、流量需求与有限的电量、高昂的资费间的矛盾日益加剧[2],这在一定程度上降低了用户体验。

目前市场上,移动IM系统的实现除了少数采用私有协议外,主要采用XMPP协议和SIMPLE协议。XMPP协议是以XML为基础的开放式即时通讯协议,具有成熟、安全、可扩展性强等优点,但存在协议复杂、消息重复转发、费电、费流量的缺点[3-4],这是一个高耗能的协议。SIMPLE协议是在SIP协议[5]的基础上扩展而来,是主流的即时通讯协议之一,它具有较成熟的音视频标准,支持各类即时消息通信,但它也存在流量消耗较大、扩展复杂等问题。上述两种协议在设计时并未考虑到移动终端的特性,因此在实际应用中表现并不出色。

本文设计了一个基于MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)的移动即时通讯协议MQTT-IM,并实现了基于Android平台的移动即时通讯系统,为实现低功耗和流量消耗的移动IM系统提供了一种新的解决方案。

2 MQTT协议

2.1 MQTT协议简介

MQTT协议是一个C/S架构,是基于/订阅模式的消息传输协议[6]。该协议针对工作在低带宽、网络不可靠的受限设备而设计,运行在TCP/IP网络连接之上,具备以下特点:

使用/订阅模式,提供一对多的消息分发和应用之间的解耦;

消息传输不需要知道负载内容,易于扩展;

提供了三种等级的QoS(Quality of Service,服务质量),分别为“最多一次”(QoS=0)、“至少一次”(QoS=1)、“仅一次”(QoS=2);

很小的传输消耗和协议数据交换,最大限度地减少网络流量。

2.2 MQTT控制报文的结构

MQTT协议通过交换预定义的MQTT控制报文来进行通信,MQTT控制报文由3部分构成:固定报头、可变报头、有效载荷,其中所有控制报文都包含两个字节的固定报头,部分控制报文包含可变报头和有效载荷,其中固定报头的格式如表1所示:

固定报头第一个字节的高四位表示MQTT控制报文的类型,共14种,低四位表示每个MQTT控制报文特定的标志,第二个字节表示剩余长度,即当前报文剩余的字节数,包括可变报头和负载的数据。

固定报头第一个字节的高四位为0011表示PUBLISH类型的控制报文。PUBLISH控制报文的作用是从客户端向服务端或者服务端向客户端传输应用消息,控制报文的有效载荷包含将被的应用消息。MQTT协议解析时不需要知道有效载荷内容,这也是MQTT极易扩展的原因。通过对PUBLISH控制报文有效载荷结构的设计,来增加对特定功能的支持。

3 系统设计

3.1 设计思路

移动IM系统由服务端和客户端构成。服务端侧重即时通信服务的提供,包括通讯协议编解码、登录注册、通讯录、群组、即时消息通信、状态呈现等服务,并暴露接口供客户端调用。客户端侧重提供友好的UI及丰富的即时通信方式,较低的功耗和流量消耗可大大提升用户体验。本文基于MQTT设计即时通讯协议MQTT-IM,通过交换MQTT-IM控制报文来完成不同终端间的即时消息通信。

3.2 MQTT-IM协议的设计

MQTT控制报文的最小长度仅有两个字节,通信时流量消耗非常小。再加上协议本身非常简单,解析代价低,因此功耗也低。基于MQTT设计的MQTT-IM协议不仅继承了MQTT低功耗、低流量消耗的优点,而且通过对PUBLISH控制报文有效载荷的结构设计,解决了不同类型即时消息的传输,从而增加对即时通信功能的支持。

由MQTT控制报文结构的介绍可知,设计以MQTT协议为基础的即时通讯协议MQTT-IM的实质即对PUBLISH控制报文的有效载荷的结构进行设计,通过对有效载荷结构的设计,来满足各种类型的即时消息的传输。图1中虚线框中的内容为MQTT-IM控制报文的结构。

图1虚线框中的MQTT-IM控制报文中包含5个字段,这5个字段的具体含义如下。

type:即时消息类型字段,占1个字节,不可为空,从0x00-0xff共可表示256种类型的即时消息。本文共设计了22种即时消息类型,占用了0x00-0x15,剩余部分0x16-0xff可用于扩展新的即时消息类型。这22种即时消息类型可分为7大类,分别为注册类型、登录类型、通讯录类型、群组类型、即时信息类型、状态呈现类型、系统通知类型,每大类包含一种或多种类型,比如状态呈现类型包括user_online、user_offline两种类型。

from:发送方字段,变长,可为空,表示发送方ID,用于唯一标识发送方身份。

to:接收方字段,变长,可为空,标识接收方ID,用于唯一标识接收方身份。

timestamp:时间戳字段,占4个字节,不可为空,针对特定的from/to字段唯一标识某条即时消息,可用于消息排序。

content:消息正文字段,变长,可为空,针对不同的type值,content结构不同。content的结构分为7种,分别对应上述type字段的7大类型,比如当type字段属于状态呈现类型时,content结构由status基本字段构成。

MQTT-IM控制报文中5个字段的整体结构使用Protocol Buffers设计,通过这种设计方式可以获得比xml/json更快的编解码速度和更低的存储空间占用[7]。

3.3 总体架构设计

如图2所示,移动IM系统服务端由4部分组成,分别为后台管理系统、核心功能及接口层、基础服务层、数据库。Android客户端由登录注册、通讯录、群组、状态呈现、即时通信、sqlite存储等6个功能模块组成。

服务端后台管理系统提供了用户管理、数据统计、日志查询、参数设置等服务,可通过后台管理系统观测系统运行情况。

服务端的核心功能与接口层实现了跟IM密切相关的六种核心功能及对应的接口,分别是:登录注册管理负责用户的登录注册请求;通讯录管理负责处理添加/删除联系人,获取联系人列表等用户请求;群组管理负责处理创建/解散群组、添加群组、管理群成员、获取群组/群成员信息等用户请求;状态呈现管理负责响应用户状态变化事件;存储管理负责处理即时信息的数据库存储以及查询即时信息历史记录的用户请求。服务端对外提供了各个核心功能的接口,供客户端调用。

服务端基础服务层提供了3种服务:主题订阅服务供登录注册管理、通讯录管理、群组管理等功能调用,客户端订阅相关主题,服务端将即时消息转发给匹配主题的客户端;消息服务供除存储管理外的其他核心功能调用,提供即时消息的服务;MQTT-IM编解码服务在对MQTT-IM控制报文编码解码时会被调用。

数据库部分主要作用是提供即时消息记录的增删改查操作,同时提供存储用户相关信息的功能。

Android客户端划分为6个功能模块,通过调用服务端提供的相应接口可实现不同移动终端之间的即时通信。

4 系统实现

Moquette是一个Java版本的MQTT服务端开源实现,基于事件驱动,底层使用Netty网络框架完成协议的编解码工作。Moquette是轻量级、易于集成的,本文使用它作为MQTT协议服务端编解码工作,通过对Moquette二次开发,增加Moquette-IM模块,实现了状态呈现等功能。服务端采用Struts2+Spring+Hibernate集成框架进行开发,使用Mysql数据库存储用户相关信息及即时消息记录。下面以主题订阅、即时通信、状态呈现3个功能为例,详细介绍其实现过程。

4.1 主题订阅的实现

客户端订阅感兴趣的主题,服务端选择匹配的主题将收到的即时消息推送到对应的客户端,通过这种方式实现不同移动终端间的通信。本文设计了3种类型的主题,客户端通过订阅这3种类型的主题,可以实现通讯录好友间的单聊、群组聊天、状态呈现功能。这3种类型的主题分别为:

f/:通讯录类主题,这类主题由前缀“f/”加用户名构成,通过订阅这类主题可以接收到通讯录内好友的即时消息。

g/:群组类主题,这类主题由前缀“g/”加群组名称构成,通过订阅这类主题可以接收到群组内即时消息。

s/:状态类主题,这类主题由前缀“s/”加用户名构成,通过订阅这类主题可以接收到状态改变类型的即时消息。

4.2 即时通信的实现

客户端订阅f/和g/类型的主题时所使用的QoS与在该类主题上即时消息时的QoS取值相同,均为2,保证客户端有且只收到一次即时消息。通讯录内好友间单聊的具体实现为:每个用户在注册成功之后,客户端会自动订阅f/主题,其中uid为该用户的用户名。用户A与通讯录内的好友B进行单聊操作时,用户A在主题f/B上单聊消息,服务端对该MQTT-IM控制报文解码,得到单聊消息存储在数据库,并向订阅了主题f/B的客户端(即好友B)转发该报文,好友B收到该报文进行解码得到单聊消息,完成一次单聊操作。群聊的实现类似单聊,不同之处在于订阅主题的时机不同,群聊是在每个用户成功加入一个新的群组之后,客户端自动订阅g/主题,其中gid为该群组的群组名称,之后的实现过程类似于单聊,这里不再赘述。

4.3 状态呈现的实现

用户在成功注册后,客户端自动订阅主题s/,其中为该用户的用户名,用户通讯录中好友状态发生变化时,服务端会往与该好友有关的s/主题上状态改变类型的即时消息,之后用户在客户端会收到相应的提示信息。

QoS取值越低,服务端压力越小且客户端消耗的流量也越少,但通信质量会有所降低。客户端订阅s/类型的主题时QoS取值为0,服务端在s/类型的主题上状态改变类型的即时消息时QoS取值也为0,这种情况下状态改变消息无论成功与否只发送一次,无法保证该类消息每次都被客户端所接收到,因此在Android客户端提供了下拉刷新状态机制,这样在降低服务端压力以及客户端流量的同时,保证了用户体验。

状态呈现的实现是在Moquette的基础上,进行二次开发,增加了Moquette-IM模块,该模块使用模式对Moquette中的MQTT协议逻辑处理类ProtocolProcessor进行,在调用建立连接处理方法processConnect()和断开连接处理方法processDisconnect()之前进行增强处理,增强处理的时机如图3所示,具体增强处理操作为将状态改变信息封装成MQTT-IM控制报文,由服务端到对应的s/主题上,处理完成之后继续执行processConnect/processDisconnect原有的操作,当客户端接收到该MQTT-IM报文后,通讯录中好友头像颜色作出变化。使用模式降低了Moquette后期维护的成本,同时也符合开闭原则,在不对Moquette原有代码修改的前提下,扩展了状态呈现功能。

4.4 客户端实现

Android客户端实现了6大功能模块,分别为登录注册、通讯录、群组、状态呈现、即时通信、sqlite存储。另外,fusesource-mqtt-client是一个Java版本的MQTT客户端开源实现,本文使用它作为Android客户端MQTT协议编解码工具。注册登录成功之后,使用SharedPreferences类存储用户登录信息,之后可自动登录。通讯录中显示好友列表,可对任意好友发起聊天。群组功能实现了添加群组、搜索群组、管理群组等操作。状态呈现可显示好友在线和离线两种状态。即时通信功能中,单聊和群聊可以使用文字、表情、图片、语音等多种方式进行。sqlite存储即时消息历史记录和会话列表等。Android客户端中群聊的显示效果如图4所示。

5 测试

为了验证MQTT-IM协议有更低的功耗和流量消耗,更加适合移动设备,将MQTT-IM协议的实现和XMPP协议的实现进行了对比,其中MQTT-IM协议的实现使用本文中的Android客户端,XMPP协议的实现利用asmack+openfire搭建,流量和功耗的测试使用高通Trepn分析器Qualcomm Trepn Profiler[11]作为测试工具。

MQTT-IM和XMPP两种实现在耗电量和IM流量消耗方面的对比结果如图5和图6所示。

图5中横轴表示时间,纵轴表示耗电量,可看出MQTT-IM比XMPP耗电量低。IM流量测试中选择3种大小的文本分别进行测试,图6中横轴表示不同大小文本中汉字的个数,纵轴表示所消耗的IM流量,可以看出MQTT-IM比XMPP在IM流量消耗上降低约2~4倍。

6 结束语

本文针对目前移动IM解决方案中存在高功耗、费流量等问题,基于MQTT设计了MQTT-IM协议,并采用MQTT-IM设计并实现了一个移动IM系统,测试结果表明该系统可有效降低功耗和流量消耗,具有很高的实用价值。本系统在通信安全方面还存在不足,这也是下一步工作的重点。

参考文献:

[1] 陈为人. 一种即时通讯移动终端的研究[J]. 移动通信, 2016,40(6): 80-82.

[2] 罗军舟,吴文甲,杨明. 移动互联网:终端、网络与服务[J]. 计算机学报, 2011,34(11): 2029-2051.

[3] Cridland D. XEP-0286: XMPP on Mobile Devices[J]. Xmpp Standards Foundation, 2010.

[4] 彭亮. 面向移动设备的XMPP协议的研究与应用[D]. 长沙: 中南大学, 2014.

[5] Niemi A. Session Initiation Protocol (SIP) Extension for Event State Publication[J]. Networking&Communication Engineering, 2004(2).

[6] MQTT org. MessageQueuingTelemetry Transport[EB/OL]. [2016-06-17]. http:///.

[7] eishay. jvm-serializers[EB/OL]. [2016-06-17]. https:///eishay/jvm-serializers/wiki.

[8] 吴吉义,李文娟,黄剑平,等. 移动互联网研究综述[J]. 中国科学:信息科学, 2015,45(1): 30-36.

[9] Li N, Du Y, Chen G. Survey of cloud messaging push no-tification service[A]. Information Science and Cloud Computing Companion (ISCC-C), 2013 International Conference on[C]. 2013: 273-279.

[10] 许金喜,张新有. Android平台基于MQTT协议的推送机制[J]. 计算机系统应用, 2015,24(1): 185-190.

[11] Qualcomm Technologies Inc. Trepn Power Profiler, A product of Qualcomm Technologies[EB/OL]. [2016-06-17]. https:///software/trepn-power-Profiler.

上一篇:基于模因论的英语语音教学策略分析 下一篇:高中历史教学中存在的问题及实验探索