物聯網數據接入篇-應用層MQTT(6)
前幾篇文章講述的是TCP/IP 模型中的網絡接口層、網絡層、傳輸層、應用層部分協議,這里到了第四層應用層的 MQTT協議。都是物聯網常用的應用層協議。CoAP 協議 OPC 放到之后寫。
MQTT 協議
消息隊列遙測傳輸,Message Queuing Telemetry Transport,MQTT 是ISO 標準下基于發布/訂閱(Publish/Subscribe)范式的消息協議。它工作在TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議。
MQTT最大優點在于,用極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。為什么,因為協議簡單,開銷就?。话l布訂閱模式,解耦了發布者和訂閱者,他們不需要直接傳遞消息,有個中介幫忙,同樣的數據,我就上傳一份,再傳出去一份,就想導游只說一遍,大家都帶著藍牙耳機,都能聽到;持久會話,不會經常斷開重連,這都耗電。
作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
MQTT 的消息發布和訂閱模式,像微博一樣,有一個消息發布者,有一批訂閱著,有個服務器。消息發布者把消息發送到服務器,訂閱者訂閱消息,就能收到消息。
HTTP 基于請求響應,像微信聊天,我和你加好友,建立連接,我發消息,你接受消息。必須要建立穩定可靠的連接。
工作原理
發布者將消息發布到代理服務器,代理服務器根據訂閱者的訂閱情況將消息分發給相應的訂閱者。
組成部分
主要包括發布者(Publisher)、訂閱者(Subscriber)、代理服務器(Broker)。
發布者 Publisher:
使用MQTT的程序或設備??蛻舳送ㄟ^網絡連接到服務端。它可以發布應用消息給服務端。
服務端 Server:
一個程序或設備,作為發送消息的客戶端和請求訂閱的客戶端之間的中介。服務端接受來自客戶端的網絡連接、接受客戶端發布的應用消息、處理客戶端的訂閱和取消訂閱請求、轉發應用消息給符合條件的已訂閱客戶端。
訂閱者 Subscriber:
訂閱包含一個主題過濾器(Topic Filter)和一個最大的服務質量(QoS)等級。訂閱與單個會話(Session)關聯。會話可以包含多于一個的訂閱。會話的每個訂閱都有一個不同的主題過濾器。
Topic(主題):
Topic具有兩層含義:其一,在發布消息時,主題會與消息相關聯,以此向 服務端 表明這條消息要發送至哪個主題;其二,在訂閱消息時,客戶端需向 服務端 表明自己對哪個主題感興趣,一旦有消息發送給這個主題,服務端 便會將該消息發給此主題的訂閱者。主題支持通配符,而對于使用通配符的主題,我們將其稱作 Topic Filter。
MQTT 控制報文
在MQTT協議中,一個MQTT數據包由:固定頭(Fixed header)、可變頭(Variable header)、消息體(payload)三部分構成。MQTT數據包結構如下:
- 消息類型:4位的無符號值。表示服務器到客戶端的單向還是雙向通信,發送消息還是訂閱消息還是取消訂閱消息。
- 標識位 / DUP:Duplicate Flag,用于指示該 Publish 報文是否為重發報文。如果 DUP 標志被設置為 0,表示第一次請求發送這個 Publish 報文;如果 DUP 標志被設置為 1,表示這可能是一個早前報文請求的重發。客戶端或服務器請求重發一個 Publish 報文時,必須將 DUP 標志設置為 1。
- Qos:Quality of Service(服務質量)。它是用于消息可靠性傳遞的一個參數,具有 3 個取值,具體為:0:表示消息僅發送一次,不確保發送成功。1:意味著消息最少發送一次,保證發送成功,但由于可能會發送多次,所以接收方可能會收到重復消息。2:表明消息僅發送一次且保證成功,接收方不會接到重復消息。在發送消息時,可以對 QoS 進行指定,如果 QoS 大于 0,那么消息必然會被發送至 Broker。而在訂閱主題時,同樣也可以指定 QoS,如果 QoS 大于 0,那么 Broker 一定會將消息發送給訂閱者,不會出現消息丟失的情況。
- RET:Publish Retain Flag,發布保留標識。指示服務器是否要保留發布的消息。當RET標志位設置為1時,表示服務器要保留這次推送的信息。如果有新的訂閱者出現,服務器會將保留的消息推送給它。如果沒有新的訂閱者,服務器會在推送至當前訂閱者后釋放該消息。如果RET標志位設置為0,則服務器不會保留發布的消息。
- 剩余長度:Remaining Length,表示當前報文剩余部分的字節數,包括可變報頭和負載的數據。剩余長度不包括用于編碼剩余長度字段本身的字節數。
- 可變頭:位于固定頭和負載之間??勺冾^的內容因數據包類型而異,通常包含與特定數據包類型相關的信息,例如數據包標識、主題名等。
- 消息體:Payload,也叫有效載荷。CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的消息 有消息體: CONNECT,消息體內容主要是,客戶端的ClientID、訂閱的Topic、Message以及用戶名和密碼。 SUBSCRIBE,消息體內容是一系列的要訂閱的主題以及QoS。 SUBACK,消息體內容是服務器對于SUBSCRIBE所申請的主題及QoS進行確認和回復。 UNSUBSCRIBE,消息體內容是要取消訂閱的主題。
太枯燥了,舉個例子:
特點
- 輕量級:占用資源少,適合資源受限的設備。
- 可靠性高:提供不同等級的服務質量保證。MQTT 協議提供了 3 種消息服務質量等級,保證了在不同的網絡環境下消息傳遞的可靠性。
- 低帶寬需求:MQTT 的最小報文僅為 2 個字節,比 HTTP 占用更少的網絡開銷。
- 穩定連接:MQTT 與 HTTP 都能使用 TCP 連接,并實現穩定、可靠的網絡連接。
- 安全雙工通信:MQTT 基于發布訂閱模型,HTTP 基于請求響應,因此 MQTT 支持雙工通信。依賴于發布訂閱模式,MQTT 允許在設備和云之間進行雙向消息通信。發布訂閱模式的優點在于:發布者與訂閱者不需要建立直接連接,也不需要同時在線,而是由消息服務器負責所有消息的路由和分發工作。
MQTT 可實時推送消息,但 HTTP 需要通過輪詢獲取數據更新。
MQTT 是有狀態的,但是 HTTP 是無狀態的。為了應對網絡不穩定的情況,MQTT 提供了心跳?;睿↘eep Alive)機制。在客戶端與服務端長時間無消息交互的情況下,Keep Alive 保持連接不被斷開,若一旦斷開,客戶端可即時感知并立即重連。同時,MQTT 設計了遺愿消息,讓服務端在發現客戶端異常下線的情況下,幫助客戶端發布一條遺愿消息到指定的 MQTT 主題。
MQTT 可從連接異常斷開中恢復,HTTP 無法實現此目標。
靈活性:基于服務訂閱模式,消息路由更為靈活。
MQTT 協議和 HTTP 的對比:
應用
物聯網:各類物聯網設備之間的通信。
移動應用消息推送。
遠程監控系統。
智能家居。
工業自動化等領域。
后記
這個系列,物聯網協議進行到了尾聲,這篇寫 MQTT,下面會寫 CoAP、OPC,都是重頭戲。
參考文獻
15 張圖, 把TCP/IP 講得一清二楚!-騰訊云開發者社區-騰訊云
什么是OPC UA&它是如何工作的?_嗶哩嗶哩_bilibili
探索 OSI 會話層:建立和管理通信會話的關鍵_不同機器之間用戶會話的建立與管理-CSDN博客
【2024軟考】《網絡工程師》新版精講視頻-希賽網(零基礎系統教程,建議收藏)!_嗶哩嗶哩_bilibili
MQTT協議_mqtt payload一定要字符串嗎-CSDN博客
MQTT協議_mqtt payload一定要字符串嗎-CSDN博客
如何使用CoAP的對稱加密自主接入和DTLS自主接入_物聯網平臺(IoT)-阿里云幫助中心
network_protocol_structures.pdf
modbus_application_protocol_specification_v1.1b3.pdf
https://help.dtuip.com:8888/images/20191028084839667.pdf
https://zh.wikipedia.org/wiki/Modbus
本文由 @躍曰 原創發布于人人都是產品經理。未經作者許可,禁止轉載。
題圖來自Unsplash,基于CC0協議。
該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。
- 目前還沒評論,等你發揮!