[原]采用MQTT协议实现Android消息推送

ARCHYang 2012-03-10

[原]采用MQTT协议实现Android消息推送

[原]采用MQTT协议实现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

看了上面这些文章的内容,完成上面的例子,

然后看看源码,应该明白一些了。

========================================

MQTT是一项消息传递技术,由IBM再2001年发布。

总结一下,机制就是使用一个代理服务器messagebroker,

客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,

同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。

只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,

低带宽,低耗电量,代码量也少,很简单吧。

packagecom.pig.test.mqtt;

importcom.ibm.mqtt.MqttClient;

importcom.ibm.mqtt.MqttException;

importcom.ibm.mqtt.MqttSimpleCallback;

publicclassSubscribeClient{

privatefinalstaticStringCONNECTION_STRING="tcp://192.168.1.60:1883";

privatefinalstaticbooleanCLEAN_START=true;

privatefinalstaticshortKEEP_ALIVE=30;//低耗网络,但是又需要及时获取数据,心跳30s

privatefinalstaticStringCLIENT_id="client1";

privatefinalstaticString[]TOPICS={

"Test/TestTopics/Topic1",

"Test/TestTopics/Topic2",

"Test/TestTopics/Topic3",

"tokudu/client1"

};

privatefinalstaticint[]QOS_VALUES={0,0,2,0};

//////////////////

privateMqttClientmqttClient=null;

publicSubscribeClient(Stringi){

try{

mqttClient=newMqttClient(CONNECTION_STRING);

SimpleCallbackHandlersimpleCallbackHandler=newSimpleCallbackHandler();

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(MqttExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

/**

*简单回调函数,处理client接收到的主题消息

*@authorpig

*

*/

classSimpleCallbackHandlerimplementsMqttSimpleCallback{

/**

*当客户机和broker意外断开时触发

*可以再此处理重新订阅

*/

@Override

publicvoidconnectionLost()throwsException{

//TODOAuto-generatedmethodstub

System.out.println("客户机和broker已经断开");

}

/**

*客户端订阅消息后,该方法负责回调接收处理消息

*/

@Override

publicvoidpublishArrived(StringtopicName,byte[]payload,intQos,booleanretained)throwsException{

//TODOAuto-generatedmethodstub

System.out.println("订阅主题:"+topicName);

System.out.println("消息数据:"+newString(payload));

System.out.println("消息级别(0,1,2):"+Qos);

System.out.println("是否是实时发送的消息(false=实时,true=服务器上保留的最后消息):"+retained);

}

}

/**

*高级回调

*@authorpig

*

*/

classAdvancedCallbackHandlerimplementsMqttSimpleCallback{

@Override

publicvoidconnectionLost()throwsException{

//TODOAuto-generatedmethodstub

}

@Override

publicvoidpublishArrived(Stringarg0,byte[]arg1,intarg2,

booleanarg3)throwsException{

//TODOAuto-generatedmethodstub

}

}

/**

*@paramargs

*/

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

newSubscribeClient(""+i);

}

}

broker服务器,MQTT的jar包,记得下载啊,没有就消息我咯~

========================================

到这里,如果完成IBM的MQTT协议实现push消息的实例的,

都会有个问题,好像没考虑到安全问题,如果客户端连上来作乱怎么办呢?

上面用的broker时rsmb的,mqtt的简单服务器。

IBM已经推出了MQTTV3.1版本,已经加入了安全验证机制,不要怕啦。

据国外网友说,facebook在2011年8月就是用的mqttv3.1做的应用哦。

到这里MQTT学习资料整理差不多了,下篇,mqttv3.1版本服务器的测试使用。

相关推荐