即時通訊 MQTT

1. 什麼叫MQTT?

1.0 全稱:Message Queuing Telemetry Transport((消息隊列遙測傳輸)。是IBM開發的一個即時通訊協議

1.1 其具有協議簡潔小巧可擴展性強省流量省電等優點,而且已經有PHPJAVAPythonCC#Go等多個語言版本。

1.2 基本可以使用在任何平臺上。幾乎可以把所有聯網物品和外部連接起來,所以特別適合用來當做物聯網的通信協議


2. MQTT特點(使用發佈/訂閱消息模式)

2.0 使用 TCP/IP 提供網絡連接

2.1 對負載內容屏蔽的消息傳輸

2.2 有三種消息發佈服務質量

“至多一次”,消息發佈完全依賴底層 TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因爲不久後還會有第二次發送。

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

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

2.3 小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量

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


3. MQTT協議特徵
在這裏插入圖片描述
MQTT是一種基於代理的發佈/訂閱的消息協議。提供一對多的消息分發,解除應用程序耦合

4. 錯誤彙總

  1. MQTT連接斷開,(32109) - java.io.EOFException錯誤
    原因:客戶端唯一標識重複導致的
    具體可參考:Connection lost (32109) - java.io.EOFException

  2. MQTT斷線重連訂閱無法接收

 // 配置裏將cleanSession設爲true,當客戶端掉線時,服務器端會清除客戶端 session
 // 重連後 客戶端會有一個新的session
  	connOpts.setCleanSession(true);

解決: cleanSession設爲false,客戶端掉線後,服務器端不會清除session,當重連後可以接收之前訂閱主題的消息。當客戶端上線後會接受到它離線的這段時間的消息

  1. mqtt在連接成功後,各種機型退到後臺心跳發送會不穩定(手機差別很多)
    解決:connectionLost回調一定記得重連

   client = new MqttAndroidClient(this, uri.toString(), info.uid);
   client.setCallback(mqttCallback);  // 設置MQTT監聽並且接受消息

	/**
     * MQTT監聽並且接受消息
     */
    private MqttCallback mqttCallback = new MqttCallback() {

        @Override
        public void messageArrived(String topic, MqttMessage message) {
            String msg = new String(message.getPayload());
            if (msgCallBack != null) {
                msgCallBack.setMessage(msg);
            }
            Log.i(TAG, "messageArrived:" + msg);
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken arg0) {
            Log.i(TAG, "deliveryComplete");
        }

        @Override
        public void connectionLost(Throwable arg0) {
            Log.i(TAG, "connectionLost"); // 失去連接,重連
        }
    };


4. 參考

  1. MQTT協議筆記之連接和心跳
  2. Mqtt精髓系列之心跳機制
  3. MQTT協議(二)連接和心跳
  4. MQTT協議之連接和心跳介紹
  5. MQTT協議及應用場景
  6. MQTT斷線重連訂閱無法接收
  7. MQTT斷線重連
  8. MQTT協議3.1.1中文翻譯版 文檔均爲mqtt協議的說明,沒有具體如何使用的指導,深入研究協議的可以看
  9. MQTT Android
  10. 使用MqttAndroidClient完成IM
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章