樂鑫官網中文esp32 WiFi+藍牙無線接收模塊MQTT 協議功能,從遠程控制的拓撲結構來看,智能手機和被控設備不是直接連接的,智能手機和被控設備都連接到云服務器(云端),智能手機發送的數據和被控設備發送的數據都是通過云端進行轉發的。那么,設備與云端連接的協議是什么?數據通信的協議是什么?只有弄清楚這些協議,才能對遠程控制有一定的認識。目前常見的設備與云端連接的協議有 MQTT 協議和 HTTP 協議。本文主要介紹 MQTT 協議。
MQTT 協議介紹
MQTT (Message Queue Telemetry Transport)是一個基于客戶端/服務器端(C/S)架構的發布/訂閱模式的消息傳輸協議。該協議具有輕巧、開放、簡單、規范和易于實現的特點,適合于資源受限設備,屬于物聯網的標準傳輸協議之一。樂鑫官網中文esp32 WiFi+藍牙無線接收模塊MQTT 協議由 IBM 于 1999 年發布,目前MQTT 協議已經發展到 v5.x,ESP-IDF 支持v3.1.1。MQTT v5.x 與 v3.x 的差異比較大,而且不是互相兼容的。目前市面上大部分云平臺還是以 v3.x 為主,因此本文介紹的是 MQTT v3.x。
MQTT 協議運行在 TCP 協議之上,具有如下特點:
·使用發布/訂閱消息模式,提供了一對多的消息分發模式和應用之間的解耦。
·消息傳輸時不需要知道負載內容。
·提供三種等級的服務質量(QoS) 來保證數據的傳輸。
·傳輸消耗很小,可大限度地減少網絡流量。
·支持遺囑消息,在連接異常斷開時,能通知到相關各方。
MQTT 協議原理
MQTT 協議是基于客戶端與服務器端架構進行通信的。在樂鑫官網中文esp32 WiFi+藍牙無線接收模塊MQTT 協議中,有三個角色: 發布者 (Publisher)、代理服務器 (Broker) 和訂閱者(Subscriber)。發布者和訂閱者都屬于客戶端,并且客戶端可以既是消息的發布者也可以是消息的訂閱者;代理服務器是服務器端。
(1) 客戶端。通常指使用 MQTT 程序的設備,可以是發布者和訂閱者,一般可將智能手機和被控設備視為客戶端??蛻舳丝偸峭ㄟ^網絡連接到服務器端的,可以現實以下功能:
·將應用消息發布給其他相關的客戶端。
·通過訂閱以請求接收相關的應用消息。
·通過取消訂閱以移除接收應用消息的請求
·斷開和服務器端的連接。
(2)服務器端。通常指代理服務器,作為發送消息的客戶端和請求訂閱的客戶端之間的中介一般可將云平臺和云服務器視為服務器端。服務器端可以實現以下功能:
·接收來自客戶端的網絡連接。
·接收客戶端發布的應用消息。
·處理客戶端的訂閱和取消訂閱請求。
·將應用消息轉發給符合條件的客戶端。
(3)訂閱(Subscribe)。樂鑫官網中文esp32 WiFi+藍牙無線接收模塊訂閱包含一個主題過濾器(Topic Filter)和一個大的服務質量(QoS)等級。訂閱與單個會話(Session) 關聯,會話可以包含多個訂閱。會話的每個訂閱都有一個不同的主題過濾器。
(4)主題 (Topic)。主題是附加在應用消息上的一個標簽,服務器端在已知該標簽的情況下向訂閱了該標簽的客戶端發送該應用消息的副本。
(5)主題過濾器(Topic Filter)。訂閱中包含的一個表達式,用于表示相關的一個或多個主題。
主題過濾器可以使用通配符,用于代替單個或多個字符。
(6)會話(Session)??蛻舳撕头掌鞫酥g的狀態交互,一些會話的持續時長與網絡連接樣??蛻舳撕头掌鞫藦慕⑦B接到斷開連接之間的狀態交互稱為會話。
(7)訂閱與發布模式。訂閱與發布模式是樂鑫官網中文esp32 WiFi+藍牙無線接收模塊MQTT 協議的靈魂,訂閱者和發布者不需要關心對端的IP地址和端口號,也不需要直接與對端相連,它們甚至不知道對端是否存在。訂閱者和發布者之間由代理服務器維系兩者的消息交換,代理服務器過濾所有發布者發布的消息,然后分發給合適的訂閱者。發布者和訂閱者都需要關心消息的主題。例如,智能手機想查看智能燈 A 的狀態,此時智能毛機可以作為訂閱者向代理服務器訂閱主題為 A/light_state 的訂閱消息,智能燈設備 A可以作為發布者,當智能燈的狀態發生變化時,就會發布主題為 A/light_state 的狀態消息給代理服務器;代理服務器過濾訂閱了主題 A/light state 的訂閱者,將狀態消息發布給智能手機,這樣智能手機就能查詢到智能燈 A 的狀態。
MQTT 消息格式
在MQTT 協議中,MQTT 控制報文由固定頭 (Fixed Header)、可變頭(Variable Header) 和消息體(Payload)三部分組成。
(1)固定頭。存在于所有 MQTT 控制報文中。
樂鑫官網中文esp32 WiFi+藍牙無線接收模塊MOTT 控制報文的類型占 4 bit,一共有 14 種類型:
名字 值 報文流動方向 描述
Reserved 0 禁止 保留
CONNECT 1 客戶端到服務器端 客戶端請求連接服務器端
CONNACK 2 服務器端到客戶端 連接報文確認
PUBLISH 3 兩個方向都允許 發布消息
PUBACK 4 兩個方向都允許 QoS 1 消息發布收到確認
PUBREC 5 兩個方向都允許 發布收到(保證交付一步)
PUBREL 6 兩個方向都允許 發布釋放(保證交付第二步)
PUBCOMP 7 兩個方向都允許 QoS 2 消息發布完成(保證交互第三步)
SUBSCRIBE 8 客戶端到服務器端 客戶端訂閱請求
SUBACK 9 服務器端到客戶端 訂閱請求報文確認
UNSUBSCRIBE 10 客戶端到服務器端 客戶端取消訂閱請求
UNSUBACK 11 服務器端到客戶端 取消訂閱報文確認
PINGREQ 12 客戶端到服務器端 心跳請求
PINGRESP 13 服務器端到客戶端 心跳響應
DISCONNECT 14 客戶端到服務器端 客戶端斷開連接
樂鑫官網中文esp32 WiFi+藍牙無線接收模塊MQTT 消息質量有三個等級,即 QoS 0、QoS 1和QS 2。
1) QoS 0。多分發一次。消息的傳輸完全依賴底層的 TCP/IP 網絡,MQTT 協議里沒有定
應答和重試,消息要么只會到達服務器端一次,要么根本沒有到達。
2) QoS 1。至少分發一次。服務器的消息接收由 PUBACK 消息進行確認,如果通信鏈路或發送設備異常,或者在指定時間內沒有收到確認消息,則發送端會重發這條報文,并且在 MOTT控制報文固定頭中設置重發標志位 (DUP)。
3) QoS 2。只分發一次。這是高級別的服務質量等級,消息丟失和重復都是不可接受的,使用這個服務質量等級會有額外的開銷。
MOTT 控制報頭固定頭的 bit0~bit3 為標志位,依照控制報文類型有不同的含義。事實上,除了PUBLISH類型,其他控制報文類型的標志位均為系統保留,在不使用標志位的消息類型中,標志位被作為保留位。如果收到無效的標志,接收端就必須關閉網絡連接。PUBLISH報文頭Byte 1中 bito~bit3 組成如下:
1)DUP (bit3)。重發標志位。如果 DUP 標志位被設置為 0,則表示這是客戶端或服務器端一次請求發送 PUBLISH 報文。如果 DUP 標志位被設置為 1,則表示這可能是一個早前報文請求的重發。對于 QoS0 的消息,DUP 標志位必須設置為 0。
2) QoS (bit2~bit1)。發布消息的服務質量等級,保證消息傳輸的次數。Qo
S值與bit2~bit1的關系:
QoS值 bit2 bitl 描述
0 0 0 多分發一次
1 0 1 至少分發一次
2 1 0 只分發一次
- 1 1 保留
3)RETAIN(bit0)。保留標志位。如果客戶端發給服務器端的 PUBLISH 報文的保留(RETAIN)標志位被設置為 1,則服務器端必須存儲這個報文和它的服務質量等級(QoS),以便它可以被分發給未來與主題名匹配的訂閱者,在建立一個新的訂閱時,對于每個匹配的主題名,如果存在近保留的消息,則該消息必須被發送給這個訂閱者。RETAIN 標志位通常用于遺囑消息,例如在設備異常離線后,代服務器會將囑消息告知給智能手機,智能手機就會示設備離線的狀態。第 2個及以后的字節表示剩余長度,表示當前控制報文剩余部分的字節數,包括可變報頭和負載的數據。剩余長度字段使用一個可變長度的編碼方案,對小于 128 的值使用單字節編更大的值按下面的方式處理:低 7位有效位用于編碼數據,高有效位用于指示是否有更多的字節。因此每個字節可以編碼 128 個數值和一個延續位。剩余長度字段大為 4 B。剩余長度字節數如下表所示。
字節 小值 大值
1 0 (0x00) 127 (0x7F)
2 128 (0x80、0x01) 16383 (0xFF、0x7F)
3 16384 (0x80、0x80、0x01) 2097151 (0xFF、0xFF、0x7F)
4 2097152 (0x80、0x80、0x80、0x01) 268435455 (0xFF、xFF、0xFF、0x7F)
(2)可變頭。某些樂鑫官網中文esp32 WiFi+藍牙無線接收模塊MQTT 控制報文包含一個可變報頭部分,它在固定報頭和負載之間,可變報頭的內容根據控制報文類型的不同而不同??勺儓箢^的報文標識符(Packet Identifier)字段存在于多種類型的控制報文中,如 PUBLISH (QOS>0時)、PUBACK、PUBREC、PUBRELPUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCIBE、UNSUBACK。
(3)有效載荷。消息體位于 MQTT 數據報的第三部分,包含 CONNECT、SUBSCRIBE、
SUBACK、UNSUBSCRIBE 和 PUBLISH 五種類型的消息。
1) CONNECT。消息體內容主要是客戶端的 ClientID、訂閱的 Topic、Message,以及用戶名和密碼。
2) SUBSCRIBE。消息體內容是一系列要訂閱的主題以及 QoS。
3)SUBACK。消息體內容是服務器對于 SUBSCRIBE 所申請的主題以及 QoS 進行確認和回復。
4)UNSUBSCRIBE。消息體內容是要取消訂閱的主題。
5)PUBLISH。消息體內容是發布的應用消息,可以是零長度的。