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