本文主旨在于,对目前Android平台上最主流的几种消息推送方案进行分析和对比,比较客观地反映出这些推送方案的优缺点,帮助大家选择最合适的实施方案。

方案1、 使用GCM服务(Google Cloud Messaging) 
简介: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服务端接口(Web Service API)获取最新消息。 
优点:实现简单、可控性强,部署硬件成本低。 
缺点:实时性差。

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

1、推送原理分析

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

2、推送服务端准备

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

[html]  view plain copy
  1. port 1883
  2. max_inflight_messages 10
  3. max_queued_messages 1000

d> 运行./broker broker_1883.cfg,显示如下: 
20120823 110454.039 CWNAN9999I Really Small Message Broker 
20120823 110454.039 CWNAN9997I Licensed Materials - Property of IBM 
20120823 110454.039 CWNAN9996I Copyright IBM Corp. 2007, 2010 All Rights Reserved 
20120823 110454.039 CWNAN9995I US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
20120823 110454.039 CWNAN0049I Configuration file name is broker_1883.cfg 
20120823 110454.040 CWNAN0053I Version 1.2.0, Aug 18 2010 17:03:35 
20120823 110454.040 CWNAN0054I Features included: bridge 
20120823 110454.040 CWNAN9993I Author: Ian Craggs (icraggs@uk.ibm.com) 
20120823 110454.040 CWNAN0014I MQTT protocol starting, listening on port 1883 
... ... 
这样,推送服务的服务端就已经准备好了,监听1883端口。

3、推送客户端准备

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

注意: 在新版本的Android SDK中可能会遇到以下错误。 
... ... 
08-23 02:28:44.184: W/dalvikvm(282): VFY: unable to find class referenced in signature (Lcom/ibm/mqtt/MqttPersistence;) 
08-23 02:28:44.194: I/dalvikvm(282): Failed resolving Lcom/tokudu/demo/PushService$MQTTConnection; interface 35 'Lcom/ibm/mqtt/MqttSimpleCallback;' 
08-23 02:28:44.194: W/dalvikvm(282): Link of class 'Lcom/tokudu/demo/PushService$MQTTConnection;' failed 
08-23 02:28:44.194: E/dalvikvm(282): Could not find class 'com.tokudu.demo.PushService$MQTTConnection', referenced from method com.tokudu.demo.PushService.connect 
08-23 02:28:44.194: W/dalvikvm(282): VFY: unable to resolve new-instance 42 (Lcom/tokudu/demo/PushService$MQTTConnection;) in Lcom/tokudu/demo/PushService; 
... ... 
08-23 02:28:44.404: E/AndroidRuntime(282): java.lang.VerifyError: com.tokudu.demo.PushService 
08-23 02:28:44.404: E/AndroidRuntime(282):     at com.tokudu.demo.PushActivity$1.onClick(PushActivity.java:32) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at android.view.View.performClick(View.java:2408) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at android.view.View$PerformClick.run(View.java:8816) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at android.os.Handler.handleCallback(Handler.java:587) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at android.os.Handler.dispatchMessage(Handler.java:92) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at android.os.Looper.loop(Looper.java:123) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at java.lang.reflect.Method.invoke(Method.java:521) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-23 02:28:44.404: E/AndroidRuntime(282):     at dalvik.system.NativeStart.main(Native Method) 
... ... 
原因是发布的时候没有加入wmqtt.jar包,解决办法如下: 
1> 在项目根目录下创建libs目录,并把wmqtt.jar包移入该目录。 
2> 重新配置项目的Java Build Path(右键菜单中的Properties选项中)。 
3> 重新打包发布即可。

运行效果如下:

点击“Start Push Service”按钮即可开启推送服务。这时我们可以看到rsmb的服务日志中打出以下提示: 
20120823 113742.297 CWNAN0033I Connection attempt to listener 1883 received from client tokudu/9774d56d682e549c on address 192.168.28.39:3345 
其中的“9774d56d682e549c”就是对应的客户端ID号。

4、发送服务准备

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

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

当然,以上方案还存在许多的不足,比如,如果客户端没有保持连接,发送的消息就会被丢弃。不过,我们可以利用MQTT协议开发出更强大的服务端来替代rsmb,更可以加入队列、缓存等功能进行优化,有兴趣的朋友不妨试试。可参考开源项目Mosquitto ( http://mosquitto.org/ ),相关内容我们会在下一篇《 Mosquitto服务的安装与使用 》中介绍。

转载于:https://www.cnblogs.com/ruiati/p/4924579.html

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

  1. 即时通讯-Android推送方案(MQTT)

    这篇文章是居于前面的几篇博客,如果还不知道ActiveMQ服务器的请看:即时通讯-ActiveMQ环境搭建 1.什么是MQTT协议 MQTT(Message Queuing Telemetry Tra ...

  2. Android推送方案

    移动推送服务,就是通过建立一条手机与服务器的链路,当有消息需要发送到手机时,通过此链路发送即可. 安卓推送的实现方式包括: 方案1.使用C2DM服务(Google Cloud Messaging) 简 ...

  3. Android推送分析

     cpu多核利用能够实现Android推送的吞吐量. 讲明白这点,我们需要了解Android推送的基本原理了.如果实现C(客户端)与server(客户端)实时通讯了.这里有两种思路了: 1.一种是定时 ...

  4. android信鸽推送demo_【厚积薄发】手游推送方案

    这是第155篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...

  5. Android推送集成方案总结

    Android推送集成方案总结 刚做完推送集成方案,记录下坑. 这里记录的特性和使用时针对写blog时采用的sdk的,具体使用流程和限制还请参考官方给出的sdk. 1.推送规则 小米手机用小米推送: ...

  6. Android推送服务的几种实现方式

    现实生活中, 推送服务就像订杂志一样, 只要留下你的地址, 杂志就能如期送到你手里, 可以认为每个人都有唯一的一个地址, 但在目前的网络上, 这是办不到的, 因为不是每个人都有一个唯一的地址, 服务器 ...

  7. Android推送、智能心跳解决方案、手机休眠对心跳的影响

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51611625 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  8. Android推送 智能心跳解决方案 手机休眠对心跳的影响

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51611625   文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一 ...

  9. Android推送原理

    推送的本质 App将服务器更新的信息推送给用户,即App获取服务器信息,再推送给用户 Android的推送实现方式 PULL 应用程序开启定时的轮询,不停地向服务器请求数据 缺点: a. 轮询频率过高 ...

  10. Android推送技术研究

    前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解. 为什 ...

最新文章

  1. Raman Kazhamiakin
  2. 【 FPGA/IC 】常考加法器总结
  3. 蓝桥杯_算法训练_ALGO12_摆动序列
  4. 为什么不要使用 async void
  5. netframework 4.0内置处理JSON对象
  6. 登录用户名和密码相同问题
  7. Android_Kotlin原生开发_认识Kotlin_了解Kotlin和JVM虚拟机关系_认识Kotlin的重要性_更强大的跨平台特性_不需要JVM虚拟机也可跨平台---Kotlin工作笔记001
  8. Android学习笔记06---电话拨号器的制作:项目结构深化
  9. HDOJ1018 ( Big Number ) 【斯特林公式---处理阶乘及阶乘位数的问题】
  10. # 笔记2021-11
  11. Vmware安装vmware-tools后,仍无法上网
  12. 记使用springboot过程中遇到的一个问题
  13. 个人简历表格 会计简历模板 个人简历模板手机版
  14. VP9编解码标准知识总结
  15. SuperMap三维复杂模型建模之3D极坐标建模——原理篇
  16. c语言中定义一个十六进制的数,C语言如何定义一个16进制数
  17. BICC VS SIP --NGN协议的较量
  18. AES AES/GCM/NoPadding 加密解密
  19. rxtx java 错误
  20. 如何在word中插入漂亮代码

热门文章

  1. 为什么觉得今年工作特别难找?
  2. Tomcat 简单容器化
  3. 网络编程之OSI七层协议
  4. javascript 编程指南
  5. oracle 误删除数据,回退表数据
  6. api.execScript
  7. 链接地址中的target=”_blank”属性安全性处理
  8. Android 开发环境搭建之——ADT-Bundle for Windows
  9. poj 1159 Palindrome(dp)
  10. 对象池 IObjectPool -- ESBasic 可复用的.NET类库(15)