对于消息推送,一开始还真不知道什么方式比较好,一头雾水,现在回顾总结下资料。
http://zheye.org/asks/4d99a1aafd503c41d700000a
通过上面者也里面的回复,得到一些信息。
1.官方的C2DM,但是只支持android2.2及以上平台的,而且使用的google的服务器。
对于google服务器的问题,网友应该都清楚,天朝的大中华区局域网总是让它不时的给你断一下。
2.第三方的androidpn,和C2DM一样,都是基于XMPP扩展的,是一个开源的项目,据说不错。
http://sourceforge.net/projects/androidpn/
但是是基于长连接的,如果客户端数量大,特别像手机这种都是长期在线的设备,
会有两个问题,(1)服务器压力,(2)手机的电池不够用啊,电量卡卡卡的被你耗光了(需要优化网络机制)。
3.使用IBM 的MQTT协议实现push消息
地址:http://tokudu.com/2010/how-to-implement-push-notifications-for-android/
这是一个非常理想的解决方案,是基于tcp协议的,低带宽通信,而且国外友人已经测试,耗电量很多哦~
都是E文的,不习惯看E文的,也没关系,有一前辈给整理了一个中文的:
《Android推送通知指南》http://blog.csdn.net/joshua_yu/article/details/6563587
看了上面这些文章的内容,完成上面的例子,
然后看看源码,应该明白一些了。
========================================
MQTT是一项消息传递技术,由IBM再2001年发布。
总结一下,机制就是使用一个代理服务器message broker,
客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,
同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。
只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,
低带宽,低耗电量,代码量也少,很简单吧。
001 | package com.pig.test.mqtt; |
003 | import com.ibm.mqtt.MqttClient; |
004 | import com.ibm.mqtt.MqttException; |
005 | import com.ibm.mqtt.MqttSimpleCallback; |
007 | public class SubscribeClient { |
008 | private final static String CONNECTION_STRING = "tcp://192.168.1.60:1883" ; |
009 | private final static boolean CLEAN_START = true ; |
010 | private final static short KEEP_ALIVE = 30 ; |
011 | private final static String CLIENT_ID = "client1" ; |
012 | private final static String[] TOPICS = { |
013 | "Test/TestTopics/Topic1" , |
014 | "Test/TestTopics/Topic2" , |
015 | "Test/TestTopics/Topic3" , |
018 | private final static int [] QOS_VALUES = { 0 , 0 , 2 , 0 }; |
021 | private MqttClient mqttClient = null ; |
023 | public SubscribeClient(String i){ |
025 | mqttClient = new MqttClient(CONNECTION_STRING); |
026 | SimpleCallbackHandler simpleCallbackHandler = new SimpleCallbackHandler(); |
027 | mqttClient.registerSimpleHandler(simpleCallbackHandler); |
028 | mqttClient.connect(CLIENT_ID+i, CLEAN_START, KEEP_ALIVE); |
029 | mqttClient.subscribe(TOPICS, QOS_VALUES); |
032 | * 完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息 |
035 | mqttClient.publish(PUBLISH_TOPICS, "keepalive" .getBytes(), QOS_VALUES[ 0 ], true ); |
037 | } catch (MqttException e) { |
044 | * 简单回调函数,处理client接收到的主题消息 |
048 | class SimpleCallbackHandler implements MqttSimpleCallback{ |
055 | public void connectionLost() throws Exception { |
057 | System.out.println( "客户机和broker已经断开" ); |
061 | * 客户端订阅消息后,该方法负责回调接收处理消息 |
064 | public void publishArrived(String topicName, byte [] payload, int Qos, boolean retained) throws Exception { |
066 | System.out.println( "订阅主题: " + topicName); |
067 | System.out.println( "消息数据: " + new String(payload)); |
068 | System.out.println( "消息级别(0,1,2): " + Qos); |
069 | System.out.println( "是否是实时发送的消息(false=实时,true=服务器上保留的最后消息): " + retained); |
079 | class AdvancedCallbackHandler implements MqttSimpleCallback{ |
082 | public void connectionLost() throws Exception { |
088 | public void publishArrived(String arg0, byte [] arg1, int arg2, |
089 | boolean arg3) throws Exception { |
099 | public static void main(String[] args) { |
101 | new SubscribeClient( "" + i); |
broker服务器,MQTT的jar包,记得下载啊,没有就消息我咯~
========================================
到这里,如果完成IBM 的MQTT协议实现push消息的实例的,
都会有个问题,好像没考虑到安全问题,如果客户端连上来作乱怎么办呢?
上面用的broker时rsmb的,mqtt的简单服务器。
IBM已经推出了MQTT V3.1版本,已经加入了安全验证机制,不要怕啦。
据国外网友说,facebook在2011年8月就是用的mqtt v3.1做的应用哦。