zoukankan      html  css  js  c++  java
  • [转]Android推送方案分析(MQTT/XMPP/GCM)

    资源描述:

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

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

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

    1、推送原理分析

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

    2、推送服务端准备

    a> 下载&解压rsmb安装包
    b> 进入对应的目录,比如32位的Linux系统则应该进入linux_ia32目录。
    c> 编辑配置文件broker_1883.cfg,配置如下:

    [html] view plain copy

    port 1883 
    max_inflight_messages 10 
    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项目
    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
    b> 修改etc/config.php中推送服务端的IP地址和端口号,即 MQTT_SERVER_HOST 和 MQTT_SERVER_POST 常量。
    c> 打开对应的URL地址,就可以看到发送服务的界面,实际上就是向对应的推送客户端推送消息。

  • 相关阅读:
    10.11-10.16
    10.8-10.10
    9.26-28
    9.29css继承属性
    表单的学习
    排版
    css补充
    今天学的新内容
    新内容
    文本样式的修改
  • 原文地址:https://www.cnblogs.com/--Sam--/p/3607601.html
Copyright © 2011-2022 走看看