MQTT

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
MQTT協定的標誌

訊息佇列遙測傳輸(英語:Message Queuing Telemetry TransportMQTT[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]

連接[編輯]

等待與伺服器建立連接然後建立節點之間的連接。

保活(keep alive)[編輯]

最大保活間隔:18小時12分鐘15秒。客戶在保活間隔乘以1.5倍的時間內可以不與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為1或2的主題的訊息,以便重新連接後把這些訊息發給對談。
  • 非持久的non-persistent或稱clean session。適合於只發佈訊息,不訂閱訊息的對談。broker不儲存這種對談的任何未分發的訂閱主題的訊息。

建立與broker的connection時,參數clean session設置為真則建立非持久對談,否則建立持久對談。

Topic[編輯]

Topic是個utf-8編碼的字串,「topic level」由/(U+002F)分割開。topic name中相鄰的2個分隔符表示一個0長的topic level。

topic name和topic filter是:

  • 大小寫敏感的。
  • 可以包含空格符(但不建議這麼做)
  • 前導或尾部的『/』將產生不同的Topic Name或Topic Filter。例如「/finance」不同於「finance」
  • Topic Name或Topic Filter只包含『/』是有效的
  • Topic Name或Topic Filter禁止包含null字元(U+0000)
  • Topic Name或Topic Filter是utf-8編碼的字串,不能超過65,535個位元組。
  • Topic Name或Topic Filter的level數量沒有限制。

訂閱者的topic filter可包含萬用字元,使其同時能訂閱多個topic:

  • +(U+002B):單級萬用字元,如:check/+/baseline。必須佔據整個topic level。可是第一層或者最後一層。「sport/+」不匹配「sport」但是匹配「sport/」。「/finance」匹配「+/+」和「/+」,但不匹配「+」。「sport+」是無效的。
  • #(U+0023):多級萬用字元,必須放在topic的最後。或者單獨存在(即匹配所有topic),或者其前一個字元必須是'/'。可匹配上一層topic level及其所有子孫topic
  • $:以$開始的topic name用於broker內部的統計資訊。用戶的topic name不應該以$開始。broker不會把以$開始的topic name與#或+開始的topic filter相匹配。

topic name中不能包含上述萬用字元。 

發佈[編輯]

將請求傳遞給MQTT客戶端後立即返回到應用程式線程。

服務質素(QoS)[編輯]

服務質素指的是交通優先級和資源預留控制機制,而不是接收的服務質素。 服務質素是為不同應用程式,用戶或數據流提供的不同優先級的能力,或者也可以說是為數據流保證一定的效能水平的能力。

以下是每一個服務質素級別的具體描述:

  • QoS 0:最多一次傳送,即「fire and forget」(只負責傳送,傳送過後就不管數據的傳送情況)。
  • QoS 1:至少一次傳送(握手2次);PUBLISH packet與PUBACK packet(確認數據交付)。
  • QoS 2:正好一次傳送(握手4次);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已經在 Facebook Messenger 上用了 MQTT 的多個特性用於網絡聊天[17]但是,目前仍不清楚 Facebook 在哪些地方使用了多少 MQTT。
  • 擴充型整合電子控制中心, Resonate集團的最新版整合電子控制中心的訊號控制系統把 MQTT 用於系統的各個部分與訊號系統的其他組件之間的通訊交流。 它為符合歐洲電工標準委員會重要安全通訊標準的系統提供了底層通訊框架。[18]
  • EVERYTHING 公司的IoT平台使用 MQTT 作為機器對機器的協定來為數百萬個產品提供服務。
  • 在 2015 年,亞馬遜網絡服務平台宣佈 Amazon Iot 是基於 MQTT 的。[19][20]
  • 開放地理空間協會的感測器 API 標準規範有一個標準 MQTT 擴充作為額外的訊息協定繫結當前 API。 它在美國國土安全部 IoT 試點專案中得到了證明。[21]
  • OpenStack 上游基礎設施服務通過 MQTT 統一訊息匯流排和作為 MQTT 中介軟體的 Mosquitto[22]
  • Adafruit 公司在 2015 年為物聯網實驗和學習者啟動了一個名為 Adafruit IO 的免費的 MQTT 雲端運算服務。[23][24]
  • Microsoft Azure Iot Hub 使用 MQTT 作為遙測訊息的主要協定,尤其是使用NVIDIA GeForce GTX 690進行封包加速時,效率可提升100%到120%。[25]
  • XIM 公司在 2017 年開發了一個名為MQTT Buddy MQTT 客戶端。[26][27]iOSAndroid 上都有該應用。 但是它並沒有被放到 F-Droid 倉庫(也就意味着它是閉源軟件),該應用提供了英語,俄語,漢語三種語言介面。
  • Node-RED 支援 0.14 版本以上的 MQTT 節點,以便正確組態 TLS 連接。[28]
  • 開源智能家庭平台 Home Assistant 支援 MQTT,並為 MQTT 中介軟體提供了四個選項。[29][30]
  • 樹莓派上基於Node.jsPimatic 家庭自動化框架提供了 MQTT 外掛程式來完全支援 MQTT 協定。[31]
  • McAfee OpenDXL 是基於對訊息中介軟體本身增強的 MQTT,以便他們能夠清楚地理解 DXL 訊息格式,以支援如服務,請求/響應(對等)訊息傳遞,服務故障轉移和服務區等進階功能。[32][33]

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 上找到。

參見[編輯]

參照[編輯]

  1. ^ MQTT 3.1.1 specification. OASIS. December 10, 2015 [April 25, 2017]. (原始內容存檔於2021-01-08). 
  2. ^ ISO/IEC 20922:2016 Information technology -- Message Queuing Telemetry Transport (MQTT) v3.1.1. iso.org. 國際標準化組織. June 15, 2016. (原始內容存檔於2020-10-25). 
  3. ^ 3.0 3.1 IoT / 智慧製造全面升級應用 (下). www.lcnet.com.tw. Smart eVision. 2019-09-23 [2019-12-23]. (原始內容存檔於2020-08-10) (中文). 
  4. ^ 10th birthday party. MQTT.org. July 2009 [April 25, 2015]. (原始內容存檔於2018-12-14). 
  5. ^ OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee. OASIS. [May 9, 2014]. (原始內容存檔於2020-06-22). 
  6. ^ Stanford-Clark, Andy; Hong Linh Truong. MQTT For Sensor Networks (MQTT-SN) Protocol Specification Version 1.2 (PDF). mqtt.org. MQTT: 27. November 14, 2013 [May 9, 2014]. (原始內容 (PDF)存檔於2013-08-12). 
  7. ^ IBM WebSphere MQ. IBM. [November 18, 2013]. (原始內容存檔於2014-04-12). 
  8. ^ Piper, Andy. Choosing Your Messaging Protocol: AMQP, MQTT, or STOMP. blogs.vmware.com. VMware Blogs: 1. February 19, 2013 [October 23, 2013]. (原始內容存檔於2013-10-17). 
  9. ^ Shelby, Zach; Hartke, Klaus; Bormann, Carsten. Constrained Application Protocol (CoAP) RFC 7252. tools.ietf.org. IETF: 1. June 26, 2014 [November 15, 2015]. (原始內容存檔於2015-11-15). 
  10. ^ XMPP community. InternetOfThings. wiki.xmpp.org. XMPP wiki: 1. November 1, 2013 [May 9, 2014]. (原始內容存檔於2020-10-27). 
  11. ^ Baker, Fred; Meyer, David. Internet Protocols for the Smart Grid RFC 6272. datatracker.ietf.org. IETF: 1. June 21, 2011 [May 9, 2014]. (原始內容存檔於2020-10-26). 
  12. ^ DDS Portal – Data Distribution Services. portals.omg.org. [2018-01-14]. (原始內容存檔於2016-01-26) (美國英語). 
  13. ^ Microsoft introduces new open-source cross-platform OPC UA support for the industrial Internet of Things - Internet of Things. Internet of Things. 2016-06-23 [2017-10-13]. (原始內容存檔於2019-04-20) (美國英語). 
  14. ^ Yuan, Michael. Getting to know MQTT. IBM Developer. [13 October 2019]. (原始內容存檔於2020-12-03). 
  15. ^ MQTT v3.1.1. [2020-06-30]. (原始內容存檔於2018-02-20). 
  16. ^ FAQ - Frequently Asked Questions | MQTT. [2020-03-19]. (原始內容存檔於2016-10-25) (美國英語). 
  17. ^ Zhang, Lucy. Building Facebook Messenger. facebook.com/Engineering. Facebook: 1. August 12, 2011 [October 15, 2015]. (原始內容存檔於2015-08-19). 通過維護 MQTT 連接並且通過聊天管道傳遞資訊,能夠在數百毫秒而非幾秒內實現電話到電話的數據傳送。 
  18. ^ Wood, Daren; Robson, Dave. Message broker technology for flexible signalling control (PDF). irse.org. IRSE: 7. August 13, 2012 [March 31, 2014]. (原始內容 (PDF)存檔於2014-03-31). 
  19. ^ Barr, Jeff. AWS IoT - Cloud Services for Connected Devices. aws.amazon.com. Amazon Web Services: 1. October 8, 2015 [October 21, 2015]. (原始內容存檔於2020-10-28). 
  20. ^ AWS IoT. aws.amazon.com/iot. Amazon Web Services: 1. [July 1, 2017]. (原始內容存檔於2021-01-19). 
  21. ^ Brothers, Reginald. S&T’s Internet of Things Pilot Demonstrates 'State of the Practical'. dhs.gov: 1. January 25, 2016 [March 31, 2016]. (原始內容存檔於2020-10-22). 
  22. ^ OpenStack Firehose - The unified message bus for Infra services. docs.openstack.org. OpenStack Infrastructure Team: 1. [August 30, 2016]. (原始內容存檔於2019-08-05). 
  23. ^ Coming Soon: Adafruit IO. blog.adafruit.com. Adafruit Industries: 1. September 16, 2014 [March 29, 2017]. (原始內容存檔於2020-11-27). 
  24. ^ The Internet of Things for Everyone. io.adafruit.com. Adafruit: 1. [July 1, 2017]. (原始內容存檔於2021-02-03). 
  25. ^ Dotchkoff, Konstantin; Betts, Dominic; Kshirsagar, Dhanashri; mastermanu; Damaggio, Elio. Understanding Microsoft Azure MQTT Support. docs.microsoft.com. Microsoft: 1. March 1, 2017 [March 29, 2017]. (原始內容存檔於2020-12-31). 
  26. ^ The story of MQTT Buddy begins!. mqtt.ximxim.com. XIM, Inc.: 1. February 24, 2017 [July 1, 2017]. (原始內容存檔於2017-07-23). 
  27. ^ MQTT Buddy. mqtt.ximxim.com. XIM, Inc. [July 1, 2017]. (原始內容存檔於2018-03-21). 
  28. ^ Community staff writer. Version 0.14 released. nodered.org/blog. Node-RED. June 14, 2016 [July 6, 2016]. (原始內容存檔於2018-10-21). MQTT with TLS support 
  29. ^ Home Assistant Community. MQTT. home-assistant.io. Home Assistant Community. August 7, 2015 [August 4, 2017]. (原始內容存檔於2019-06-09). 
  30. ^ Home Assistant Community. MQTT Brokers. home-assistant.io. Home Assistant Community. August 7, 2015 [August 4, 2017]. (原始內容存檔於2021-02-03). The MQTT component needs you to run an MQTT broker for Home Assistant to connect to. There are four options, each with various degrees of ease of setup and privacy. 
  31. ^ Kail, Marek. pimatic-mqtt. pimatic.org. Oliver Schneider. October 16, 2016 [August 11, 2017]. (原始內容存檔於2020-10-24). 
  32. ^ What protocol does OpenDXL use? - OpenDXL. OpenDXL. [2017-10-13]. (原始內容存檔於2020-09-22) (英語). 
  33. ^ McDonald, Ted. Architecture Guide McAfee Data Exchange Layer (DXL) (PDF). [永久失效連結]
  34. ^ Overview. learn.adafruit.com. [2018-04-20]. (原始內容存檔於2020-12-03). 
  35. ^ Adafruit IO REST API Documentation. io.adafruit.com. [2018-04-20]. (原始內容存檔於2021-02-01). 
  36. ^ EMQ. emqx.io. [2020-12-16]. (原始內容存檔於2021-02-06). 
  37. ^ EMQX Releases. github.com. [2018-10-27]. (原始內容存檔於2021-01-25). 
  38. ^ M2MQTT Releases. github.com. [2018-04-20]. (原始內容存檔於2020-10-22). 
  39. ^ Machine Head. clojuremqtt.info. [2021-02-07]. (原始內容存檔於2020-12-01). 
  40. ^ moquette Releases. github.com. [2020-11-16]. (原始內容存檔於2020-12-24). 
  41. ^ Mosquitto Releases. mosquitto.org. [2021-02-07]. (原始內容存檔於2017-09-16). 
  42. ^ Latest Releases. eclipse.org/projects. [2018-04-20]. (原始內容存檔於2020-10-25). 
  43. ^ Eclipse Distribution License - v 1.0. eclipse.org. [2018-04-20]. (原始內容存檔於2020-12-14). 
  44. ^ wolfMQTT Client Library. wolfssl.com. [2018-04-20]. (原始內容存檔於2020-12-04). 
  45. ^ About. bevywise.com. [2018-04-20]. (原始內容存檔於2020-11-24). 
  46. ^ License. bevywise.com. [2018-04-20]. (原始內容存檔於2020-11-24). 
  47. ^ MQTT-Client-Framework. github.com. [2020-03-14]. (原始內容存檔於2020-09-05). 
  48. ^ Cross-Platform MQTT Client. ioctrl.com. [2021-09-04]. (原始內容存檔於2021-09-04). 

外部連結[編輯]