您的位置:首页 > 移动开发 > Android开发

使用MQTT实现Android推送功能(Android+PHP+rsmb)

2016-09-19 11:46 447 查看
http://blog.csdn.net/jjmm2009/article/details/19496849

简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。

优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考: http://mqtt.org/software ),且已有C++版的服务端组件rsmb。

缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。

1、推送原理分析



2、推送客户端准备

下载项目代码包,地址:http://download.csdn.net/detail/jjmm2009/6938107

代码包里面有包括三部分:

1) AndroidPushNotificationsDemo.zip

2) rsmb.zip

3) PhpMQTTClient.zip

a> 解压AndroidPushNotificationsDemo项目

b> 将该项目导入Eclipse中(File -> Export -> Existing Projects into Workspace)

c> 修改PushService.java中的 MQTT_HOST 常量为推送服务端的IP地址。

d> 安装并运行。

注意: 在新版本的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号。

3、推送服务端准备

a> 解压rsmb安装包

b> 进入对应的目录,比如32位的Windows系统则应该进入windows目录。

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端口。

4、发送服务准备

a> 解压PHP版的发送服务端代码PhpMQTTClient.zip

b> 修改etc/config.php中推送服务端的IP地址和端口号,即 MQTT_SERVER_HOST 和 MQTT_SERVER_POST 常量。

c> 打开对应的URL地址,就可以看到发送服务的界面,实际上就是向对应的推送客户端推送消息。



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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: