1.
什麼叫MQTT?
1.0
全稱:Message Queuing Telemetry Transport
((消息隊列遙測傳輸)。是IBM
開發的一個即時通訊協議
。
1.1
其具有協議簡潔
、小巧
、可擴展性強
、省流量
、省電
等優點,而且已經有PHP
,JAVA
,Python
,C
,C#
,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.
錯誤彙總
-
MQTT連接斷開,(
32109
) -java.io.EOFException錯誤
原因:客戶端唯一標識重複
導致的
具體可參考:Connection lost (32109) - java.io.EOFException -
MQTT斷線重連訂閱無法接收
// 配置裏將cleanSession設爲true,當客戶端掉線時,服務器端會清除客戶端 session
// 重連後 客戶端會有一個新的session
connOpts.setCleanSession(true);
解決: cleanSession設爲false,客戶端掉線後,服務器端不會清除session,當重連後可以接收之前訂閱主題的消息。當客戶端上線後會接受到它離線的這段時間的消息
- 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.
參考
- MQTT協議筆記之連接和心跳
- Mqtt精髓系列之心跳機制
- MQTT協議(二)連接和心跳
- MQTT協議之連接和心跳介紹
- MQTT協議及應用場景
- MQTT斷線重連訂閱無法接收
- MQTT斷線重連
- MQTT協議3.1.1中文翻譯版
文檔均爲mqtt協議的說明,沒有具體如何使用的指導,深入研究協議的可以看
- MQTT Android
- 使用MqttAndroidClient完成IM