MQTT-協議原理
- ■ MQTT-協議原理
- ■ MQTT-服務器 稱為"消息代理"(Broker)
- ■ MQTT協議中的訂閱、主題、會話
- ■ 一、訂閱(Subscription)
- ■ 二、會話(Session)
- ■ 三、主題名(Topic Name)
- ■ 四、主題篩選器(Topic Filter)
- ■ 五、負載(Payload)
- ■ MQTT協議數據包結構
- ■ (1)固定報頭(Fixed header)
- ■ 1.1 MQTT控制報文的類型
- ■ 1.2 報文類型標志位
- ■ 1.3 剩余長度
- ■ (2)可變報頭(Variable header)
- ■ (3)消息體(Payload)
- ■
■ MQTT-協議原理
MQTT協議中有三種身份: 發布者(Publish)、 代理(Broker)(服務器)、 訂閱者(Subscribe)。
MQTT傳輸的消息分為: 主題(Topic) 負載(payload)
■ MQTT-服務器 稱為"消息代理"(Broker)
MQTT服務器以稱為"消息代理"(Broker),可以是一個應用程序或一臺設備。
它是位于消息發布者和訂閱者之間,它可以:
(1)接受來自客戶的網絡連接;
(2)接受客戶發布的應用信息;
(3)處理來自客戶端的訂閱和退訂請求;
(4)向訂閱的客戶轉發應用程序消息。
■ MQTT協議中的訂閱、主題、會話
■ 一、訂閱(Subscription)
訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話可以包含多個訂閱。每一個會話中的每個訂閱都有一個不同的主題篩選器。
■ 二、會話(Session)
每個客戶端與服務器建立連接后就是一個會話,客戶端和服務器之間有狀態交互。會話存在于一個網絡之間,也可能在客戶端和服務器之間跨越多個連續的網絡連接。
■ 三、主題名(Topic Name)
連接到一個應用程序消息的標簽,該標簽與服務器的訂閱相匹配。服務器會將消息發送給訂閱所匹配標簽的每個客戶端。
■ 四、主題篩選器(Topic Filter)
一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。
■ 五、負載(Payload)
消息訂閱者所具體接收的內容。
■ MQTT協議數據包結構
在MQTT協議中,一個MQTT數據包由:固定報頭(Fixed header)、可變報頭(Variable header)、消息體(payload)三部分構成。MQTT數據包結構如下:
(1)固定報頭(Fixed header)。存在于所有MQTT數據包中,表示數據包類型及數據包的分組類標識。
(2)可變報頭(Variable header)。存在于部分MQTT數據包中,數據包類型決定了可變頭是否存在及其具體內容。
(3)消息體(Payload)。也是效載荷 存在于部分MQTT數據包中,表示客戶端收到的具體內容。
■ (1)固定報頭(Fixed header)
固定包頭包含
控制報文類型
控制報文標志位
剩余長度
剩余長度是可變的 1-4 個字節
■ 1.1 MQTT控制報文的類型
■ 1.2 報文類型標志位
[3-0]包含每個 MQTT 控制報文類型特定的標志
DUP1 =控制報文的重復分發標志
QoS2 = PUBLISH 報文的服務質量等級
RETAIN3 = PUBLISH 報文的保留標志
■ 1.3 剩余長度
位置: 從第 2 個字節開始。
剩余長度(Remaining Length) 表示當前報文剩余部分的字節數, 包括可變報頭和負載的數據。
剩余長度 不包括用于編碼剩余長度字段本身的字節數。
剩余長度字段 使用一個變長度編碼方案:
對小于 128 的值它使用單字節編碼。
更大的值按下面的方式處理。低 7 位有效位用于編碼數據,最高有效位用于指示是否有更多的字節。
因此每個字節可以編碼 128 個數值和一個延續位(continuation bit) 。
剩余長度字段最大 4 個字節。
例如:剩余長度字節長度是64 剩余長度填充的值就是一個字節表示64。
答 :對小于 128 的值它使用單字節編碼。
例如:剩余長度是321 剩余長度填充的值 如下:
答 :大于 128 低 7 位有效位用于編碼數據
計算原理
321-128 = 193 //193又大于128 在減去
193-128 = 65
第一個字節: 193
第二個字節: 2 // 321 / 128 = 2 相當于上面減去兩次128
假如 第二個字節又大于128 在進行上面計算原理。
■ (2)可變報頭(Variable header)
可變報頭的內容根據報文類型的不同而不同。
可變報頭的報文標識符(Packet Identifier) 字段存在于在多個類型的報文里。
控制報文的可變報頭部分包含兩字節的報文標識符字段。