APP下载

基于AndroidPN的可靠自定义推送系统实现

2018-06-21成焕宇周紫薇

软件导刊 2018年5期

成焕宇 周紫薇

摘 要:针对目前Android系统自带推送服务不稳定及第三方推送服务不安全问题,采用MINA框架、XMPP协议、Asmack等相关技术,并以开源AndroidPN作为实现基础,设计了离线缓存机制和断线重连功能,实现了一个可靠的自定义推送系统,增加了多媒体消息推送,满足了当前信息多样化需求。实验结果表明,该系统稳定性高、安全性强,能够保证一定的消息达到率,具有一定推广及使用价值。

关键词:消息推送;MINA;XMPP;Asmack

DOI:10.11907/rjdk.172798

中图分类号:TP319

文献标识码:A 文章编号:1672-7800(2018)005-0083-03

Abstract:Mobile messaging suffers from problems like instability of the Android system service and third-party push service insecurity. In order to meet the arrival rate of certain push messages, this paper applies MINA framework, XMPP protocol, Asmack and other related technologies, and employs open source AndroidPN as the basis for the realization of the design of the offline cache mechanism and disconnection function in the achievement of a reliable user defined push system so as to increase the push of multimedia messages and meet the needs of the current diversification of information. It is confirmed that the system has high stability and strong security to guarantee certain rate of news arrival, and thus has market and application value.

Key Words:message push; MINA; XMPP; Asmack

0 引言

随着移动通信技术的快速发展和Web应用技术的不断提高,移动端成为人们获取消息的主要途径。依据传输方式,消息推送可以分为拉取和推送两大类。拉取一般采用轮询方式实现,但如果轮询的频率太快会消耗大量移动端的流量和电量,如果太慢则会导致消息延迟,甚至导致重要消息遗漏, 所以适用场景有限。而推送方式是指服务器主动给客户端推送消息,不但可以控制数据的传输,使其尽量迅速地抵达用户端,而且可以最大程度地降低网络流量与系统资源损失[1]。推送的实现方式一般都是通过客户端向服务器发送心跳包来维持TCP长连接[2]。

Android系统自身提供GCM(Google Cloud Messaging)服务,但是Google对每一个应用能够发送的总消息数以及向一台特定设备发送的消息数作出了限制,而且在Android客户端能运行GCM有一定的条件限制[3]:很多情况下需要用户在移动设备上绑定谷歌账号,容易导致用户隐私泄露。并且由于国内对于Google服务有一定的限制,使得Google推送服务不稳定。目前一般都选择第三方实现自己的推送需求,市场上有许多第三方推送服务,比如极光推送等。但是第三方推送需要连接第三方公司的服务器,可能会产生数据不安全[4],对于一些重要的功能需要收费而且不能保证消息一定到达客户端。这样使得第三方推送在特定的应用场景中存在一定的缺陷,比如在水费缴费类型的APP中需要推送用户欠费通知、用户缴费以及用户用水情况等,保证客户一定能收到推送消息以及涉及用户的一些敏感信息。本文实现的推送系统以满足一定的推送消息到达率为约束条件,实现对于推送消息是否已到达客户端必须有明确的反馈。基于以上分析,本文在开源AndroidPN的基础上实现一个推送系统。本系统根据客户端是否接收到消息反馈决定是否将消息保存到服务器,当客户端再次上线时将服务器里未接收的消息推送给客户端,以及客户端在网络不稳定或进行网络切换时主动与服务器进行重連,因而需要设计具有推送消息的离线缓存机制和客户端断线重连功能,并增加多媒体消息推送以满足当前信息多样化框架需求,保证每条推送消息都能到达客户端,最大程度上保证消息的到达率。

1 系统概述

本系统总体分为3个主要功能模块:离线消息推送模块、客户端断线重连模块、富媒体消息推送模块。系统总体如图1所示。

消息推送如图2所示。

如图2所示,推送消息通过推送管理员将消息推送出去。推送的消息可以根据推送设备在服务器注册生成的唯一标识进行推送[5],客户端收到推送消息就会向服务器发送一条反馈消息,进而服务器将推送的消息在数据库中删除。

对各个功能模块的描述如下:

(1)离线消息缓存机制:主要是解决服务器向客户端推送消息但客户端未收到的情况。为了保证消息推送能满足到达率的要求,在推送消息时,如果用户不在线,则需要将消息保存到数据库中,当用户下次上线并推送消息时先在数据库中查找并推送给用户,为此需设计一个离线消息缓存的机制。

(2)断线重连模块:为了保证消息推送能满足到达率的要求,当客户端网络状态不好或者网络状态发生改变以及用户登录异常时,客户端能自动与服务器建立连接从而保证客户端在线接收推送消息。为此需增加断线重连机制。

(3)多媒体消息推送模块:为了满足当前信息多样化需求,推送消息可能是图片等多媒体信息,通过增加多媒体消息推送模块满足这一需求。

2 各模块设计与实现

本系统的推送是基于XMPP协议实现的,其一个消息的推送需要经过以下几个步骤[6]:

(1)客户端与服务器建立连接。

(2)客户端在服务器中进行注册和登录。

(3)客户端接收服务器推送的消息。

客户端在服务器中登录注册流图如图3所示。

由图3所示,如果服务器数据库中有此客户端对应的信息则登录成功,否则将此客户端的信息保存至数据库再进行登录操作。

具体过程如下:首先客户端要向服务器发送会话请求,主要是将XML数据发送到服务器的IP地址,当服务器接收到XML数据[7]后,服务器会向请求连接的客户端分配一个唯一ID以及指定客户端的IP地址,如果客户端与服务器握手成功,则客户端初始化新的流给服务器,反之,则关闭TCP连接。为了在服务器上注册和登录,客户端需要将账号、加密的密码以及资源名发给服务器。如果服务器有这个账号则登录成功;如果没有,服务器需要发送数据告知客户端数据库中没有此用户,客户端接收到反馈后,需要向服务器发送注册请求。服务器接收到请求后会向数据库中插入此用户。完成注册后,客户端和服务器再进行一次交互就能完成登录。当客户端登录服务器后,服务器进行消息推送,这样就实现了推送的基本过程。

2.1 离线消息缓存机制

离线消息缓存是为了保证推送消息到达率及增加用户体验。当客户端掉线时,用户无法及时收到服务器推送的消息。为了使消息不被遗漏,离线消息缓存使客户端再次上线时依然能收到服务器推送的消息,即将客户端未收到的消息保存到数据库中,当用户再次上线时优先通过数据库,将消息发送到对应的客户端。

离线消息缓存流程如图4所示。

如图4所示,当服务器未收到客户端接收消息的反馈时,就会把这条消息保存到数据库中。每当有客户端连接上服务器时,服务器会优先查找是否有客户端未接收到的消息,如果有就将这条消息推送给对应的客户端,直到客户端接收到此条消息并返回反馈消息时该消息才会从服务器数据库中删除。

2.2 客户端断线重连模块

客户端与服务器的连接会经过连接、注册、登录3个过程[8],当客户端网络状态发生改变以及连接、注册、登录出现异常时需要启动重连操作,确保出现上述状况后能及时连上服务器。

上述3个过程分别用3个线程控制并放在TaskList列表中以确保3个线程的执行顺序。若其中一个过程发生异常则需要将已经添加入任务列表的任务删除再启动重连线程。当网络状态发生改变时客户端需要进行重连操作,若网络断开,客户端需要主动关闭连接,以便网络连接后能恢复。

2.3 多媒体消息推送模块

多媒体消息是重要的信息媒介,所以具有稳定的推送系统集成功能十分必要。本节主要以图片信息为例介绍多媒体信息推送。由于推送系统的通信协议基于XMPP协议[9],但是XMPP协议只能传输二进制流,所以导致推送系统无法推送图片等多媒体信息[10]。因此,本文结合HTTP协议解决XMPP协议的这个缺点。

图片消息推送流图如图5所示。

由图5可知,通过浏览器将图片上传到服务器,服务器将图片保存到本地文件中,然后将存放图片的URL放入推送消息中,客户端可以根据解析出来的URL从服务器获取图片并在终端显示出来,从而实现图片消息推送。其它多媒体消息推送思路类似。

3 实验测试

3.1 实验测试结果

推送消息时将客户端网络关闭,消息记录在数据库中,如图6所示。

在客户端中增加历史消息记录功能,可以展示所有推送消息的历史记录。客户端推送消息历史记录,如图7所示。

当客户端接收到消息之后,服务器端离线消息数据库如图8所示。

通过一定数据量的测试,在客户端离线后推送的消息都可以在客户端上线时推送给客户端,到达率有一定的保证。

3.2 性能测试

为了确定服务器在负载逐渐增加时的性能,对推送消息的到达率进行测试。服务器端配置如表1所示。

其中,每个客户端最多发起25 000个连接,在所有连接建立完成后,分别进行1~100、1~1 000以及全体的推送。测试各种情况下所需的时间、推送成功率和服务器负载情况,结果如表2所示。

可以看到在局域网络环境下所有消息的到达率都是100%,推送时间延迟主要取决于推送消息数量。

4 结语

本文实现了一个可靠的自定义推送系统,并根据具体需求进行相应的功能扩展。系统测试表明,各个功能模块能正常工作,满足对消息到达率有一定要求的应用场景,可以应用到实际项目中。本系统基于XMPP协议实现消息推送,由于XMPP协议比较复杂、冗余、费流量等缺点,导致该系统在流量和电量的消耗控制方面不是很好。同时当用户达到一定规模后,本系统使用的MINA框架对于单台服务器的连接数不足,而且离线消息推送模块对于数据库的操作存在一定瓶颈,后期希望在流量和电量的控制方面能进行深度优化。

参考文献:

[1] 陈怡馨.基于JavaEE与Android的消息推送系统的研究与实现[J].中国新通信,2016,18(23):37-38.

[2] 沈晓.TCP异步长连接的选择及心跳处理机制的实现[J].中国金融电脑,2014(4):37-39.

[3] Wikipedia.Google Cloud Messaging[EB/OL].2015-11-20.

[4] 张长学,张伟,董智明.移动推送技术面面观[J].移动通信,2011,35(5):21-27.

[5] 陈三清,殷鹏.基于Android平台的推送技术应用设计与实现[J].无线互联科技,2017(14):44-47.

[6] 汪海占,邸萌,黄祥林.基于XMPP协议的Android消息推送设计与实现[J].科技广场,2015(2):40-46.

[7] 施济瑜,苗放,王华军,李刚.基于XMPP协议文件传输的研究与实现[J].计算机测量与控制,2009,17(4):732-733+741.

[8] 张雷,金德.基于Push通道客户端的智能心跳机制研究与优化[J].工业控制计算机,2013,26(1):82-84.

[9] 孙泽军,常新峰.基于XMPP推送技术在移动OA中的应用研究[J].实验室研究与探索,2015,34(7):130-134.

[10] SAINT-ANDRE P. Stream XML with Jabber/SMPP[J].IEEE Internet Computing,2005,9(5):82-89.

(責任编辑:江 艳)