面向Android系统的内容推送方法应用研究
2016-05-19方耀耀李同刚
方耀耀++李同刚
摘要:该文面向Android系统,利用MQTT[1]协议基于发布与订阅的特性,在mosquitto开源项目原有的模型基础上,设计实现了一款个性化锁屏应用。完成了注册登录,精准推送,频道订阅等功能。同时从推送及时性和代理服务器的负载压力上对其进行了性能测试,实验结果表明2G双核单台服务器可以支持的客户端在12000以上。
关键词:Android;内容;推送;锁屏;MQTT
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)07-0028-04
Research and Application of Content Push Based on the Android Platform
FANG Yao-yao, LI Tong-gang
(North China University of Technology , Beijing 100041, China)
Abstract:This article is for Android system,, by taking advantange of publishing and subscription features in MQTT, and based on the Mosquitto,a open source MQTT project, the authors design and implement a personalized screenlock application, which includes registration and login, content push, channel subscription and some other functions.at last, timely and precise push test and stress test are carried out on the servers, The experimental results show that the 2G dual core single server can support clients in more than 12000
Key words:Android; content; Push;ScreenLock; MQTT
随着智能手机和WIFI的普及,人们使用手机的习惯上变得碎片化。年轻的手机用户平均每人每天划屏解锁的次数能达到几十次,如果每次解锁能通过锁屏的界面获取到一些对用户有用或感兴趣的信息,那将是非常有意义和有价值的[2]。实际上,手机锁屏已经成为一种手机端产品信息实时发布的重要媒介和网络营销的重要手段。锁屏应用将手机锁屏位置变成广告位。通过广告主投放广告用户看广告返现,的形式获得极大的商业价值。网络资源的迅速膨胀,也为锁屏应用提供了丰富的内容,本文的内容不仅指单一的文本消息,还包括图片、音频、视频,动画等多媒体资源。
本文面向Android系统,基于MQTT 协议设计并实现了一款个性化锁屏应用及配套的内容管理与推送系统, 着重阐述和解决了推什么和怎么推的问题。本文共分为四个部分,第一部分分析说明了应用的推送技术方案。第二部分阐述了锁屏应用的几个主要功能及其设计实现思想, 第三部分别对客户端进行功能测试和对代理服务器进行压力测试,最后对全文作出总结, 并提出不足,同时对下一步工作进行了展望。
1 推送技术现状
Android系统下的推送解决方案主要有GCM[3],XMPP[4],MQTT以及第三方推送平台四种解决方案。GCM由于网络的问题,其服务在国内不稳定。XMPP协议比较复杂和冗余,数据负载重。第三方推送平台安全性低,可能会收费和有一定的限制。综合考虑,我们选取MQTT这一轻量级的消息传输协议作为移动平台下的推送技术。
MQTT是IBM开发的一个基于发布/订阅模式的轻量级消息传输协议, 其设计思想是轻量、简单、易于实现, 适用于计算能力有限, 低带宽、网络不可靠的环境。MQTT定义了三种角色,消息发布者,消息代理和消息订阅者,订阅者与代理之间建立一条长连接,发布者。
2 内容推送设计
图1是应用的结构图,共分为四层,第一层存有用户信息,内容信息等基础数据;第二层提供协议栈和统一通信的接口[5],用来序列化和标准化基础数据;第三层是本应用中主要功能的集合;第四层在界面层定义了两种用户角色。
2.1 用户信息的获取与存储
向用户信息包括用户基本信息和用户使用设备的信息。用户基本信息通过用户手动注册或修改的时候提交给内容服务器的。设备信息是在用户注册或登录时提交一次。
用户安装锁屏应用后,会在该设备生成一个配置文件config.info,里面保存了加密处理后的用户和设备的相关信息,其中就有用户的id和设备的id,同时会把这些信息反馈到内容服务器上,内容服务器会把这些信息保存下来,当用户配置文件丢失或过期时,可以重新登录,验证用户名,密码后重新获取之前保存的用户配置信息。值得注意的是,一个用户不能同时登录两台设备,一当用户使用另一台设备登录时,会将新设备的id赋给该用户,同时发送一条消息命令给上个上线设备,通知它下线[6]。图2是用户注册和登录的流程图。
2.2 内容管理与推送
本文以图片为例说明内容到用户的推送过程。同时我们在定义内容时,也为除图片以外的内容数据保留了兼容性,下面是关于内容的实体定义:
Class content { //推送内容
String contentid; //系统分配的id
String name; //内容名称
String starttime; //内容在客户端开始显示的时间
String endtime;//内容在客户端结束显示的时间
String format;//内容格式,取文件的后缀名
...
}
本内容服务器对内容进行推送时,不是以单个内容为单位,而是以一个到多个内容组成的内容序列为单位。序列中的每一个内容都有起止时间,表示它在客户端设备上显示的有效时间。当客户端接收到这个序列的时候,会根据这些内容的contentid和起止时间即starttime和endtime进行筛选,将客户端没有的内容且并未过期(endtime小于当前时间)的内容添加或更新到客户端的内容显示播放序列中。
结合mqtt协议,我们给系统定义了四个角色,管理员,内容服务器,代理服务器以及客户端。管理员负责对内容的上传和管理,也是推送的发起者;内容服务器记录和保存了要推送的内容,序列信息以及接收设备。内容服务器先将要推送的内容按照服务器与客户端约定的应用层协议组织报文,并把这个报文发布到代理服务器上,由代理服务器转发给推送对象,代理服务器可以根据客户端的设备id进行点对点的信息传送,也可以给订阅相同主题的客户端群推;代理服务器在维持与客户端的长连接的同时,存储转发内容服务器发来的消息给客户端;客户端在安装锁屏应用后,会将自身的设备信息(设备imei,型号等)注册登记到内容服务器以及代理服务器上,同时将用户信息(手机号,用户名,密码等)提交给内容服务器,为筛选推送对象提供数据基础。客户端在与代理服务器建立连接后通过不断向代理服务器发送心跳包的方式来维持一个长连接[7],并通过一个监听服务不断接收并处理接收由代理服务器转发的协议报文,再根据解析后的信息,到内容服务器上获取相应的内容信息。图3是推送的活动图。
管理员在选择被推送的设备时,主要是根据用户在客户端注册登记的用户名,手机号,设备号等性质相对稳定的静态属性进行手动推送。
另外,根据根据手机地理位置的变化或者用户使用习惯的改变,管理员在不同的变化状态下设置好对应序列,当客户端程序检测到状态变化时,会通知内容服务器将相应状态下的序列推送到客户端。
2.3 用户自定义推送频道
实际上,客户端用户既可以作为内容信息的接收者,也可以作为信息的发起者[8]。作为接收者是对代理服务器而言, 需要向其注册并接收的内容信息. 作为发起者是对设备本身而言, 通过订阅主题使服务器向自身投放特定类别的信息。
本文介绍的锁屏应用不仅可以在服务器端推送指定内容和设备,手机用户还可以在客户端订阅自己喜欢的内容频道。管理员将上传的内容按照一定的规则和方法分类成多个内容频道,如体育频道,财经频道等等,每个频道下面赋予一组相关的内容序列,当然,也可以细分为更多的子频道,当用户在客户端订阅其中的某一个频道时,内容服务器就会把这个频道下的内容序列推送到用户的手机上。
3 应用实现方案
3.1 代理服务器
Mosquitto[9]是一个实现了MQTTv3.1的开源代理软件,它提供了非常理想的轻量级数据交换的解决方案。本文选择在Ubuntu12.04上进行安装与配置Mosquitto。首先在系统终端输入sudo apt-get install mosquitto,也可以到其官网获取最新源码包进行解压并安装,安装完在终端输入mosquitto来启动代理服务。Mosquitto提供了mosquitto、mosquitto_passwd、mosquitto_pub和mosquitto_sub四个工具,分别用于启动代理、管理密码、发布消息和订阅消息。在目录/etc/mosquitto/下存在配置文件mosquitto.conf,其中定义了端口、心跳时间、客户端最大并发数等重要参数。另外mosquitto为多个代理之间提供了桥接[10]功能以增加客户端的并发数量。下面代码是桥接部分的配置:
connecttion conn1
address 10.5.113.251
topic # both 1
connecttion conn2
address 10.5.113.253
topic # both 1
3.2 内容服务器
内容服务器端是基于myeclipse+mysql+tomcat的环境下进行开发的,MQTT协议的开发包wmqqt.jar是本次开发所需要的最重要的一个包,该包可在IBM官网上免费下载,导入服务器端工程目录下。内容服务器端主要实现四个类usersevice,contentservice,queueservice和pushservice,usersevice为pc端的操作员提供注册,登录及权限分配提供服务,contentservice负责内容的增删改查,queueservice将内容组织成序列,并对序列进行管理,pushservice为推送提供了一系列的接口,如pc端业务员通过设备的id或用户id给用户进行推送内容时需要用到的PushByDeviceid和pushByUserid,给订阅过某一个主题的客户端群用户推送相关主题的内容时会调用的方法PushByTopic。
3.3 客户端
Android客户端是基于Eclipse+AndroidSDK+ADT的环境下进行开发的,同样也要导入开发包wmqqt.jar到Android客户端工程。Android客户端主要实现三个类,userservice,pushservice和mqttservice,userservice实现手机端用户的注册和登录功能,对用户的基本信息和设备信息进行分析和提交,pushservice实现诸如频道订阅,显示内容等业务的处理和封装.mqttservice直接处理服务器推送过来的内容协议报文以及负责与代理服务器之间诸如建立连接,断开连接,发送心跳包等通信业务。
4 测试
系统设有一个内容服务器,两个代理服务器以及若干手机客户端。图4是系统设备配置情况和部署情况的缩略图:
4.1功能测试
功能测试由两部组成:PC端登录到系统中,先导入和填写内容信息,再根据内容组织好要推送的序列,如图5所示。然后在图6所示的界面中选择手机尾号是9865的用户进行推送;客户端在安装和注册后,开启该锁屏应用,在连网的状态下,接受到服务器端推送过来的内容,如图7所示。客户端在成功接收到图片后会给服务器一个回执,图6中该用户的接收状态会变成已经已接收。
4.2代理服务器压力测试
Tsung[11]是一个开源的多协议分布式负载测试工具,由于采用的epoll技术,单台tsung客户机就可以打出很大的压力。从1.5.1版开始tsung加入对mqtt协议的支持。这里我们只对单台的代理服务器进行负载测试,测试的时候我们选取内容服务器为客户机,代理服务器和客户机都是ubuntu系统。首先消除两台机子上的ulimit -n的限制,在配置文件/etc/security/limits.conf尾追加两行
* hard nofile 65535
* soft nofile 65535
然后在代理服务器上开启mosquitto服务,在客户机上下载安装tsung(>=1.5.1),在目录.tsung下创建配置文件mqtt.xml设置好相关的测试参数(如图8)测试持续时间1800秒,每秒试图向代理服务器发起3000个连接,其中1%为发布者,99%为订阅者。
在终端输入命令tsung -f .tsung/mqtt.xml start开启对代理服务器的压力测试。测试结束后,进入到终端提示的本次测试数据存放目录并输入命令/usr/lib/tsung/bin/tsung_stats.pl将其转换为图表:
从图8中可以看出,可以看出内容从服务器推送到客户端的时间大概在0到180msec之间。并呈现阶段性的拥塞。现实应用中,网络,带宽等因素影响比例较高。从图9中可以看出,客户机在建立用户达到18000左右后,立即下降到0,代理服务器的连接数也从12000多回落到0。造成这种现象,从当时的cpu和内存的使用情况来看:
可以判断单台客户机已不能测出代理服务器可支持连接数的峰值。值得一提的是当代理服务器的连接数达到12000多的时候,其内存使用率并不高,因此,可以判断其最大并发数还有很大的上升空间。
5 结束语
本文论述了如何将文本,图像等内容资源准确地推送到手机客户端,并以锁屏解锁的形式展示给用户。目前系统可以根据用户的注册信息进行筛选并有针对性地进行推送,用户也可以根据自身兴趣爱好进行订阅推送内容。功能上已经实现,性能上进行了一定的压力测试。但是依然存在着一些不足,如代理服务器的最大并发数,如何根据用户的行为习惯及画像[12]进行触发式地推送等等,未来在着重解决这些问题的同时,还会给推送内容赋予不同的积分值,并建立配套的积分商城,以获取更高的用户留存率和更好的用户体验。
参考文献:
[1] IBM. MQTT V3.1 Protocol Specification[EB/OL].[2010-08-19].http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html.
[2] 詹海宝,张立国.大学英语词汇锁屏移动学习软件的设计与应用[J].DISTANCE EDUCATION IN CHINA, 2015(4):43-48.
[3] CHEN Wei,GONG Peihua,YU Le,YANG Geng. An Adaptive Push-Styled Command and Control Mechanism in Mobile Botnets[J]. Wuhan University Journal of Natural Sciences,2013(5):427-434.
[4] 高明鹏. 基于XMPP协议的Android手机即时通信应用研究与实现[D]. 南昌:南昌大学,2012.
[5] 王克锋.基于Android 的信息推送管理系统的设计和实现[D].大连:大连理工大学,2012.
[6] 关庆余,李鸿彬,于波.MQTT协议在Android平台上的研究与应用[J].计算机系统应用,2014,23(4):197-200.
[7] 林佳作. 基于长连接的移动终端消息推送系统的设计与实现[D]. 西安:西安电子科技大学,2014.
[8] 许金喜,张新有.Android平台基于MQTT协议的推送机制[J].计算机系统应用,2015,24(1):185-190.
[9] mosquitto — an MQTT broker[EB/OL].[2015-04-03].http://mosquitto.org/man/mosquitto-8.html.
[10] 任亨. 基于MQTT协议的消息推送集群系统的设计与实现[D].北京:中国科学院研究生院,2014.
[11] Tsung main features[EB/OL].[2014-04-09].http://tsung.erlang-projects.org/user_manual/features.html#mqtt-related-features.
[12] 余孟杰. 产品研发中用户画像的数据模建——从具象到抽象[J]. 设计艺术研究,2014(6):60-64.