【參考文章】:基於Mqtt的IM開發html
【參考文章】:阿里___MQTT中協議QoS的實現git
【參考文章】:MQTT入門篇github
1. 簡介
MQTT 是一個客戶端服務端架構的發佈/訂閱模式的消息傳輸協議。它的設計思想是輕巧、開放、簡單、規範,所以易於實現。這些特色使得它對不少場景來講都是很好的選擇,包括受限的環境如機器與機器的通訊(M2M)以及物聯網環境(IoT),這些場景要求很小的代碼封裝或者網絡帶寬很是昂貴。網絡
由於MQTT是協議,想要使用它就必須找實現這個協議的庫文件或者服務組件,這是實現MQTT協議的服務組件。架構
搭建完成MQTT的服務端環境,再經過封裝的MQTT客戶端API,就可使用了。post
2. 特色
- 輕量級的 machine-to-machine 通訊協議。
- publish/subscribe模式。
- 基於TCP/IP。
- 支持QoS。
3. 應用場景
- 適合於低帶寬、不可靠鏈接、嵌入式設備、CPU內存資源緊張。
- 是一種比較不錯的Android消息推送方案。
- FacebookMessenger採用了MQTT。
- MQTT有可能成爲物聯網的重要協議
4. 主題
MQTT是經過主題對消息進行分類的,本質上就是一個UTF-8的字符串,不過能夠經過反斜槓表示多個層級關係。主題並不須要建立,直接使用便可。url
主題還能夠經過通配符進行過濾。spa
/:用來表示層次,好比a/b,a/b/c。 設計
#:表示匹配>=0個層次,好比a/#就匹配a/,a/b,a/b/c。單獨的一個#表示匹配全部。不容許 a#和a/#/c。代理
+:表示匹配一個層次,例如a/+匹配a/b,a/c,不匹配a/b/c。單獨的一個+是容許的,a+不容許,a/+/b不容許
5. 服務質量(Quality of Service,QoS)
5.1 QoS=0
最多一次,質量級別最低,不須要應答確認。
盡操做環境所能提供的最大努力分發消息,可是遇到意外並不會重試。消息可能會丟失。
例如,這個等級可用於環境傳感器數據,單次的數據丟失不要緊,由於不久以後會再次發送。
5.2 QoS=1
至少一次,有可能重複。
消息接收者若是沒有知會或者知會自己丟失,消息發送者會再次發送以保證消息接收者至少會收到一次,固然可能形成重複消息。
收到控制報文後須要應答確認,好比建立鏈接、發消息、收消息、心跳。
5.3 QoS=2
只有一次,確保消息只到達一次(用於比較嚴格的計費系統)。
收到控制報文後須要應答確認,最高的服務質量,須要額外的開銷,由於這種質量下,收到控制報文須要雙向確認應答。
6. 消息類型
MQTT擁有14種不一樣的消息類型:
- CONNECT:客戶端鏈接到MQTT代理
- CONNACK:鏈接確認
- PUBLISH:新發布消息
- PUBACK:新發布消息確認,是QoS 1給PUBLISH消息的回覆
- PUBREC:QoS 2消息流的第一部分,表示消息發佈已記錄
- PUBREL:QoS 2消息流的第二部分,表示消息發佈已釋放
- PUBCOMP:QoS 2消息流的第三部分,表示消息發佈完成
- SUBSCRIBE:客戶端訂閱某個主題
- SUBACK:對於SUBSCRIBE消息的確認
- UNSUBSCRIBE:客戶端終止訂閱的消息
- UNSUBACK:對於UNSUBSCRIBE消息的確認
- PINGREQ:心跳
- PINGRESP:確認心跳
- DISCONNECT:客戶端終止鏈接前優雅地通知MQTT代理