Loading AI tools
来自维基百科,自由的百科全书
消息隊列遙測傳輸(英語:Message Queuing Telemetry Transport,MQTT[1])是ISO 標準(ISO/IEC PRF 20922)[2]下基於發布(Publish)/訂閱(Subscribe)範式的消息協議,可視為「資料傳遞的橋樑」[3]。它工作在TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議。為此,它需要一個消息中間件(如HTTP),以解決當前繁重的資料傳輸協議。 [3]
IBM公司的安迪·斯坦福-克拉克及Arcom公司的阿蘭·尼普於1999年撰寫了該協議的第一個版本。[4]
該協議的可用性取決於該協議的使用環境。IBM公司在2013年就向結構化資訊標準促進組織提交了 MQTT 3.1 版規範,並附有相關章程,以確保只能對規範進行少量更改。[5]。MQTT-SN[6]是針對非 TCP/IP 網絡上的嵌入式設備主要協議的變種,與此類似的還有 ZigBee 協議。
縱觀行業的發展歷程,「MQTT」中的「MQ」 是來自於IBM的MQ系列消息隊列產品線[7]。然而通常隊列本身不需要作為標準功能來支持。[8]
可選協議包含了高級消息隊列協議,面向文本的消息傳遞協議,互聯網工程任務組約束應用協議,[9] 可擴展消息與存在協議,[10][11]數據分發服務,[12]OPC UA[13]以及 web 應用程序消息傳遞協議。
MQTT 協議定義了兩種網絡實體:消息代理(message broker)與客戶端(client)。其中,消息代理用於接收來自客戶端的消息並轉發至目標客戶端。[14]MQTT 客戶端可以是任何運行有 MQTT 庫並通過網絡連接至消息代理的設備,例如微型控制器或大型服務器。
信息的傳輸是通過主題(topic)管理的。發布者有需要分發的數據時,其向連接的消息代理發送攜帶有數據的控制消息。代理會向訂閱此主題的客戶端分發此數據。發布者不需要知道訂閱者的數據和具體位置;同樣,訂閱者不需要配置發布者的相關信息。
如果消息代理接受到某個主題上的消息,且這個主題沒有任何訂閱,那麼代理就會丟棄之,除非發布者將其標記為保留消息(retained message)。[15]
當發布客戶端首次與代理連接時,客戶端可以設置一個默認消息。當代理發現發布者意外斷開,其會向訂閱者發送此預設的消息。
客戶端僅與代理有直接的數據傳輸,但整個系統中可能有多個代理,其於當前訂閱者的主題交換數據。
MQTT 控制消息最小只有 2 字節的數據。最多可以承載 256 Mb 的數據。有 14 種預定義的消息類型用於:連接客戶端與代理、斷開連接、發布數據、確認數據接收、監督客戶端與代理的連接。
MQTT 基於 TCP 協議,用於數據傳輸。變體 MQTT-SN 用於在藍牙上傳輸,基於 UDP。
MQTT 協議使用普通文本發送連接認證書,且並不包含任何安全或認證相關的措施。但可以使用傳輸層安全來加密並保護發送的數據,以防止攔截、修改或偽造。
MQTT 默認端口為 1883,加密的端口為 8883。[16]
等待與服務器建立連接然後創建節點之間的連接。
最大保活間隔:18小時12分鐘15秒。客戶在保活間隔乘以1.5倍的時間內可以不與broker通信。如果客戶沒有消息發給broker,則應該發布PINGREQ包;broker回復PINGRESP包。
broker具有Client Take-Over功能,以便在客戶重連broker,但broker認為與客戶的TCP連接還存在時(稱為Half-Open),能刪除原有連接,接收重連請求。
等待MQTT客戶端完成所必須完成的工作,然後等待TCP/IP會話關閉連接。
WebSockets是在一個TCP連接上全雙工通信。可以使得普通的網頁瀏覽器成為基於WebSocket的MQTT client。
連接broker的會話分為兩種:
建立與broker的connection時,參數clean session設置為真則創建非持久會話,否則創建持久會話。
Topic是個utf-8編碼的字符串,「topic level」由/
(U+002F)分割開。topic name中相鄰的2個分隔符表示一個0長的topic level。
topic name和topic filter是:
訂閱者的topic filter可包含通配符,使其同時能訂閱多個topic:
check/+/baseline
。必須占據整個topic level。可是第一層或者最後一層。「sport/+」不匹配「sport」但是匹配「sport/」。「/finance」匹配「+/+」和「/+」,但不匹配「+」。「sport+」是無效的。topic name中不能包含上述通配符。
將請求傳遞給MQTT客戶端後立即返回到應用程序線程。
服務品質指的是交通優先級和資源預留控制機制,而不是接收的服務品質。 服務品質是為不同應用程序,用戶或數據流提供的不同優先級的能力,或者也可以說是為數據流保證一定的性能水平的能力。
以下是每一個服務品質級別的具體描述:
broker會在該主題(topic)下保留最新一條帶有Retained標誌的消息。新訂閱者或者重連的訂閱者總是會收到broker保存的最新的Retained Message。
這可用於發布者讓訂閱者總是能獲取到最新的狀態信息。
如果發布一條zero-byte payload的Retained Message,則broker就會刪除保存的Retained Message。
當一個會話(session)不文雅的(ungraceful)、出乎意料的(unexpected)的斷連時,Last Will and Testament (LWT)可用於通知其它連接在這個broker上的客戶端。
客戶可以在一個topic下向broker發出CONNECT message時可以發出一條LWT消息。broker保存這條LWT消息,直到客戶發出一條DISCONNECT消息文雅地斷連為止。broker檢測到下設情況之一,就會給所有訂閱了LWT主題的客戶發布LWT:
已經有幾個工程項目實現了 MQTT協議。例如:
名字 | 開發者 | 開發語言 | 類型 | 初次發布日期 | 最新發布版本 | 最新發布日期 | 許可證 |
---|---|---|---|---|---|---|---|
Adafruit IO | Adafruit | Ruby on Rails, Node.js[34] | 客戶端 | ? | 2.0.0[35] | ? | ? |
EMQX | EMQ Technologies Co., Ltd. [36] | Erlang | 中間件 | 2016-04-13 | 4.2.2[37] | 2020-10-26 | Apache許可證 2.0 |
M2Mqtt | Eclipse基金會 | C# | 客戶端 | 2017-05-20 | 4.3.0.0[38] | 2017-05-20 | Eclipse公共許可證 1.0 |
Machine Head | ClojureWerkz 團隊 | Clojure | Client | 2013-11-03 | 1.0.0[39] | 2017-03-05 | 知識共享署名 3.0 Unported 許可證 |
moquette | Selva, Andrea | Java | 中間件 | 2015-07-08 | 0.12[40] | 2019-03-03 | Apache許可證 2.0 |
Mosquitto | Eclipse基金會 | C語言, Python | 中間件和客戶端 | 2009-12-03 | 1.6.12a[41] | 2020-08-19 | Eclipse公共許可證 1.0, Eclipse發行許可證 1.0 (BSD) |
Paho MQTT | Eclipse基金會 | C語言, C++, Java, Javascript, Python, Go | 客戶端 | 2014-05-02 | 1.4.1[42] | 2019-02-25 | Eclipse公共許可證 1.0, Eclipse發行許可證 1.0 (BSD)[43] |
wolfMQTT | wolfSSL | C語言 | 客戶端 | 2015-11-06 | 1.7.0[44] | 2020-08-21 | GNU通用公共許可協議, version 2 |
MQTTRoute | Bevywise Networks | C語言, Python | 中間件 | 2017-04-25 | 1.0[45] | 2017-12-19 | 專有許可證[46] |
MQTT-Client-Framework | novastone | Objective-C | 客戶端 | 2015-01-22 | 0.15.3[47] | 2019-10-23 | Eclipse公共許可證 1.0 |
MqttDesk | ioCtrl technologies | React.js, Node.js | 客戶 | 2021-04-12 | 2.1.0[48] | 2021-008-1 | Proprietary |
更完整的 MQTT 庫可以在 GitHub 上找到。