1. 程式人生 > >即時通訊-Android推送方案(MQTT)

即時通訊-Android推送方案(MQTT)

這篇文章是居於前面的幾篇部落格,如果還不知道ActiveMQ伺服器的請看:即時通訊-ActiveMQ環境搭建

1.什麼是MQTT協議

MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是IBM開發的一個即時通訊協議。

有可能成為物聯網的重要組成部分。該協議支援所有平臺,幾乎可以把所有聯網物品和外部連線起來,被用來當做感測器和致動器(比如通過Twitter讓房屋聯網)的通訊協議

2.MQTT協議的特點

MQTT協議是為大量計算能力有限,且工作在低頻寬、不可靠的網路的遠端感測器和控制裝置通訊而設計的協議,它具有以下主要的幾項特性:

1、使用釋出/訂閱訊息模式,提供一對多的訊息釋出,解除應用程式耦合;

2、對負載內容遮蔽的訊息傳輸;

3、使用 TCP/IP 提供網路連線;

4、有三種訊息釋出服務質量:

? “至多一次”,訊息釋出完全依賴底層 TCP/IP 網路。會發生訊息丟失或重複。這一級別可用於如下情 況,環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次傳送。

? “至少一次”,確保訊息到達,但訊息重複可能會發生。

? “只有一次”,確保訊息到達一次。這一級別可用於如下情況,在計費系統中,訊息重複或丟失會導致不正確的結果。

5、小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協議交換最小化,以降低網路流量;

6、使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制;

3.Android開啟MQTT連線

在開發前:

第一:Android專案要先引入下面jar:

org.eclipse.paho.client.mqttv3-1.0.2.jar

第二:要啟動AcitveMQ伺服器

Android端使用MQTT協議連線ActiveMQ伺服器

1.定義url

2.建立MqttClient物件

3.呼叫MqttClient物件中connect方法,並通過IMqttActionListener監聽連線的結果

4.Android關閉MQTT連線

Android端使用MQTT協議取消連線ActiveMQ伺服器 17

1.建立MqttClient物件

2.呼叫MqttClient物件中disconnect方法

5.自定義MQTT心跳(保持長連線)

Android端使用MQTT協議與ActiveMQ伺服器端保持長連線

1.定義一個定時器:

19

2.保持長連線
20

3.傳送心跳包

21

4.啟動訂閱,並開始定時器
18

7.測試

執行該Android專案檢視日誌輸出

點選連線:24

保持心跳:

25

點選斷開連線:

26

6.Android開啟MQTT訂閱

使用第三方的心跳服務實現MQTT的訂閱:

1.引入第三方的jar:

org.eclipse.paho.android.service-1.0.2.jar
org.eclipse.paho.client.mqttv3-1.0.2.jar

2.建立MqttAndroidClient ,並設計一個訂閱的回撥

client = new MqttAndroidClient(this,uri, clientID);
//MqttCallbackHandler實現了MqttCallback介面,負責接收訂閱的訊息
client.setCallback(new MqttCallbackHandler(this, clientID));

3.連結伺服器(要啟動AcitveMQ伺服器)

client.connect(conOpt, null, new ConnectCallBackHandler(this));

4.開始訂閱

client.subscribe(topic,0,null,new SubcribeCallBackHandler(SubscriberActivity.this));

22

5.接收訂閱的訊息

   //該方法是在MqttCallbackHandler中實現
   @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        Log.d("MqttCallbackHandler","MqttCallbackHandler/messageArrived="+s);
        Log.d("MqttCallbackHandler","message="+new String(mqttMessage.getPayload()));
        EventBus.getDefault().post(new MessageEvent(s,mqttMessage));
    }

6.測試訂閱是否成功:

開啟ActiveMQ伺服器,釋出一個與訂閱的主題一樣的訊息,看看Android手機的客戶端是否可以接收到訊息

連線伺服器:

27

訂閱一個主題:

28

檢視ActiveMQ伺服器:

29

釋出一個主題:

30

檢視是否訂閱成功:

31

MQTT服務質量

在訂閱的時候可以修改訂閱的服務質量qos:

QoS 0:最多分發一次

QoS 1: 至少分發一次

QoS 2: 僅分發一次

/**訂閱一個主題,服務的質量qos預設為0,我們可以通過修改下面的第二個引數修改訂閱的服務質量*/
client.subscribe(topic,qos,null,new SubcribeCallBackHandler(SubscriberActivity.this));

MQTT過濾器

7.Android進行MQTT釋出

1-3.前三步與訂閱的一樣

4.開始釋出:

/**釋出一個主題:如果主題名一樣不會新建一個主題,會複用*/
client.publish(pubTopic,message,qos,retain,null,new PublishCallBackHandler(PublishActivity.this));

23

5.測試釋出

在Android手機的釋出介面,釋出一個主題,然後開啟ActiveMQ伺服器檢視是否釋出成功

釋出一個主題:

32

檢視主題釋出是否成功:

33

MQTT訊息保留

在釋出的時候可以修改訊息是否保留:

/**第四個引數retain是設計釋出的訊息是否保留,如果retain=true訊息會保留*/
client.publish(pubTopic,message,qos,retain,null,new PublishCallBackHandler(PublishActivity.this));

8.Android使用MQTT實現群聊

群聊實現的原理是:大家訂閱同一個主題,釋出同一個主題

1.訂閱同一個主題:(實現接收訊息)

2.釋出同一個主題:(實現釋出訊息)

開始兩個模擬器,連線伺服器: 37

開啟群聊介面:

34

兩個模擬器同事訂閱android06主題:

35

開始釋出訊息聊天:

36