基於STM32F746的MQTT實現

一.簡述

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

 

 

 

 

 

 

 

 

發佈了27 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章