一.簡述
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發佈。MQTT最大優點在於,可以以極少的代碼和有限的帶寬,爲連接遠程設備提供實時可靠的消息服務。作爲一種低開銷、低帶寬佔用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。標準MQTT協議包括連接,連接確認,發佈消息,發佈確認,發佈收到,發佈釋放,發佈完成,訂閱主題,訂閱確認,取消訂閱,取消確認,心跳請求,心跳響應,斷開連接。標準MQTT協議基於TCP的socket連接。
二.具體實現
1.報文幀格式
包括: 固定報頭 + 可變報頭 +有效載荷
固定報頭:
可變報頭:
包括:
協議名(00 04 ‘M’ ‘Q’ ‘T’ ‘T’)+協議級別(3.1.1版本尾0x04)+連接標誌(0xC2)+保持連接(保持連接秒數, 2字節,一般120秒,即0x00 0x78)
連接標誌包括:用戶名標誌,密碼標誌,遺囑保留,遺囑QoS,遺囑標誌,清除會話。
有效載荷:
2.連接
客戶端和服務器的底層網絡連接建立後,客戶端需要發送的第一幀報文。
固定報頭: 0x10 +長度(一般2字節,低位在前,見上面截圖)
可變報頭:00 04 4D 51 54 54 04 C0 00 78 或 00 04 4D 51 54 54 04 C2 00 78
有效載荷:客戶端標識符長度+客戶端標識符內容+用戶名長度+用戶名內容+密碼長度+密碼內容
例如:
10 25 00 04 4D 51 54 54 04 C0 00 78 00 09 35 34 34 39 34 32 32 36 37 00 06 32 37 35 35 39 35 00 06 31 32 33 34 35 36
其中客戶端標識符長度9,內容 35 34 34 39 34 32 32 36 37
用戶名長度6,內容 32 37 35 35 39 35
密碼長度6,內容 31 32 33 34 35 36
3.取消/確認連接
確認連接:服務器返回 20 02 00 00 或 20 02 01 00 (受清理會話標誌的影響)
斷開連接:重複發送連接報文,或發送 E0 00 即表示客戶端斷開連接,服務器不響應。
4.客戶端訂閱主題
固定報頭(2字節)+可變報頭(2字節報文標識符)+有效載荷
有效載荷=主題名稱(2字節的主題字符串長度+字符串內容)+服務質量要求(0,1,2)
示例:(訂閱“abc”主題的消息)
82 08 00 0A 00 03 61 62 63 00
服務器訂閱確認:
固定報頭(2字節)+可變報頭(2字節報文標識符)+有效載荷(1字節,0x00表示最大QoS0)
90 03 00 0A 00
5.客戶端取消訂閱
固定報頭(2字節)+可變報頭(2字節報文標識符)+有效載荷(長度+主題)
示例:(取消訂閱“abc”主題的消息)
A2 07 00 0A 00 03 61 62 63
服務器取消訂閱確認:
固定報頭(2字節)+可變報頭(2字節報文標識符)
B0 02 00 0A
6.客戶端發佈消息
客戶端向服務端傳輸一個應用消息
固定報頭+可變報頭+有效載荷
DUP爲重發標誌,第一次發時置0。RETAIN爲保留標誌。
剩餘長度=可變報頭長度+有效載荷的長度。
可變報頭=主題名(長度+主題內容)+報文標識符(QoS等級爲1或2時才存在)
有效載荷:所發佈消息的內容
示例:發佈abc主題的內容:12345
30 0A 00 03 61 62 63 31 32 33 34 35
7.心跳請求/響應
客戶端發送: C0 00
服務器響應: D0 00