基于MQTT实现Android消息推送(Push…
来源:互联网 发布:人工智能程序下载 编辑:程序博客网 时间:2024/05/16 12:56
在Android手机平台上,Google提供了C2DM(CloudtoDeviceMessaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。
Android Cloud to Device Messaging(C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。
但是经过一番研究发现,这个服务存在很大的问题:
1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;
2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的AppServer必须也在国外,这个恐怕不是每个开发者都能够实现的;
有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。
即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:
1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。
2)SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/。
3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。
前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。
Ø
MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现
Hello everyone. Inthis post I will try to provide you with a quick example on how toimplement push notifications for your Android app usingM
Introduction
It’s been around 4months now since I’ve started developing apps on the Androidplatform. It began with me scoring a free Nexus One phone at one ofthe
Anyway, developingfor the Android platform turned out to the a pleasure. The SDK waseasy to setup, easy to use and and easy to understand. Puttingtogether your first app was a breeze. I was veryimpressed.
Unfortunately, Isoon realized that Android is not perfect. One of the things thatreally disappointed me was the lack of a native method forperforming push notifications. Over the past year pushnotifications became almost a standard in the mobile space thanksto Apple. Even though BlackBerry utlilized Push since god knowswhen, it was Apple that really brought Push mainstream. Obviously,lack of native Push on Android seems like a huge
- Poll?
Thename obviously tells you that it’s really not even push. The ideahere is to periodically poll the server for new messagesfrom
a backgroundlocal or remote service. The more often you poll the closer you getto the real-time push.
- SMS
Androidallows you to intercept SMS messages. Your server sends a speciallyencoded SMS to your phone, whenever there is something new. Yourapp intercepts all messages, looks for the ones from the server,then pops up a notification.
- PersistentTCP/IP
The phone initiates a long-livedmostly idle TCP/IP connection with the server and maintains itby occasionally sending keepalivemessages. Whenever there is something new on the server, it sends amessages to the phone over the TCP connection.
The first twomethods have significant disadvantages that we cannot do anythingabout. However, the third method’s drawbacks are not as severe. Itseems like with enough work and a good design, the persistentTCP/IP method can work. After all, that’s how GMail, GTalk andGoogle Voice implement their real-time updates. In fact, manydevelopers out there agree that it is probably the best way to gountil Google actually takes the matter in their ownhands.
PersistentTCP/IP
After moreGoogling around I was able to come
- JoshGuilfoyle
talksabout how to create a most-idle TCP/IP connection with a longkeep-alive timer based on the AlarmManager. He provides some really coolsample code with a service that runs in the background and makesconnections. http://devtcg.blogspot.com/2009/01/push-services-implementing-persistent.html - DaveRea
recently started the Deaconproject, which is aimed at developing a 3rd party library forAndroid push notifications using comet technology basedon the Meteor server. The project is still in a veryearly stage (at the time of this post), but looks quitepromising. http://deacon.daverea.com/ - DaleLane
had done a number ofpresentations, where he talked about using the IBMdeveloped MQTT protocol for implementingAndroid push notifications. He also provides some really usefulsample Android code. http://dalelane.co.uk/blog/?p=938
While all of thework done by these guys is incredible, none of their results arequite ready for drop-in use by other developers. In my effort toimplement push notifications, I decided to put the pieces of thepuzzle together and combine their results to produce a relativelystable way of implementing push. The example that I provide youwith further, is a combination of JoshGuilfoyle’s
MyIdea
The problem withthe TestKeepAlive project is that it creates a raw TCP connection,which means that you need write your own server to take care ofpush on the other side. While it’s, without a question, doable, itis exactly why TestKeepAlive is far from a working solution. On theother hand, the MQTT example shown by Dale Lane uses the IBM’s MQTTbroker to handle the server work. To backup a little, MQTT standsfor
mqtt
Did you see thepart about ‘low power’? So did I. Basically, the reason why onemight consider using MQTT is that it was designed to be verylightweight, so that it doesn’t consume much power. This is idealfor a mobile push solution as it addresses many battery liferelated concerns about persistent TCP/IP connections. Obviously,MQTT also has some disadvantages such as privacy, but we can talkabout that later.
So, my ideaconsists of taking a KeepAliveService and replacing the raw TCP/IPconnection with an MQTT connection. In this case, each device cansimply subscribe to a unique topic which is based on its device ID.Now, assuming that your server knows the device ID, it can pushdata to the device over MQTT by publishing to that uniquetopic.
Architecture
In my example,I
wmqtt.jar
ReallySmall Message Broker (RSMB)
SAM
send_mqtt.php
SampleCode and Demo
The goal of mywork on push notifications was to develop a working demo, which iswhat all other examples out there lack. I’m happy to say that Iaccomplished my objective. You can download the sample android appon
This app (shown onthe left) has a TextView and two buttons. The TextView containsyour device ID and the buttons are used to start and stop the pushnotifications service. Once you have the app on your phone, startthe service. Then go to
You can see thesource codefor
If you didn’tget a notification, make sure you have network connectivity. It canalso be that the broker is down on my server (see server status onthe page). If that’s the case, please post a comment and I willlook into it bringing the broker back up.
FinalThoughts and Comments
MQTT is definitelynot the best way to implement push for Android, but it does work.One of the main drawbacks of MQTT is that anyone who knows the IPand the PORT at which the broker is running can connect andintercept your Push messages. So it’s probably a good idea toencrypt them. Alternatively, you could write your own broker andintroduce some sort of authentication to MQTT.
The code I providehere for the push service still needs more testing. Reliability isdefinitely the main question. I think the code can definitely beimproved to better handle connectivity loss andother
Also let me knowif you find any bad bugs. Good luck testing!
AntonLopyrev
Follow me ontwitter
简要总结:
1)client端
作者给出了android上面的client端程序见:
2)server端
首先需要自己安装Mosquitto
3)发送消息
使用PHP发送消息的示例程序,见:PhpMQTTClient。
用上面给出的例子代码,就可以自己搭建一个环境进行测试。
上述步骤需要用PHP,然后搭建webserver来发送消息。但是,有时候我们并不方便搭建webserver,或者我们只想通过程序发消息,应该怎么办呢?可以用python脚本发送。
(Above tutorials need setupwebserver, however, sometimes it is not so convenient for us to setup one web server and config corresponding environgments,
4)python脚本发送消息的程序
可以考虑使用python。下面给出使用python的例子程序。(参见:http://mqtt.org/wiki/doku.php/python_examples)
我安装了python27,并且安装了Mosquitto目录下面python目录下面的库(pythonsetup.py install)。
给出代码:
#!/usr/bin/env python
#coding=utf-8
import mosquitto
import os
import time
broker = "127.0.0.1"
port = 1883
mypid = os.getpid()
client_uniq = "pubclient_"+str(mypid)
mqttc = mosquitto.Mosquitto(client_uniq)
#connect to broker
mqttc.connect(broker, port, 60, True)
#remain connected and publish
while mqttc.loop() == 0:
msg = "test message "+time.ctime()
mqttc.publish("topic", msg)
print "message published"
time.sleep(1)
pass
在执行上面脚本时,会提示“TypeError:expected string or Unicode object, NoneType found”
解决方法:把mosquitto.dll所在目录加入path环境变量。参见:https://lists.launchpad.net/mqtt-users/msg00043.html
- 基于MQTT实现Android消息推送(Push…
- Android MQTT实现消息推送
- 基于Mqtt协议Paho项目实现Android消息推送
- 基于MQTT协议推送Android消息
- 基于MQTT协议推送Android消息
- 基于MQTT协议推送Android消息
- Android消息推送(二)--基于MQTT协议实现的推送功能
- Android消息推送(二)--基于MQTT协议实现的推送功能
- Android消息推送(二)--基于MQTT协议实现的推送功能
- Android消息推送(二)--基于MQTT协议实现的推送功能
- Android消息推送(二)--基于MQTT协议实现的推送功能
- 【转载】Android消息推送(二)--基于MQTT协议实现的推送功能
- 采用MQTT协议实现Android消息推送
- 用MQTT协议实现android消息推送
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- 采用MQTT协议实现Android消息推送
- iPhone和Android的控件对比
- 基于即时通信和LBS技术的位置感知…
- Java领域的IM解决方案
- 第16周 指针倒叙输出
- 利用传感器实现微信的摇一摇功能
- 基于MQTT实现Android消息推送(Push…
- Android消息推送
- DBCP——开源组件 的使用
- 一款Android产品开发的全过程
- Android NFC 概述
- Android NFC :ApiDemos->NFC->Fore…
- Android NFC Mifare Tag 读写示例
- ANDROID 如何适配屏幕之density
- Android 4.0应用界面设计分析