MQTT
訊息佇咧列遙測傳輸(英語:Message Queuing Telemetry Transport,MQTT)是 ISO 標準(ISO / IEC PRF 二嬸空九百二十二)下是因為發布(Publish)/ 訂閱(Subscribe)範式的訊息協定,可看為著「資料傳達的橋梁」。 伊的工課佇咧 TCP / IP 協定族上,是為硬體效能低下遠端裝置佮網路的狀況害去的狀況之下設計發布 / 訂閱型訊息協定。為此,伊需要一个訊息中介軟體(如 HTTP), 以解決當前繁重的資料傳輸協定。
歷史
IBM 公司的安迪 ・ 斯坦福-克拉克及 Arcom 公司的阿蘭 ・ 尼普於一九九九年撰寫了該協定的頭一个版本。
該協定的可用性就決定協定的使用環境。IBM 公司佇二空一三年就向結構化資訊標準促進組織提交矣 MQTT 三-c一版規範,並且有相關的章程,確保只會當對規範進行少量更改。。 MQTT-SN 是針對非 TCP / IP 去網路頂懸的1875入式裝置主要協定的變種,佮這款類似的猶閣有 ZigBee 協定。
縱觀行業的發展歷程,「 MQTT」中的「MQ」是來自 IBM 的 MQ 系列訊息佇咧列產品線。毋過通常佇咧列本身無需要做標準功能來支援。
會當選定包括進階訊息佇列協定,面向文字的訊息傳遞協定,網際網路工程任務組約束應用協定,會當延伸訊息佮存在協定,資料分發服務,OPC UA 以及 web 應用程式訊息傳遞協定。
概覽
MQTT 協定義兩種網路實體:訊息代理(message broker)佮客戶捀(client)。 其中,訊息代理用佇接收來自客戶捀的訊息而且閣轉發到目標客戶捀。MQTT 客戶捀會當是任何執行有 MQTT 庫並通過網路連接著訊息代理的裝置,比如講微型控制器抑是大型侍服器。
資訊的傳輸是通過主題(topic)管理的。發布者有需要分發的資料時陣,其向連接的訊息代理發送紮有資料的控制訊息。代理會向訂閱此主題的客戶捀分發此資料。發布者無需要知影訂閱者的資料佮具體位置;仝款,訂閱者無需要組態發布者的相關資訊。
若是訊息代理接受著某一个主題的訊息,而且這个主題無任何訂閱,遐代理就會挕捒之,除非發布者共標記做保留訊息(retained message)。
當發佈客戶捀頭一改佮代理連接時,客戶捀會當設定一个預設訊息。當代理發現發布者意外斷開,其實會向訂閱者傳送此預設的訊息。
客戶捀干焦佮代理有直接的資料傳輸,毋過整個系統可能有幾个代理,其實當前訂閱者的主題交換資料。
MQTT 控制訊息上細漢只有二位元組的資料。上濟會當承載兩百五十六 Mb 的資料。有十四種預定義的訊息類型用佇咧:連接客戶捀佮代理、斷開連接、發佈資料、確認資料來接收、監督客戶捀佮代理的連接。
MQTT 是因為 TCP 協定,用佇資料傳輸。變體 MQTT-SN 用佇藍牙上傳輸,是因為 UDP。
MQTT 協定使用普通文字傳送連接認憑證,而且並無包含任何安全抑是認證相關的措施。毋過會當使用傳輸層的安全共加密並保護發送的資料,以防止攔截、修改抑是假造。
MQTT 預設埠為一千八百八十三,加密的埠為八千八百八十三。
連接
等待佮侍服器建立連接然後建立節點之間的連接。
保活 ( keep alive )
上大保活隔:十八點鐘十二分鐘十五秒。客戶佇保活間隔起來一个五倍的時間內會當無和 broker 通批。若客戶無訊息發予 broker,是應該發布 PINGREQ 包;broker 回覆 PINGRESP 包。
broker 具有 Client Take-Over 功能,以便佇客戶重連 broker,猶毋過 broker 認為佮客戶的 TCP 連接猶閣佇咧時陣(這號做 Half-Open), 會當刪除原有連接,相連紲請求。
斷開連接
等待 MQTT 客戶捀完成所必須愛完成的工課,然後等待 TCP / IP 對談關起來連接。
WebSockets
WebSockets 是佇一个 TCP 連接著全雙工通信。會使予普通的網頁瀏覽器成做基於 WebSocket 的 MQTT client。
維持久對談(Persistent Session)
連接 broker 的對談分做兩種:
- 維持久長的對談:但是對談和 broker 連鞭來,broker 會儲存對談已經訂閱的 QoS 為一抑是二的主題的訊息,以便重閣牽連共遮的訊息發予對談。
- 非常久長的 non-persistent 抑是稱 clean session。適合干焦發布訊息,無訂閱訊息的對談。broker 無儲存這款對談的任何無分發的訂閱主題的訊息。
建立佮 broker 的 connection 時,參數 clean session 設定做真正建立非常久對談,抑若無建立久長對談。
Topic
Topic 是個 utf 鋪八編碼的字攕,「 topic level」由 ` / ` ( U + 二 F ) 分割開。topic name 中相鄰的二个分隔符表示一个零長的 topic level。
topic name 和 topic filter 是:
- 大細寫敏感。
- 會當包含著空格符(毋過無建議按呢做)
- 前導抑是尾仔的『/』將產生無仝的 Topic Name 抑是 Topic Filter。比如講「/ finance」無仝「finance」
- Topic Name 抑是 Topic Filter 干焦包括『/』是有效的
- Topic Name 抑是 Topic Filter 禁止包括 null 字元 ( U + 零 )
- Topic Name 抑是 Topic Filter 是 utf 鋪八編碼的字攕,袂使超過六十五 , 五百三十五个位元組。
- Topic Name 抑是 Topic Filter 的 level 數量是無限制。
訂閱者的 topic filter 會當包含萬用字箍,使其同時會使訂閱幾个 topic:
- + ( U + 二 B ):單級萬用字箍,如:` check / + / baseline `。著愛占規个 topic level。毋過第一層抑是上尾仔一層。「sport / +」不匹配「sport」但是匹配「sport /」。「/ finance」匹配「+ / +」和「/ +」,毋過彼个阿配仔「+」。「sport +」是無效的。
- # ( U + 二十三 ):多級的萬用字,著愛囥佇咧 topic 的最後。抑是單獨存在 ( 即匹配所有 topic ),抑是講其前一字元著愛是'/'。會當共配一層 topic level 佮其實所有的囝孫 topic
- $:以 $ 開始的 topic name 用佇咧 broker 內部的統計資訊。使用者的 topic name 不應該以 $ 開始。broker 袂共以 $ 開始的 topic name 佮 # 抑是 + 開始的 topic filter 相匹配。
topic name 中袂當包含講上萬用字箍。
發布
將請求傳遞予 MQTT 客戶捀了後隨共應用程式執行緒。
服務品質(QoS)
服務品質指的是交通優先級佮資源預留控制機制,毋是接收的服務品質。服務品質是為著無仝的應用程式,使用者抑是資料流提供無仝優先級的能力,抑是講嘛會當講是做資料流保證一定的效能愛予水平。
以下是每一服務品質級別的具體來講:
- QoS 零:上濟一改傳送,即「fire and forget」(干焦負責傳送,傳送過了就不管資料的傳送情況)。
- QoS 一:至少一改傳送(握手兩擺); PUBLISH packet 佮 PUBACK packet(確認資料交付)。
- QoS 二:拄好一擺傳送(握手四改); PUBLISH、PUBREC 封包用著確認去收著。若是傳送方無收著 PUBREC 封包,就用 DUP 標誌重發訊息;若收著 PUBREC 封包,就刪除上頭仔的 PUBLISH 封包,儲存閣回覆 PUBREL 封包。接收方收著 PUBREL 封包,就共回覆 PUBCOMP 封包並刪除所有相關狀態(保證資料交付成功)。
保留的訊息(Retained Message)
broker 會佇這个主題(topic)下保留上新的一條帶有 Retained 標誌的訊息。新訂閱者抑是重連的訂閱者總是會收著 broker 儉的上新的 Retained Message。
這可以發布者予訂閱者總是會當得著上新的狀態資訊。
若發布一條 zero-byte payload 的 Retained Message,著 broker 就會刪除儲存的 Retained Message。
Last Will and Testament ( LWT )
當一个對談(session)不文雅的(ungraceful)、 意料的(unexpected)的時陣連鞭,Last Will and Testament ( LWT ) 可用著通知其他連接佇這个 broker 上客戶捀。
客戶會當佇一个 topic 閉思 broker 發出 CONNECT message 時會當發出一條 LWT 訊息。broker 儉這條 LWT 訊息,一直到客戶發出一條 DISCONNECT 訊息文雅地斷連為止。broker 檢測著下設狀況之一,就會予所有訂閱矣 LWT 主題的客戶發佈 LWT:
- 檢測著網路失敗抑是 IO 錯誤
- 因為協定毋著,broker 需要關起來網路連接
- 客戶關起來網路連接而且無發 DISCONNECT 訊息
- 佇咧 Keep Alive 一禮拜後客戶無與 broker 通批
MQTT 實現
已經有幾若个工程專案實現 MQTT 協定。比如講 :
- Facebook Messenger。人面冊已經佇 Facebook Messenger 上路用矣 MQTT 的濟特性用佇網路開講。猶毋過,目前猶無清楚 Facebook 佇佗一寡所在使用偌濟 MQTT。
- _ 擴充型整合電子控制中心 _ , Resonate 集團的上新的版整合電子控制中心的訊號控制系統共 MQTT 用佇系統的各個部份佮訊號系統的其他組件之間的通信交流。伊為符合歐洲電工標準委員會重要安全通信標準的系統提供了底層的通信框架仔。
- EVERYTHING 公司的 IoT 平台用 MQTT 當做機械對機械的協定來為數百萬个產品提供服務。
- 佇二零一五年,亞馬遴網路服務平台宣布 _ Amazon Iot _ 是因為 MQTT 的。
- 開放地理空間協會的感測器 API 標準規範有一个標準 MQTT 擴充作為額外的訊息協定縖結當前 API。伊佇美國國土安全部 IoT 略仔專案有得著證明。
- OpenStack 頂游基礎設施服務通過 MQTT 統一訊息匯流排和作為 MQTT 中介軟體的 _ Mosquitto _。
- Adafruit 公司佇二空一五年為物聯網實驗佮學習者啟動了一个名為 _ Adafruit IO _ 的免費的 MQTT 雲端運算服務。
- Microsoft Azure Iot Hub 使用 MQTT 成做遙測訊息的主要協定,尤其是使用 NVIDIA GeForce GTX 六百九十進行封包加速時,效率會當提升足百分之一到百分之百二十。
- XIM 公司佇二空一七年開發一个名做 _ MQTT Buddy _ MQTT 客戶捀。iOS 和 Android 上攏有應用。但是伊並無講放著 F-Droid 倉庫(也就意味出來伊是閉源軟體), 應該用提供了英語,俄語,漢語三種語言介面。
- Node-RED 支援空學一四版本以上的 MQTT 節點,以便正確組態 TLS 連接。
- 開源智慧型家庭平台 _ Home Assistant _ 支援 MQTT,並為 MQTT 中介軟體提供四个選項。
- 樹莓派上基於 Node . js 的 _ Pimatic _ 家庭自動化框殼提供矣 MQTT 外掛程式來完全支援 MQTT 協定。
- McAfee OpenDXL 是對著的訊息中介軟體本身增強的 MQTT,通好𪜶會當清楚來理解講 DXL 訊息的格式,支援如服務,請求 / 回應(嘿等)訊息傳遞,服務故障轉移佮服務區等進階功能。
MQTT 實現對比
閣較完整的 MQTT 庫會使佇 GitHub 揣著。
參見
- Apache ActiveMQ
- RabbitMQ
- XMPP
- AMQP
- Streaming Text Oriented Messaging Protocol ( STOMP )
參照
外部連結
- 官方網站
- Official website of Technical Committee
- MQTT Specifications
- Version 五曉空 , 二千空一十九孵三孵七 : PDF edition , HTML edition
- Version 三孵一 . 一 Plus Errata 一 , 二千空一十五孵十二孵十 : PDF edition , HTML edition
- Version 三孵一 . 一 , 二千空一十四抹十二十九 : PDF edition , HTML edition
- Version 三孵一 , 二千空一十 : PDF edition , HTML edition
- MQTT-SN Specifications
- Version 一孵二 , 二千空一十三孵十一孵十四 : PDF edition