隨著行業的快速發展,數據管理和接收所需的設備數量也在增加。為了解決眾多設備之間的通信問題以及單個網絡中設備組合的問題,已經創建了物聯網(IoT)概念-基于某些功能的單個網絡中設備的組合或特性,此網絡進一步與類似網絡組合在一起,從而創建更大的網絡,依此類推。
在這樣的網絡中,設備通過各種接口和通信協議彼此交互。當我們正在考慮物聯網概念的工業實現時,應使用具有自己的協議和硬件的工業設備,讓我們開始探討IIoT概念(工業物聯網)。
為了進行通信,設備可以使用各種工業協議。為此,MQTT很受歡迎。
MQTT或消息隊列遙測傳輸是一種輕巧的開放式消息傳遞協議,用于在要求“代碼占用量小”或網絡帶寬受限的遠程位置進行數據傳輸。這些優勢允許在M2M系統(機器對機器)和IIoT系統(工業物聯網)中實現此協議。
還存在一種協議變體MQTT-SN(用于傳感器網絡的MQTT),以前稱為MQTT-S,其設計用于不支持TCP / IP網絡的嵌入式無線設備,例如ZigBee。
MQTT協議的主要功能:
● 異步協議
● 緊湊的消息
● 在數據傳輸線連接不穩定的情況下運行
● 支持多個服務質量(QoS)級別
● 輕松集成新設備
在應用程序層上,MQTT協議在TCP / IP協議之上工作,并且默認使用端口1883(如果通過SSL連接則使用端口8883)。
在MQTT協議中,消息交換在客戶端(可能是消息發布者或消息訂閱者)與消息代理(例如Mosquitto MQTT)之間進行。
發布者在MQTT Broker上發送數據,并在消息中指定了明確的主題。訂閱者可以根據對相應主題的訂閱,從多個發布者接收各種數據。
MQTT設備使用確定類型的消息來與代理進行通信。主要類型如下:
● 連接–建立與Message Broker的連接
● 斷開連接–斷開與消息代理的連接
● 發布–在Message Broker中發布有關主題的數據
● 訂閱–訂閱消息代理上的主題
● 退訂–退訂主題
MQTT消息包含以下幾部分:
● 固定的標頭(出現在所有消息中)
● 可變標頭(出現在某些消息中)
● 數據,有效負載(存在于某些消息中)
消息類型-例如:CONNECT,SUBSCRIBE,PUBLISH等。
每個MQTT數據包特有的標志–這4位用于輔助標志,輔助標志的存在和狀態取決于消息類型。
剩余長度–當前消息長度(可變報頭+數據),大小為1到4個字節。
總體而言,MQTT協議中有15種消息類型:
訊息類型 | 值 | 流向 | 描述 |
---|---|---|---|
已預留 | 0000(0) | 禁止的 | 已預留 |
連接 | 0001(1) | C *-> S ** | 客戶端請求連接到服務器 |
康納克 | 0010(2) | C <- | 連接確認 |
發布 | 0011(3) | C <-S,C-> S | 發布訊息 |
回送 | 0100(4) | C <-S,C-> S | 發布確認 |
PUBREC | 0101(5) | C <-S,C-> S | 發布收到 |
公開 | 0110(6) | C <-S,C-> S | 發布發行 |
PUBCOMP | 0111(7) | C <-S,C-> S | 發布完成 |
訂閱 | 1000(8) | C-> S | 客戶訂閱請求 |
后退 | 1001(9) | C <- | 訂閱確認 |
取消訂閱 | 1010(10) | C-> S | 退訂請求 |
取消訂閱 | 1011(11) | C <- | 退訂確認 |
PINGREQ | 1100(12) | C-> S | PING請求 |
平RESP | 1101(13) | C <- | PING回應 |
斷開 | 1110(14) | C-> S | 客戶端斷開連接 |
已預留 | 1111(15) | 禁止的 | 已預留 |
固定標頭的前4個最高有效位用作特定標志:
DUP –當客戶端或MQTT代理提交重發的數據包(在PUBLISH,SUBSCRIBE,UNSUBSCRIBE,PUBREL中使用)時,將設置Duplicate。如果設置了該標志,則變量頭必須包含消息ID(消息標識符)。
QoS –服務質量(0,1,2)
保留-發布帶有保留標志的數據時,代理將對其進行存儲。建立對該主題的新訂閱后,代理將立即發送帶有此標志的消息。僅在PUBISH類型的消息中使用。
某些標頭中存在可變標頭。
它包含以下數據:
● 數據包標識符–存在于所有類型的消息中,但以下情況除外:CONNECT,CONNACK,PUBLISH(сQoS <1),PINGREQ,PINGRESP,DISCONNECT
● 協議名稱–僅在CONNECT消息類型中顯示
● 協議版本–僅在CONNECT消息類型中存在
● 連接標志–指定連接期間客戶端行為的標志
用戶名–如果設置了該標志,則有效負載中必須存在一個用戶名(用于客戶端身份驗證)
密碼–如果設置了此標志,則有效負載中必須存在密碼(用于客戶端身份驗證)
將會保留-如果該標志設置為1,則代理將存儲一個意愿消息。
Will QoS – Will Message的服務質量。如果設置了意愿標記,則必須存在意愿QoS和意愿保留。
意志標志-如果設置了該標志,則在客戶端斷開代理而不發送DISCONNECT命令(如果發生不可預知的關閉,失敗等情況)之后,代理將通過所謂的意志消息通知所有已連接的客戶端。
干凈會話-如果將該標志設置為0,則代理存儲一個會話,所有客戶端訂閱都將通過客戶端的下一個連接發送,并且在客戶端斷開連接時,代理將接收來自QoS1和QoS2的所有消息。因此,如果該標志設置為1,則到下一個連接,客戶端必須再次訂閱所有主題。
● 會話存在–在CONNACK類型的消息中應用。如果Broker接受將Clean Session設置為1的連接,則必須將Session Present(SP)設置為0。如果Broker接受Clean Session設置為0的連接,則SP中設置的值取決于Broker是否已存儲此客戶端的會話狀態(如果是,則必須將SP設置為1,反之亦然)。會話存在標志使客戶端能夠確定是否已經存儲了會話狀態。
● 連接返回碼–如果代理出于某種原因無法從客戶端接收格式正確的CONNACK數據包,則必須在下表的CONNACK數據包的第二個字節中設置適當的值:
值 | 返回碼響應 | 描述 |
---|---|---|
0 | 0x00接受連接 | 接受連接 |
1個 | 0x01連接被拒絕,協議版本不可接受 | 代理不支持客戶端請求的協議版本 |
2 | 0x02連接被拒絕,標識符被拒絕 | 用于連接的客戶端的客戶端ID不在具有允許ID的列表中 |
3 | 0x03連接被拒絕,服務器不可用 | 已建立網絡連接,但MQTT服務不可用 |
4 | 0x04連接被拒絕,用戶名或密碼錯誤 | 用戶名或密碼中的數據格式錯誤 |
5 | 0x05連接被拒絕,未授權 | 客戶端無權連接 |
6-255 | 保留以備將來使用 |
數據,有效載荷
通過MQTT消息傳輸的數據的內容和格式在設備中定義。可以通過從剩余長度中減去變量頭的長度來計算數據大小。
返回目錄
發送消息時,MQTT支持三個級別的服務質量(QoS)。
QoS 0最多一次。在此級別上,發布者一次向代理發送一條消息,并且不等待任何響應,即發送并忘記它。
QoS 1至少一次。此級別可確保將消息傳遞到代理,但是可以從發布者復制消息。一旦收到副本,代理將再次將此消息發送給訂閱服務器,并將消息接收確認轉發給發布服務器。如果發布者未從代理獲取PUBACK消息,它將嘗試重新傳遞此數據包,將DUP設置為1。
QoS 2恰好一次。在此級別上,可以確保將消息傳遞到客戶端,并且不可能重復副本。
發布者向代理發送消息。該消息包含唯一的數據包ID,QoS = 2和DUP = 0。發布者存儲未經確認的消息,除非它從代理獲得PUBREC響應。代理回復包含相同分組ID的PUBREC消息。收到此消息后,發布者發送具有相同數據包ID的PUBREL。代理必須存儲消息副本,直到獲得PUBREL。代理收到PUBREL后,它將刪除消息副本,并將有關已完成的事務的PUBCOMP消息發送給發布者。