Android推送方案分析(MQTT/XMPP/GCM)

本文详细介绍了如何使用MQTT协议在Android平台实现消息推送,包括服务端配置、客户端准备及发送服务搭建等内容。
本文主旨在于,对目前Android平台上最主流的几种消息推送方案进行分析和对比,比较客观地反映出这些推送方案的优缺点,帮助大家选择最合适的实施方案。

方案1、使用GCM服务(GoogleCloudMessaging
简介:Google推出的云消息服务,即第二代的G2DM
优点:Google提供的服务、原生、简单,无需实现和部署服务端。
缺点:Android版本限制(必须大于2.2版本),该服务在国内不够稳定、需要用户绑定Google帐号,受限于Google

方案2、使用XMPP协议(Openfire+Spark+Smack
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn
缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。

方案3、使用MQTT协议(更多信息见:http://mqtt.org/
简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:http://mqtt.org/software),且已有C++版的服务端组件rsmb
缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。

方案4、使用HTTP轮循方式
简介:定时向HTTP服务端接口(WebServiceAPI)获取最新消息。
优点:实现简单、可控性强,部署硬件成本低。
缺点:实时性差。

对各个方案的优缺点的研究和对比,推荐使用MQTT协议的方案进行实现,主要原因是:MQTT最快速,也最省流量(固定头长度仅为2字节),且极易扩展,适合二次开发。接下来,我们就来分析使用MQTT方案进行Android消息的原理和方法,并架设自己的推送服务。

1、推送原理分析


实际上,其他推送系统(包括GCMXMPP方案)的原理都与此类似。

2、推送服务端准备

a>下载&解压rsmb安装包(下载地址:http://www.alphaworks.ibm.com/tech/rsmb
b>进入对应的目录,比如32位的Linux系统则应该进入linux_ia32目录。
c>编辑配置文件broker_1883.cfg,配置如下:
[html]viewplaincopy


port1883
max_inflight_messages10
max_queued_messages1000
d>运行./brokerbroker_1883.cfg,显示如下:
20120823110454.039CWNAN9999IReallySmallMessageBroker
20120823110454.039CWNAN9997ILicensedMaterials-PropertyofIBM
20120823110454.039CWNAN9996ICopyrightIBMCorp.2007,2010AllRightsReserved
20120823110454.039CWNAN9995IUSGovernmentUsersRestrictedRights-Use,duplicationordisclosurerestrictedbyGSAADPScheduleContractwithIBMCorp.
20120823110454.039CWNAN0049IConfigurationfilenameisbroker_1883.cfg
20120823110454.040CWNAN0053IVersion1.2.0,Aug18201017:03:35
20120823110454.040CWNAN0054IFeaturesincluded:bridge
20120823110454.040CWNAN9993IAuthor:IanCraggs(icraggs@uk.ibm.com)
20120823110454.040CWNAN0014IMQTTprotocolstarting,listeningonport1883
......
这样,推送服务的服务端就已经准备好了,监听1883端口。

3、推送客户端准备

a>下载&解压AndroidPushNotificationsDemo项目(下载地址:https://github.com/tokudu/AndroidPushNotificationsDemo
b>将该项目导入Eclipse中(File->Export->ExistingProjectsintoWorkspace
c>修改PushService.java中的MQTT_HOST常量为推送服务端的IP地址。
d>启动Android模拟器,并安装该项目。

注意:在新版本的AndroidSDK中可能会遇到以下错误。
......
08-2302:28:44.184:W/dalvikvm(282):VFY:unabletofindclassreferencedinsignature(Lcom/ibm/mqtt/MqttPersistence;)
08-2302:28:44.194:I/dalvikvm(282):FailedresolvingLcom/tokudu/demo/PushService$MQTTConnection;interface35'Lcom/ibm/mqtt/MqttSimpleCallback;'
08-2302:28:44.194:W/dalvikvm(282)inkofclass'Lcom/tokudu/demo/PushService$MQTTConnection;'failed
08-2302:28:44.194:E/dalvikvm(282):Couldnotfindclass'com.tokudu.demo.PushService$MQTTConnection',referencedfrommethodcom.tokudu.demo.PushService.connect
08-2302:28:44.194:W/dalvikvm(282):VFY:unabletoresolvenew-instance42(Lcom/tokudu/demo/PushService$MQTTConnection;)inLcom/tokudu/demo/PushService;
......
08-2302:28:44.404:E/AndroidRuntime(282):java.lang.VerifyError:com.tokudu.demo.PushService
08-2302:28:44.404:E/AndroidRuntime(282):atcom.tokudu.demo.PushActivity$1.onClick(PushActivity.java:32)
08-2302:28:44.404:E/AndroidRuntime(282):atandroid.view.View.performClick(View.java:2408)
08-2302:28:44.404:E/AndroidRuntime(282):atandroid.view.View$PerformClick.run(View.java:8816)
08-2302:28:44.404:E/AndroidRuntime(282):atandroid.os.Handler.handleCallback(Handler.java:587)
08-2302:28:44.404:E/AndroidRuntime(282):atandroid.os.Handler.dispatchMessage(Handler.java:92)
08-2302:28:44.404:E/AndroidRuntime(282):atandroid.os.Looper.loop(Looper.java:123)
08-2302:28:44.404:E/AndroidRuntime(282):atandroid.app.ActivityThread.main(ActivityThread.java:4627)
08-2302:28:44.404:E/AndroidRuntime(282):atjava.lang.reflect.Method.invokeNative(NativeMethod)
08-2302:28:44.404:E/AndroidRuntime(282):atjava.lang.reflect.Method.invoke(Method.java:521)
08-2302:28:44.404:E/AndroidRuntime(282):atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-2302:28:44.404:E/AndroidRuntime(282):atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-2302:28:44.404:E/AndroidRuntime(282):atdalvik.system.NativeStart.main(NativeMethod)
......
原因是发布的时候没有加入wmqtt.jar包,解决办法如下:
1>在项目根目录下创建libs目录,并把wmqtt.jar包移入该目录。
2>重新配置项目的JavaBuildPath(右键菜单中的Properties选项中)。
3>重新打包发布即可。

运行效果如下:


点击“StartPushService”按钮即可开启推送服务。这时我们可以看到rsmb的服务日志中打出以下提示:
20120823113742.297CWNAN0033IConnectionattempttolistener1883receivedfromclienttokudu/9774d56d682e549conaddress192.168.28.39:3345
其中的“9774d56d682e549c”就是对应的客户端ID号。

4、发送服务准备

a>下载&解压PHP版的发送服务端代码send_mqtt.zip(下载地址:http://download.youkuaiyun.com/detail/shagoo/4520102
b>修改etc/config.php中推送服务端的IP地址和端口号,即MQTT_SERVER_HOSTMQTT_SERVER_POST常量。
c>打开对应的URL地址,就可以看到发送服务的界面,实际上就是向对应的推送客户端推送消息。


接着,我们在该界面中填入客户端ID9774d56d682e549c)和推送消息(test)并点击“SendPushMessage”按钮,服务端就可以向客户端推送消息了。我们看到,客户端上立马就可以收到刚刚推送的消息,如下图。


当然,以上方案还存在许多的不足,比如,如果客户端没有保持连接,发送的消息就会被丢弃。不过,我们可以利用MQTT协议开发出更强大的服务端来替代rsmb,更可以加入队列、缓存等功能进行优化,有兴趣的朋友不妨试试。可参考开源项目Mosquittohttp://mosquitto.org/),相关内容我们会在下一篇《Mosquitto服务的安装与使用》中介绍。
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值