MQTT是一種輕量級的開放式消息傳遞協議,它為資源受限的網絡客戶端提供了一種在低帶寬環境中分發遙測信息的簡單方法。該協議采用發布/訂閱通信模式,用于機器對機器 ( M2M ) 通信。
作為一種低開銷協議創建以適應帶寬和 CPU 限制,MQTT 被設計為在嵌入式環境中運行,它可以提供可靠、有效的通信路徑。MQTT 適用于連接代碼占用空間小的設備,對于由于偶爾的帶寬限制或不可靠的連接而經歷不同延遲水平的無線網絡來說,它是一個不錯的選擇。該協議適用于從汽車到能源再到電信等行業。
管 MQTT 最初是用于與石油和天然氣行業的監控和數據采集 ( SCADA ) 系統進行通信的專有協議,但它已在智能設備領域變得流行,如今已成為連接物聯網的領先開源協議 ( IoT ) 和工業 IoT ( IIoT ) 設備。
雖然 MQTT 中的TT代表 Telemetry Transport,但MQ指的是一種名為 IBM MQ 的產品。盡管MQTT的拼寫有時被稱為消息隊列遙測傳輸,但 MQTT 通信中沒有消息隊列。
為了最大化可用帶寬,MQTT 的發布/訂閱(pub/sub)通信模型是直接與端點通信的傳統客戶端-服務器架構的替代方案。相比之下,在pub/sub 模型中,發送消息的客戶端(發布者)與接收消息的客戶端(或訂閱者)分離。因為發布者和訂閱者之間都沒有直接聯系,所以第三方——經紀人——負責他們之間的聯系。
MQTT 客戶端包括發布者和訂閱者,這些術語指的是客戶端是發布消息還是訂閱接收消息。這兩個功能可以在同一個 MQTT 客戶端中實現。當設備(或客戶端)想要向服務器(或代理)發送數據時,它被稱為發布。當操作反向時,它被稱為訂閱。在發布/訂閱模式下,多個客戶端可以連接到代理并訂閱他們感興趣的主題。
如果從訂閱客戶端到代理的連接中斷,那么代理將緩沖消息并在訂閱者重新聯機時將它們推送給訂閱者。如果從發布客戶端到代理的連接在沒有通知的情況下斷開,那么代理可以關閉連接并向訂閱者發送包含發布者指令的緩存消息。
一個 MQTT 會話分為四個階段:連接、認證、通信和終止。客戶端首先使用代理的操作員定義的標準端口或自定義端口創建與代理的傳輸控制協議/互聯網協議 ( TCP/IP ) 連接。創建連接時,重要的是要認識到如果為服務器提供了重用的客戶端身份,它可能會繼續舊會話。
標準端口是 1883 用于非加密通信和 8883 用于加密通信 - 使用安全套接字層 ( SSL )/傳輸層安全性 ( TLS )。在 SSL/TLS 握手期間,客戶端驗證服務器證書并驗證服務器。客戶端還可以在握手期間向代理提供客戶端證書。代理可以使用它來驗證客戶端。雖然不是 MQTT 規范的具體部分,但代理已經習慣于使用 SSL/TLS 客戶端證書支持客戶端身份驗證。
因為 MQTT 協議旨在成為資源受限和 IoT 設備的協議,所以 SSL/TLS 可能并不總是一種選擇,并且在某些情況下可能不需要。在這種情況下,身份驗證顯示為明文用戶名和密碼,由客戶端發送到服務器——這是 CONNECT/CONNACK 數據包序列的一部分。此外,一些經紀商,尤其是在互聯網上發布的公開經紀商,將接受匿名客戶。在這種情況下,用戶名和密碼只需留空即可。
MQTT 被認為是一種輕量級協議,因為其所有消息的代碼占用量都很小。每條消息都由一個固定的標頭(2個字節)、一個可選的可變標頭、一個限制為 256 兆字節 (MB) 信息的消息有效負載和一個服務質量 ( QoS ) 級別組成。
在通信階段,客戶端可以執行發布、訂閱、取消訂閱和ping操作。發布操作將二進制數據塊(內容)發送到發布者定義的主題。
MQTT 支持最大 256 MB 的消息二進制大對象 (BLOB)。內容的格式將是特定于應用程序的。使用 SUBSCRIBE/SUBACK 數據包對進行主題訂閱,并且使用 UNSUBSCRIBE/UNSUBACK 數據包對類似地執行取消訂閱。