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