採用MQTT協議實現Android消息推送

[轉]採用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

相關文章
相關標籤/搜索