訊息佇列遙測傳輸（，MQTT）是 ISO 標準（ISOIEC PRF 20922）下基於釋出（Publish） 訂閱（Subscribe）正規化的訊息協議，可視為「資料傳遞的橋樑」。它工作在 TCPIP 協議族上，是為硬體效能低下的遠端裝置以及網路狀況糟糕的情況下而設計的釋出 訂閱型訊息協議。為此，它需要一個訊息中介軟體（如 HTTP），以解決當前繁重的資料傳輸協議。 歷史 IBM 公司的安迪斯坦福 克拉克及 Arcom 公司的阿蘭尼普於 1999 年撰寫了該協議的第一個版本。 該協議的可用性取決於該協議的使用環境。IBM 公司在 2013 年就向結構化資訊標準促進組織提交了 MQTT 31 版規範，並附有相關章程，以確保只能對規範進行少量更改。。MQTTSN 是針對非 TCPIP 網路上的嵌入式裝置主要協議的變種，與此類似的還有 ZigBee 協議。 縱觀行業的發展歷程，MQTT 中的 MQ 是來自於 IBM 的 MQ 系列訊息佇列產品線。然而通常佇列本身不需要作為標準功能來支援。 可選協議包含了高階訊息佇列協議，面向文字的訊息傳遞協議，網際網路工程任務組約束應用協議， 可擴充套件訊息與存在協議，資料分發服務，OPC UA 以及 web 應用程式訊息傳遞協議。 概覽 MQTT 協議定義了兩種網路實體：訊息代理（message broker）與客戶端（client）。其中，訊息代理用於接收來自客戶端的訊息並轉發至目標客戶端。MQTT 客戶端可以是任何執行有 MQTT 庫並透過網路連線至訊息代理的裝置，例如微型控制器或大型伺服器。 資訊的傳輸是透過主題（topic）管理的。釋出者有需要分發的資料時，其向連線的訊息代理 zhhans 傳送；zhtw 傳送 攜帶有資料的控制訊息。代理會向訂閱此主題的客戶端分發此資料。釋出者不需要知道訂閱者的資料和具體位置；同樣，訂閱者不需要配置釋出者的相關資訊。 如果訊息代理接受到某個主題上的訊息，且這個主題沒有任何訂閱，那麼代理就會丟棄之，除非釋出者將其標記為保留訊息（retained message）。 當釋出客戶端首次與代理連線時，客戶端可以設定一個預設訊息。當代理髮現釋出者意外斷開，其會向訂閱者傳送此預設的訊息。 客戶端僅與代理有直接的資料傳輸，但整個系統中可能有多個代理，其於當前訂閱者的主題交換資料。 MQTT 控制訊息最小隻有 2 位元組的資料。最多可以承載 256 Mb 的資料。有 14 種預定義的訊息型別用於：連線客戶端與代理、斷開連線、釋出資料、確認資料接收、監督客戶端與代理的連線。 MQTT 基於 TCP 協議，用於資料傳輸。變體 MQTTSN 用於在藍牙上傳輸，基於 UDP。 MQTT 協議使用普通文字傳送連線認證書，且並不包含任何安全或認證相關的措施。但可以使用傳輸層安全來加密並保護 zhhans 傳送；zhtw 傳送 的資料，以防止攔截、修改或偽造。 MQTT 預設埠為 1883，加密的埠為 8883。 連線 等待與伺服器建立連線然後建立節點之間的連線。 保活 keep alive 最大保活間隔：18 小時 12 分鐘 15 秒。客戶在保活間隔乘以 15 倍的時間內可以不與 broker 通訊。如果客戶沒有訊息發給 broker，則應該釋出 PINGREQ 包；broker 回覆 PINGRESP 包。 broker 具有 Client TakeOver 功能，以便在客戶重連 broker，但 broker 認為與客戶的 TCP 連線還存在時（稱為 HalfOpen），能刪除原有連線，接收重連請求。 斷開連線 等待 MQTT 客戶端完成所必須完成的工作，然後等待 TCPIP 會話關閉連線。 WebSockets WebSockets 是在一個 TCP 連線上全雙工通訊。可以使得普通的網頁瀏覽器成為基於 WebSocket 的 MQTT client。 持久會話（Persistent Session） 連線 broker 的會話分為兩種： 持久的會話：當會話與 broker 斷連時，broker 會儲存會話已經訂閱的 QoS 為 1 或 2 的主題的訊息，以便重新連線後把這些訊息發給會話。 非持久的 nonpersistent 或稱 clean session。適合於只發布訊息，不訂閱訊息的會話。broker 不儲存這種會話的任何未分發的訂閱主題的訊息。 建立與 broker 的 connection 時，引數 clean session 設定為真則建立非持久會話，否則建立持久會話。 Topic Topic 是個 utf8 編碼的字串，topic level 由 U002F 分割開。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 字元 U0000 Topic Name 或 Topic Filter 是 utf8 編碼的字串，不能超過 65535 個位元組。 Topic Name 或 Topic Filter 的 level 數量沒有限制。 訂閱者的 topic filter 可包含萬用字元，使其同時能訂閱多個 topic： U002B：單級萬用字元，如：checkbaseline。必須佔據整個 topic level。可是第一層或者最後一層。sport 不匹配 sport 但是匹配 sport。finance 匹配 和 ，但不匹配 。sport 是無效的。 U0023：多級萬用字元，必須放在 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 、PUBRECzhhans 包；zhhant 封包 用於確認收到。如果傳送方沒有收到 PUBRECzhhans 包；zhhant 封包，就用 DUP 標誌重發訊息；如果收到 PUBRECzhhans 包；zhhant 封包，就刪除最初的 PUBLISHzhhans 包；zhhant 封包，儲存並回復 PUBRELzhhans 包；zhhant 封包。接收方收到 PUBRELzhhans 包；zhhant 封包，就回復 PUBCOMPzhhans 包；zhhant 封包 並刪除所有相關狀態（保證資料交付成功）。 保留的訊息（Retained Message） broker 會在該主題（topic）下保留最新一條帶有 Retained 標誌的訊息。新訂閱者或者重連的訂閱者總是會收到 broker 儲存的最新的 Retained Message。 這可用於釋出者讓訂閱者總是能獲取到最新的狀態資訊。 如果釋出一條 zerobyte 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 作為機器對機器的協議來為數百萬個產品提供服務。 在 2015 年，亞馬遜網路服務平臺宣佈 Amazon Iot 是基於 MQTT 的。 開放地理空間協會的感測器 API 標準規範有一個標準 MQTT 擴充套件作為額外的訊息協議綁定當前 API。 它在美國國土安全部 IoT 試點專案中得到了證明。 OpenStack 上游基礎設施服務透過 MQTT 統一訊息匯流排和作為 MQTT 中介軟體的 Mosquitto。 Adafruit 公司在 2015 年為物聯網實驗和學習者啟動了一個名為 Adafruit IO 的免費的 MQTT 雲計算服務。 Microsoft Azure Iot Hub 使用 MQTT 作為遙測訊息的主要協議，尤其是使用 NVIDIA GeForce GTX 690 進行封包加速時，效率可提升 100 到 120。 XIM 公司在 2017 年開發了一個名為 MQTT Buddy MQTT 客戶端。iOS 和 Android 上都有該應用。 但是它並沒有被放到 FDroid 倉庫（也就意味著它是閉源軟體），該應用提供了英語，俄語，漢語三種語言介面。 NodeRED 支援 014 版本以上的 MQTT 節點，以便正確配置 TLS 連線。 開源智慧家庭平臺 Home Assistant 支援 MQTT，併為 MQTT 中介軟體提供了四個選項。 樹莓派上基於 Nodejs 的 Pimatic 家庭自動化框架提供了 MQTT 外掛來完全支援 MQTT 協議。 McAfee OpenDXL 是基於對訊息中介軟體本身增強的 MQTT，以便他們能夠清楚地理解 DXL 訊息格式，以支援如服務，請求 響應（點對點）訊息傳遞，服務故障轉移和服務區等高階功能。 MQTT 實現對比 名字 開發者 開發語言 型別 初次釋出日期 最新發布版本 最新發布日期 許可證 Adafruit IO Adafruit Ruby on Rails Nodejs 客戶端 200 EMQX EMQ Technologies Co Ltd Erlang 中介軟體 20160413 422 20201026 Apache 許可證 20 M2Mqtt Eclipse 基金會 C 客戶端 20170520 4300 20170520 Eclipse 公共許可證 10 Machine Head ClojureWerkz 團隊 Clojure Client 20131103 100 20170305 知識共享署名 30 Unported 許可證 moquette Selva Andrea Java 中介軟體 20150708 012 20190303 Apache 許可證 20 Mosquitto Eclipse 基金會 C 語言，Python 中介軟體和客戶端 20091203 1612a 20200819 Eclipse 公共許可證 10 Eclipse 發行許可證 10 BSD Paho MQTT Eclipse 基金會 C 語言，C Java Javascript Python Go 客戶端 20140502 141 20190225 Eclipse 公共許可證 10 Eclipse 發行許可證 10 BSD wolfMQTT wolfSSL C 語言 客戶端 20151106 170 20200821 GNU 通用公共許可協議，version 2 MQTTRoute Bevywise Networks C 語言，Python 中介軟體 20170425 10 20171219 專有許可證 MQTTClientFramework novastone ObjectiveC 客戶端 20150122 0153 20191023 Eclipse 公共許可證 10 MqttDesk ioCtrl technologies Reactjs Nodejs 客戶 20210412 210 20210081 Proprietary 更完整的 MQTT 庫可以在 GitHub 上找到。 參見 Apache ActiveMQ RabbitMQ XMPP 高階訊息佇列協議（AMQP） STOMP 引用 外部連結 官方網站 Official website of Technical Committee MQTT Specifications Version 50 20190307 PDF edition HTML edition Version 311 Plus Errata 01 20151210 PDF edition HTML edition Version 311 20141029 PDF edition HTML edition Version 31 2010 PDF edition HTML edition MQTTSN Specifications Version 12 20131114 PDF edition Category 應用層協議 Category 資料傳輸 MQ Category 面向訊息的中介軟體 Category 網路協議 Category 遙測