基于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年發布。
總結一下,機制就是使用一個代理服務器message broker,
客戶端client連接上這個服務器,然后告訴服務器說,我可以接收哪些類型的消息,
同時,client也可以發布自己的消息,這些消息根據協議的內容,可以被其他client獲取。
只要手機客戶端,連上服務器,然后就可以接收和發布消息了,不用自己寫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版本,已經加入了安全驗證機制,不要怕啦。
據國外網友說,非死book在2011年8月就是用的mqtt v3.1做的應用哦。
來自:http://www.cnblogs.com/glony/articles/2308165.html