热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android使用MQTT协议实现消息推送

原文地址:http:m.oschina.netblog82059?p1方案1、使用GCM服务(GoogleCloudMessaging)简介:Google推出的云消息服务,即第二代

原文地址:http://m.oschina.net/blog/82059?p=1

 

方案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服务的安装与使用 》中介绍。


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
xl466581836
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有