MQTT協議分析與c語言實現(上)

MQTT協議分析與c語言實現(上)

一、mqtt協議介紹

1.1 概述

MQTT是一個客戶端服務端架構的發佈/訂閱模式的消息傳輸協議。它的設計思想是輕巧、開放、簡單、規範,易於實現。這些特點使得它對很多場景來說都是很好的選擇,特別是對於受限的環境如機器與機器的通信(M2M)以及物聯網環境(IoT)。

1.2 特點

a) 開放消息協議,簡單易實現
b) 發佈訂閱模式,一對多消息發佈
c) 基於TCP/IP網絡連接
d) 1字節固定報頭,2字節心跳報文,報文結構緊湊
e) 消息QoS支持,可靠傳輸保證

1.3 應用

MQTT協議廣泛應用於物聯網、移動互聯網、智能硬件、車聯網、電力能源等領域。
a) 物聯網M2M通信,物聯網大數據採集
b) Android消息推送,WEB消息推送
c) 移動即時消息,例如Facebook Messenger
d) 智能硬件、智能傢俱、智能電器
e) 車聯網通信,電動車站樁採集
f) 智慧城市、遠程醫療、遠程教育
g) 電力、石油與能源等行業市場

二、mqtt協議報文格式組成

2.1 mqtt控制報文結構

MQTT 協議通過交換預定義的 MQTT 控制報文來通信。 這一節描述這些報文的格式。MQTT 控制報文由三部分組成,如下圖:
在這裏插入圖片描述

2.2 mqtt固定報頭

每個 MQTT 控制報文都包含一個固定報頭, 固定報頭的格式如下圖:
在這裏插入圖片描述

2.3 mqtt控制報文類型

位置: 第 1 個字節, 二進制位 7-4,表示爲 4 位無符號值。
在這裏插入圖片描述

2.4 標記

固定報頭第 1 個字節的剩餘的 4 位 [3-0]包含每個 MQTT 控制報文類型特定的標誌 。
在這裏插入圖片描述
DUP1 =控制報文的重複分發標誌
QoS2 = PUBLISH 報文的服務質量等級
RETAIN3 = PUBLISH 報文的保留標誌

2.5剩餘長度

位置:從第二個字節開始。剩餘長度( Remaining Length) 表示當前報文剩餘部分的字節數, 包括可變報頭和負載的數據。 剩餘長度不包括用於編碼剩餘長度字段本身的字節數。
在這裏插入圖片描述
剩餘長度字段使用一個變長度編碼方案, 對小於 128 的值它使用單字節編碼。 更大的值按下面的方式處理。低 7 位有效位用於編碼數據,最高有效位用於指示是否有更多的字節。 因此每個字節可以編碼 128 個數值和一個延續位( continuation bit) 。 剩餘長度字段最大 4 個字節。
例如, 十進制數 64 會被編碼爲一個字節, 數值是 64, 十六進制表示爲 0x40,。十進制數字321(=65+2*128)被編碼爲兩個字節, 最低有效位在前。 第一個字節是 65+128=193。 注意最高位爲
1 表示後面至少還有一個字節。 第二個字節是 2。

2.6 可變報頭

某些 MQTT 控制報文包含一個可變報頭部分。 它在固定報頭和負載之間。可變報頭的內容根據報文類型的不同而不同。報文標識符是可變報頭一種,可變報頭的報文標識符( Packet Identifier) 字段存在於在多個類型的報文裏。
在這裏插入圖片描述
很多控制報文的可變報頭部分包含一個兩字節的報文標識符字段。 這些報文是 PUBLISH( QoS>0 時) ,PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCIBE,UNSUBACK。
在這裏插入圖片描述
在這裏插入圖片描述
客戶端和服務端彼此獨立地分配報文標識符。 因此,客戶端服務端組合使用相同的報文標識符可以實現併發的消息交換。
例如,當client發送一個packet Identifier =0x1234的報文給server時,server的回覆報文packet identifier 必須是0x1234,Packet identifier 從1開始遞增,到達65535時,又從1開始計算。
在這裏插入圖片描述

2.7 有效載荷

某些 MQTT 控制報文在報文的最後部分包含一個有效載荷,帶有有效載荷報文類型如下表所示:
在這裏插入圖片描述

參考

《MQTT-3.1.1-CN.pdf》
https://download.csdn.net/download/ZZEZZEZY/11986143

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章