[转]采用MQTT协议实现Android消息推送 html
对于消息推送,一开始还真不知道什么方式比较好,一头雾水,如今回顾总结下资料。 android
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
看了上面这些文章的内容,完成上面的例子,
而后看看源码,应该明白一些了。 socket
========================================
MQTT是一项消息传递技术,由IBM再2001年发布。 tcp
总结一下,机制就是使用一个代理服务器message broker,
客户端client链接上这个服务器,而后告诉服务器说,我能够接收哪些类型的消息,
同时,client也能够发布本身的消息,这些消息根据协议的内容,能够被其余client获取。 ide
只要手机客户端,连上服务器,而后就能够接收和发布消息了,不用本身写socket什么了, 函数
低带宽,低耗电量,代码量也少,很简单吧。 测试
package com.pig.test.mqtt;
import com.ibm.mqtt.MqttClient;
import com.ibm.mqtt.MqttException;
import com.ibm.mqtt.MqttSimpleCallback;
public class SubscribeClient {
private final static String CONNECTION_STRING = "tcp://192.168.1.60:1883";
private final static boolean CLEAN_START = true;
private final static short KEEP_ALIVE = 30;//低耗网络,可是又须要及时获取数据,心跳30s
private final static String CLIENT_ID = "client1";
private final static String[] TOPICS = {
"Test/TestTopics/Topic1",
"Test/TestTopics/Topic2",
"Test/TestTopics/Topic3",
"tokudu/client1"
};
private final static int[] QOS_VALUES = {0, 0, 2, 0};
//////////////////
private MqttClient mqttClient = null;
public SubscribeClient(String i){
try {
mqttClient = new MqttClient(CONNECTION_STRING);
SimpleCallbackHandler simpleCallbackHandler = new SimpleCallbackHandler();
mqttClient.registerSimpleHandler(simpleCallbackHandler);//注册接收消息方法
mqttClient.connect(CLIENT_ID+i, CLEAN_START, KEEP_ALIVE);
mqttClient.subscribe(TOPICS, QOS_VALUES);//订阅接主题
/**
* 完成订阅后,能够增长心跳,保持网络通畅,也能够发布本身的消息
*/
mqttClient.publish(PUBLISH_TOPICS, "keepalive".getBytes(), QOS_VALUES[0], true);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 简单回调函数,处理client接收到的主题消息
* @author pig
*
*/
class SimpleCallbackHandler implements MqttSimpleCallback{
/**
* 当客户机和broker意外断开时触发
* 能够再此处理从新订阅
*/
@Override
public void connectionLost() throws Exception {
// TODO Auto-generated method stub
System.out.println("客户机和broker已经断开");
}
/**
* 客户端订阅消息后,该方法负责回调接收处理消息
*/
@Override
public void publishArrived(String topicName, byte[] payload, int Qos, boolean retained) throws Exception {
// TODO Auto-generated method stub
System.out.println("订阅主题: " + topicName);
System.out.println("消息数据: " + new String(payload));
System.out.println("消息级别(0,1,2): " + Qos);
System.out.println("是不是实时发送的消息(false=实时,true=服务器上保留的最后消息): " + retained);
}
}
/**
* 高级回调
* @author pig
*
*/
class AdvancedCallbackHandler implements MqttSimpleCallback{
@Override
public void connectionLost() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void publishArrived(String arg0, byte[] arg1, int arg2,
boolean arg3) throws Exception {
// TODO Auto-generated method stub
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new SubscribeClient("" + i);
}
}
broker服务器,MQTT的jar包,记得下载啊,没有就消息我咯~
========================================
到这里,若是完成IBM 的MQTT协议实现push消息的实例的,
都会有个问题,好像没考虑到安全问题,若是客户端连上来做乱怎么办呢?
上面用的broker时rsmb的,mqtt的简单服务器。
IBM已经推出了MQTT V3.1版本,已经加入了安全验证机制,不要怕啦。
据国外网友说,facebook在2011年8月就是用的mqtt v3.1作的应用哦。
来自:http://www.cnblogs.com/glony/articles/2308165.html