姬廣龍,孫 丹,王珍珍,溫樹峰,孔紅磊,張 丹
(1.國網(wǎng)電力科學研究院有限公司,江蘇 南京 211106;2.智能電網(wǎng)保護和運行控制國家重點實驗室,江蘇 南京 211106)
隨著網(wǎng)絡通信和信息技術的快速發(fā)展,人們的生活已進入萬物互聯(lián)的物聯(lián)網(wǎng)(Internet of Things, IoT)時代[1],傳統(tǒng)工業(yè)開始升級轉型,智能化應用也逐漸拓展至智能交通系統(tǒng)、智能電網(wǎng)等物聯(lián)網(wǎng)領域。物聯(lián)網(wǎng)技術實際是通過射頻模糊識別、傳感器感知等技術,將采集到的數(shù)據(jù)依據(jù)雙方互認的通信協(xié)議,通過互聯(lián)網(wǎng)信道進行遠程傳輸和應用,其核心基礎在于選取一個合適的數(shù)據(jù)通信協(xié)議。HTTP協(xié)議憑借其開放程度高、開發(fā)成本低的優(yōu)勢成為物聯(lián)網(wǎng)最早使用的通信協(xié)議,但由于HTTP協(xié)議是基于CS模式的,消息只能由客戶端向服務端發(fā)起請求,而服務端不會主動向客戶端發(fā)起推送,并不適合當前物聯(lián)網(wǎng)設備與服務器的數(shù)據(jù)傳輸[2]。CoAP(Constrained Application Protocol)資源受限型協(xié)議由IETF國際標準組織的CoRE工作組提出,同樣具有HPPT的高開放、低開發(fā)成本優(yōu)勢,通過壓縮數(shù)據(jù)包頭的形式減少網(wǎng)絡運行占比,提高了物聯(lián)網(wǎng)智能傳感設備的響應速度,但CoAP僅適用于局域網(wǎng)中,對于各式各樣的物聯(lián)網(wǎng)設備有一定的局限性[3]。DDS(Data Distribution Service)數(shù)據(jù)分發(fā)服務由OMG組織制定,通過控制服務質量(Quality of Service,QoS)的行為,為實時系統(tǒng)提供高質量、高可靠、高性能的服務,但一般用于國防、工業(yè)級自動化等國家核心領域[4]。MQTT與以上協(xié)議不同,MQTT通過發(fā)布/訂閱主題模式來進行數(shù)據(jù)的傳輸,所有連接MQTT代理服務器的客戶端僅需一次訂閱即可獲取與其訂閱相關的話題;另外MQTT協(xié)議可以在低開銷、低帶寬占用的情況下提供雙向實時有效的消息服務,特別適合小型互聯(lián)、移動應用等物聯(lián)網(wǎng)設備[5]。因此,本文主要對MQTT通信協(xié)議展開研究。
MQTT是在1999年由IBM公司的Andy Stanford-Clark博士和Arcom公司的Arlen Nipper博士提出,并被OASIS國際標準組織于2014年提為物聯(lián)網(wǎng)標準協(xié)議[6]。它的設計思想是消息輕巧、源開放、語言簡單、約束規(guī)范,且行為易于實現(xiàn)。MQTT的設計以精簡、不添加可有可無的功能為原則,允許用戶動態(tài)創(chuàng)建主題,低運維成本,還考慮了低寬帶、高延遲和不穩(wěn)定網(wǎng)絡因素的影響,另外不強求傳輸數(shù)據(jù)的類型與格式,保持靈活性。這些特點都非常適合當下的物聯(lián)網(wǎng)環(huán)境,特別是對于環(huán)境受限的物聯(lián)網(wǎng)智能設備間的通信。
MQTT協(xié)議的控制報文主要由固定包頭、可變包頭和有效載荷三部分組成。不同的業(yè)務需求下,預定義的控制報文也不盡相同,主要區(qū)別在于是否包含可變包頭或有效載荷。MQTT的消息報文整體結構如圖1所示。
圖1 MQTT消息報文結構
1.2.1 固定報頭
固定報頭可以理解成一個代號信息,它由兩部分組成:第一部分包含了報文的控制類型和報文的標志;第二部分表示了除固定報頭長度外整幀報文的剩余長度,如圖2所示。
圖2 MQTT固定報頭結構
固定報頭的第一部分高4位為MQTT控制報文的類型,具有實際意義的控制報文類型主要分為四大類:連接類、?;铑悺⒃掝}訂閱類、消息發(fā)布類。除此之外,還有0000和1111為保留控制報文[7-8]。控制報文的各項具體含義、報文流向見表1所列。
表1 控制報文的流向及分類
DUP標志位用來保證消息可靠傳輸,但不能用于檢測消息重復發(fā)送,默認為0,表示第一次發(fā)送。當QoS大于0的情況下,在可變頭部需要包含MessageID,當該標志位置為1時,表示當前消息已經(jīng)被傳送過。
QoS消息質量分三個等級:QoS0表示最多分發(fā)一次,消息的傳遞完全依賴底層的TCP/IP網(wǎng)絡,消息沒有定義應答和重發(fā)機制,即消息在周期內最多到達服務端一次,或者根本沒到達。QoS1表示至少分發(fā)一次,服務端是否接收到消息由PUBACK消息確認,因設備故障或通信鏈路異常等原因導致客戶端在規(guī)定時間內沒有收到確認消息時,客戶端則會重發(fā)這條在消息頭中設置了DUP為1的消息。QoS2發(fā)布的消息有且只有一次被客戶端接收到,服務等級最高,不允許消息丟失或重復,當然開銷也最大[9-10]。三種QoS模式下信息交互流程如圖3所示。
圖3 三種QoS模式下的通信流程
Retain表示服務器會保存該標志位為TRUE的消息,需要特別注意的是該標志位與QoS位無關,也就是說不管哪種級別的QoS,只要該標志位置為1,服務器就會保留此消息。
Byte2用來保存可變頭部和消息體的總大小,是可以擴展的,最大256 Mb/s,其存儲機制為低7位保存長度,高位為是否有后續(xù)標識位。如計算大小length≤127,正常保存即可,如計算大小介于127和16 383之間,則需保存兩個字節(jié)了,即第一個字節(jié)高位置1,表示未完待續(xù),第2個字節(jié)繼續(xù)存儲。以128為例,第一個字節(jié)存10000001,第2個字節(jié)存00000001,也就是0x81和0x01。以此類推,最多可擴展至4個字節(jié),即MQTT協(xié)議最多可實現(xiàn)(0xFF,0xFF,0xFF,0x7F)近256 MB的數(shù)據(jù)傳輸。
1.2.2 可變頭部
可變頭部由協(xié)議名(Protocol Name)、協(xié)議級別(Protocol Level)、連接標志(Connect Flags)和保持連接(Keep Alive)四個字段組成。
Protocol Name表示協(xié)議名稱為“MQTT”的UTF-8編碼的字符串,該協(xié)議規(guī)范的后續(xù)版本仍會延續(xù)當前這個字符串的偏移和長度。在協(xié)商過程中,如協(xié)議名不對稱,服務端要求做出斷開客戶端連接的判斷。
Protocol Level也可簡單看作是協(xié)議的版本,規(guī)范規(guī)定客戶端用8位無符號值表示協(xié)議的修訂版本,對于當前流行的V3.1.1版本,協(xié)議級別無符號值規(guī)定為Level4(0x04)。對于不支持的協(xié)議級別,服務端必須發(fā)送返回碼為0x01的CONNACK響應報文,并主動斷開客戶端的連接。
Connect Flags是指一些用于指定MQTT連接行為的參數(shù),它還可以指定有效負載(playload)字段的存在與否,比如will flag置1,則有效負載中需要包含will topic、will message等字段信息。另外服務端必須驗證CONNECT控制報文的保留標志位(reserved),該位必須置0,否則服務端必須斷開客戶端連接。連接標志的報文結構如圖4所示。
圖4 連接標志的報文結構
Clean Session(清除會話)位于連接標識符Bit1位,當該標志位置0時,服務端必須根據(jù)當前的會話狀態(tài)恢復與客戶端的通信,以客戶端的唯一標識作為會話的標識。另外,會話斷開后,服務端還必須將所有與客戶端訂閱相關的QoS1和QoS2消息作為會話狀態(tài)的一部分存儲起來。若該標志位置1,當客戶端和服務端斷開之前啟動一個新的會話時,當前的會話狀態(tài)數(shù)據(jù)一定不能被隨后的會話復用。Will Flag(發(fā)布遺囑)位于連接標識符Bit2位,客戶端連接異常斷開時觸發(fā)服務端向訂閱客戶端發(fā)送消息通知。服務端在連接建立后存儲Will Message,在連接異常斷開時發(fā)布遺囑消息。遺囑消息的發(fā)布按照Will QoS和Will Retain標志位的狀態(tài)發(fā)布,主要用在網(wǎng)絡異常導致客戶端非主觀下線時,使用臨終遺囑通知訂閱了該遺囑topic的客戶端,從而可以積極應對處理。關于Will QoS遺囑消息的安全級別、Will Retain遺囑消息是否作為保留消息發(fā)布、Password Flag是否需要密碼以及User Name Flag是否需要用戶名,此處不再贅述。
Keep Alive是一個以秒為單位的最大時間間隔,使用PINGRESP響應報文判斷連接的活動狀態(tài)。若Keep Alive值非0,并且服務端在1.5倍保持連接值時間內沒有收到客戶端的控制報文,則認為通信已斷開,服務端必須斷開客戶端的網(wǎng)絡連接;若客戶端發(fā)送PINGREQ報文,但在規(guī)定時間沒有收到PINGRESP的響應,客戶端應關閉服務端的網(wǎng)絡連接。若Keep Alive值為0,則表示關閉保持連接功能,也就意味著客戶端不斷開連接;但不管Keep Alive為何值,只要服務端認為客戶端不活躍或無響應,可以斷開與客戶端的連接。
1.2.3 有效載荷
有效載荷可以理解為消息主體,當MQTT發(fā)送的消息類型是 CONNECT(連接)、PUBLISH(發(fā)布)、SUBSCRIBE(訂閱)、SUBACK(訂閱確認)時,則會帶有負荷[8]。
(1)CONNECT的消息體內容主要是:客戶端的標識、訂閱的主題、消息以及用戶名和密碼等。
(2)PUBLISH的消息體內容是要發(fā)布推送的消息。
(3)SUBSCRIBE的消息體內容主要包含要訂閱的主題以及不同的服務質量。
(4)SUBACK的消息體內容是服務器對訂閱的主題以及不同的服務質量進行確認和響應。
MQTT通過話題機制在物聯(lián)網(wǎng)設備間進行數(shù)據(jù)交換,每個客戶端都扮演著兩種角色,可以是發(fā)布消息的發(fā)布者角色,也可以是訂閱主題的訂閱者身份;而在傳遞消息通信過程中起著關鍵作用的是MQTT代理服務器,所有的客戶端都會把發(fā)布的主題消息傳送給中間件代理服務器,由代理服務器轉發(fā)給訂閱了該主題消息的所有訂閱者。MQTT的信息交互模式如圖5所示。
圖5 MQTT通信交互模式
為驗證MQTT協(xié)議格式的正確性,在PC機上搭載MQTT服務器,選用由北京智芯微電子科技有限公司研發(fā)設計的終端MQTT測試軟件(V1.3)模擬配電物聯(lián)網(wǎng)主站,并采用網(wǎng)絡協(xié)議分析器Wireshark(V3.4.6)對報文數(shù)據(jù)流進行抓包。測試軟件可以查看當前連接狀態(tài)、發(fā)布訂閱的主題等信息,業(yè)務信息里還可以對一些參數(shù)進行查詢、預置和激活操作,也可以召測上線設備的遙信、遙測等數(shù)據(jù),也可實現(xiàn)對設備的時鐘同步和復位等控制。操作界面如圖6所示。
圖6 MQTT測試軟件操作界面
配電物聯(lián)網(wǎng)主站和邊設備之間采用的面向對象具有互操作性的MQTT數(shù)據(jù)傳輸協(xié)議,邊設備采用搭載MQTT通信協(xié)議的臺區(qū)智能融合終端,考慮配電物聯(lián)網(wǎng)主站與邊設備信息交互類型多,本文只針對CONNECT報文進行分析,如圖7所示。
圖7 CONNECT報文結構分析
第一部分為固定報頭,根據(jù)取值0001可知控制報文為連接類型,DUP位為0,為第一次發(fā)送請求,QoS等級為最低等級,只發(fā)送一次,報文剩余長度為71字節(jié)。
第二部分為可變長度,協(xié)議名稱為MQTT,協(xié)議級別為04,代表協(xié)議版本號為V3.1.1,用戶名和密碼都置1,表示設備進行連接時需驗證用戶名和密碼,Will Retain位置0表示遺囑消息不作為保留消息發(fā)布,Will Flag置0代表了有效載荷中無需包含Will Topic和Will Message等字段信息。清除會話位置1表示當前的會話狀態(tài)不能被隨后的會話復用,保留位置0為系統(tǒng)默認值,否則服務端須斷開與客戶端的連接。保持連接值為60,協(xié)議定義時間間隔的單位為s,即沒有報文交互時,客戶端每60 s需向服務端發(fā)送?;钕?,以確保會話的正常通信。
第三部分為有效載荷,包含了客戶端的ClientID、用戶名和密碼等消息,不同控制報文類型下消息體內容和格式也是有一定差異的。
本文介紹了MQTT的開源、可靠、輕巧的設計思想,闡述了MQTT為低帶寬和不穩(wěn)定網(wǎng)絡環(huán)境中的物聯(lián)網(wǎng)設備提供可靠網(wǎng)絡服務的優(yōu)勢。MQTT具有非常小的通信開銷,支持多種流行編程語言的優(yōu)點。雖然MQTT具有多項技術優(yōu)勢,但想大規(guī)模商用,還需要進一步完善和改進,比如要實現(xiàn)不同系統(tǒng)間互聯(lián)互通必然需要不同的SDK包,不同的異構終端就需要與之對應的服務器;另外MQTT不具備處理音視頻格式信號的能力,對音視頻信息的傳輸不適用,這些問題將是今后需要重點解決的。