陳文藝, 張楊旭, 楊 輝
(1.西安郵電大學(xué) 物聯(lián)網(wǎng)與兩化融合研究院, 陜西 西安 710061;2.西安郵電大學(xué) 通信與信息工程學(xué)院, 陜西 西安 710121)
物聯(lián)網(wǎng)即物物相連的互聯(lián)網(wǎng)[1]。作為一種通過信息交互以實(shí)現(xiàn)智能化識別、定位、監(jiān)控和管理的網(wǎng)絡(luò),目前廣泛應(yīng)用于智能物流、智能交通等各個領(lǐng)域[2]。網(wǎng)關(guān)作為物聯(lián)網(wǎng)中連接感知網(wǎng)絡(luò)和傳統(tǒng)網(wǎng)絡(luò)的橋梁[3],可以實(shí)現(xiàn)不同協(xié)議設(shè)備之間信息的傳遞,網(wǎng)關(guān)可以屏蔽各種底層差異,實(shí)現(xiàn)通信技術(shù)標(biāo)準(zhǔn)的互聯(lián)互通與平臺之間的數(shù)據(jù)實(shí)時同步,提高物聯(lián)網(wǎng)系統(tǒng)的可靠性與穩(wěn)定性,可以將分散在不同區(qū)域感知網(wǎng)絡(luò)的信息孤島連接在一起,完成各種傳感設(shè)備穩(wěn)定的接入、控制、數(shù)據(jù)存儲等,實(shí)現(xiàn)不同子網(wǎng)的信息交互和通信[4]。
目前關(guān)于物聯(lián)網(wǎng)網(wǎng)關(guān)的研究主要包含兩方面內(nèi)容。一是如何屏蔽底層網(wǎng)絡(luò),實(shí)現(xiàn)各類傳感設(shè)備的快速接入。文獻(xiàn)[5]實(shí)現(xiàn)了協(xié)議轉(zhuǎn)換、數(shù)據(jù)轉(zhuǎn)發(fā)、感知網(wǎng)絡(luò)以及網(wǎng)關(guān)的管理和控制,但缺少對感知網(wǎng)絡(luò)接入設(shè)備類型的豐富以及故障的處理[6];文獻(xiàn)[7]針對MODBUS協(xié)議中遠(yuǎn)程終端單元(remote terminal unit,RTU)模式進(jìn)行網(wǎng)關(guān)設(shè)計,只是通過仿真來進(jìn)行驗(yàn)證,并沒有對網(wǎng)關(guān)實(shí)際的功能和性能進(jìn)行測試[8]。二是如何實(shí)現(xiàn)與云平臺之間數(shù)據(jù)快速、安全、穩(wěn)定的傳輸。傳統(tǒng)網(wǎng)關(guān)和物聯(lián)網(wǎng)資源平臺的通信協(xié)議有超文本傳輸協(xié)議(hypertext transport protocol,HTTP)[9]和消息隊列遙測傳輸協(xié)議(message queuing telemetry transport,MQTT)[10]。HTTP采用“請求-響應(yīng)”方式進(jìn)行通信,只有客戶端發(fā)起請求,服務(wù)端才會做出響應(yīng),服務(wù)端不能主動向客戶端推送數(shù)據(jù)[11],其缺點(diǎn)是缺乏實(shí)時性、采用明文通信,數(shù)據(jù)傳輸并不可靠[12]。MQTT是輕量級基于代理的發(fā)布/訂閱的消息傳輸協(xié)議,其設(shè)計簡單,易于實(shí)現(xiàn)[13],缺點(diǎn)是只適用資源有限的嵌入式設(shè)備,并且只能進(jìn)行小數(shù)據(jù)鏈的傳輸、帶寬低、安全性差[14]。
考慮到傳感數(shù)據(jù)在物聯(lián)網(wǎng)系統(tǒng)傳輸中的安全、高效和穩(wěn)定,提出一種支持MODBUS的通用物聯(lián)網(wǎng)網(wǎng)關(guān)架構(gòu)模型,該模型中采用串口作為設(shè)備接入?yún)f(xié)議,使用標(biāo)準(zhǔn)傳輸控制協(xié)議(transmission control protocol,TCP)[15]作為網(wǎng)關(guān)與設(shè)備通信協(xié)議,應(yīng)用標(biāo)準(zhǔn)WebSocket協(xié)議[16]作為網(wǎng)關(guān)與平臺通信協(xié)議,實(shí)現(xiàn)設(shè)備根據(jù)統(tǒng)一標(biāo)準(zhǔn)接入網(wǎng)關(guān)并實(shí)現(xiàn)與平臺之間信息雙向?qū)崟r交互,用實(shí)例來驗(yàn)證網(wǎng)關(guān)架構(gòu)模型的功能和性能。
物聯(lián)網(wǎng)網(wǎng)關(guān)作為連接設(shè)備與平臺的樞紐,主要完成數(shù)據(jù)模型的建立與維護(hù)、協(xié)議的轉(zhuǎn)換、設(shè)備的接入與控制以及數(shù)據(jù)同步等。網(wǎng)關(guān)主要依賴于物聯(lián)網(wǎng)平臺進(jìn)行構(gòu)建,其中物聯(lián)網(wǎng)平臺的架構(gòu)如圖1所示。
圖1 物聯(lián)網(wǎng)平臺架構(gòu)
圖1中,物聯(lián)網(wǎng)平臺架構(gòu)由瀏覽器、手機(jī)應(yīng)用、云平臺、網(wǎng)關(guān)及設(shè)備組成,是一種人機(jī)交互的實(shí)時用戶瀏覽器/物聯(lián)網(wǎng)云平臺/物聯(lián)網(wǎng)網(wǎng)關(guān)(browser/server/model,B/S/M)系統(tǒng),其中底層設(shè)備將獲取到的數(shù)據(jù)安全、高效、穩(wěn)定的傳入網(wǎng)關(guān),網(wǎng)關(guān)對傳入的數(shù)據(jù)做相應(yīng)處理,然后將處理之后數(shù)據(jù)發(fā)往云平臺,云平臺具有強(qiáng)大計算及存儲能力,對用戶進(jìn)行授權(quán),用戶通過瀏覽器、手機(jī)應(yīng)用等來管理物聯(lián)網(wǎng)資源。
設(shè)計一種通用的MODBUS網(wǎng)關(guān)架構(gòu)模型,主要目的是完成對設(shè)備的接入、控制、協(xié)議轉(zhuǎn)換、數(shù)據(jù)封裝、模型同步以及數(shù)據(jù)的上傳與下發(fā)。4層網(wǎng)關(guān)架構(gòu)模型如圖2所示。
圖2 4層網(wǎng)關(guān)架構(gòu)
圖2中,將網(wǎng)關(guān)分為網(wǎng)關(guān)內(nèi)部模塊和設(shè)備接入模塊。其中設(shè)備接入模塊包含感知接口層和協(xié)議適配層,網(wǎng)關(guān)內(nèi)部模塊包含數(shù)據(jù)模型同步層和平臺通信層,兩模塊之間采用TCP方式通信,網(wǎng)關(guān)與設(shè)備采用標(biāo)準(zhǔn)MODBUS協(xié)議進(jìn)行通信,網(wǎng)關(guān)與平臺采用標(biāo)準(zhǔn)Websocket協(xié)議進(jìn)行通信。
感知接口層作為MODBUS網(wǎng)關(guān)最底層,通過相應(yīng)硬件接口與物理設(shè)備連接,實(shí)現(xiàn)設(shè)備的接入及控制,感知接口層模塊架構(gòu)如圖3所示。
圖3 感知接口層模塊架構(gòu)
圖3中,感知接口層包含設(shè)備驅(qū)動和控制兩個模塊。設(shè)備驅(qū)動模塊主要用于實(shí)現(xiàn)設(shè)備的接入,設(shè)備控制模塊完成對設(shè)備的具體相關(guān)操作,完成對設(shè)備的接入及控制后,再通過協(xié)議適配層進(jìn)行調(diào)用。
協(xié)議適配層作為物聯(lián)網(wǎng)網(wǎng)關(guān)架構(gòu)中關(guān)鍵一層,主要完成協(xié)議轉(zhuǎn)換,協(xié)議適配層模塊架構(gòu)如圖4所示。
圖4 協(xié)議適配層模塊架構(gòu)
圖4中,協(xié)議適配層包含協(xié)議轉(zhuǎn)化和數(shù)據(jù)包封裝與解析模塊。協(xié)議轉(zhuǎn)換模塊完成對感知接口層上傳的數(shù)據(jù)與平臺定義JS對象標(biāo)記(javascript object notation,JSON)設(shè)備數(shù)據(jù)模型之間的數(shù)據(jù)格式轉(zhuǎn)換。然后采用平臺定義的統(tǒng)一數(shù)據(jù)幀格式對數(shù)據(jù)進(jìn)行封裝與解析,若為數(shù)據(jù)上傳,則對上傳數(shù)據(jù)進(jìn)行封裝并推送數(shù)據(jù)包到TCP客戶端;若為數(shù)據(jù)下發(fā),則接收TCP客戶端下發(fā)數(shù)據(jù),完成數(shù)據(jù)包的解析。
TCP模塊作為連接設(shè)備接入模塊和網(wǎng)關(guān)內(nèi)部模塊的橋梁,可實(shí)現(xiàn)設(shè)備與網(wǎng)關(guān)的全雙工通信,TCP模塊架構(gòu)如圖5所示。
圖5 TCP模塊架構(gòu)
圖5中,TCP模塊包含客戶端和服務(wù)器兩部分,兩者之間的通信采用套接字實(shí)現(xiàn),該模塊主要用于實(shí)現(xiàn)物聯(lián)網(wǎng)平臺統(tǒng)一數(shù)據(jù)幀的上傳與下發(fā)。
數(shù)據(jù)模型同步主要是指平臺網(wǎng)關(guān)和設(shè)備模型與物理網(wǎng)關(guān)數(shù)據(jù)模型保持一致的操作過程,即任何時刻只要平臺模型發(fā)生變化,對應(yīng)物理模型也要同步變化,并保持與平臺模型一致性,反之亦然。數(shù)據(jù)模型同步包含3方面作用:一是接收平臺下發(fā)數(shù)據(jù)完成平臺模型到網(wǎng)關(guān)模型同步,并按協(xié)議轉(zhuǎn)發(fā)平臺數(shù)據(jù)到相應(yīng)設(shè)備;二是接收設(shè)備上傳數(shù)據(jù),更新網(wǎng)關(guān)模型,上傳網(wǎng)關(guān)模型到平臺模型的同步包;三是監(jiān)測設(shè)備上傳的數(shù)據(jù),完成網(wǎng)關(guān)域事件處理,并上傳平臺域事件包。
平臺通信層完成網(wǎng)關(guān)與平臺之間通信,采用Websocket協(xié)議實(shí)現(xiàn)網(wǎng)關(guān)與平臺所定義的機(jī)器服務(wù)器雙向?qū)崟r通信,并完成網(wǎng)關(guān)設(shè)備的認(rèn)證接入、身份驗(yàn)證、模型同步,并為計算設(shè)備推送/讀取平臺設(shè)備數(shù)據(jù)。
MODBUS網(wǎng)關(guān),主要實(shí)現(xiàn)對支持該協(xié)議的底層各種設(shè)備的互聯(lián)互通,以及與物聯(lián)網(wǎng)平臺之間的實(shí)時雙向通信。MODBUS作為主從應(yīng)答協(xié)議采用半雙工方式通信,主從通信方式如圖6所示。
圖6 主從通信方式
圖6中,主站向從站發(fā)送查詢信息,從站通過讀取主站的指令,然后根據(jù)指令回復(fù)主站相應(yīng)數(shù)據(jù)。
MODBUS協(xié)議包含RTU、ASCII、TCP 3種模式,因?yàn)榻^大部分MODBUS設(shè)備支持RTU模式,所以針對RTU模式對網(wǎng)關(guān)進(jìn)行設(shè)計,該模式協(xié)議的幀結(jié)構(gòu)包含6部分內(nèi)容:起始位、設(shè)備地址、功能碼、數(shù)據(jù)、校驗(yàn)以及結(jié)束符。其中起始位占3.5個字符,設(shè)備地址和功能碼各占一個字節(jié),數(shù)據(jù)占N個字節(jié),校驗(yàn)占兩個字節(jié),結(jié)束符占3.5個字符,并且協(xié)議幀中各數(shù)據(jù)位間隔不超過1.5個字符時鐘間隔。
感知接口層包含驅(qū)動和控制兩模塊,主要為了實(shí)現(xiàn)對MODBUS傳感設(shè)備的接入及控制,其中MODBUS主從通信模塊架構(gòu),如圖7所示。
圖7 主從通信模塊架構(gòu)
圖7中,包含協(xié)議適配層、應(yīng)用程序接口(application programming interface,API)及傳感設(shè)備3部分。為使協(xié)議適配層方便調(diào)用,采用API對驅(qū)動模塊和控制模塊進(jìn)行封裝,其中控制模塊對應(yīng)功能模塊,用于將平臺下發(fā)的請求轉(zhuǎn)化為對具體設(shè)備的一系列通信操作轉(zhuǎn)化為平臺所請求的結(jié)果;驅(qū)動模塊對應(yīng)串口模塊、循環(huán)冗余校驗(yàn)(cyclic redundancy check,CRC)模塊及讀寫模塊,用于設(shè)備檢測,完成對設(shè)備的接入、退出及系統(tǒng)檢測。
驅(qū)動及控制程序流程如圖8所示。其中包含3部分內(nèi)容,一是對串口進(jìn)行初始化并對設(shè)備進(jìn)行超時檢測;二是調(diào)用讀數(shù)據(jù)功能塊完成數(shù)據(jù)的讀取,并通過校驗(yàn)對數(shù)據(jù)進(jìn)行驗(yàn)證,驗(yàn)證無誤后再對數(shù)據(jù)進(jìn)行讀處理;三是讀數(shù)據(jù)處理完成后,調(diào)用寫數(shù)據(jù)功能塊完成對數(shù)據(jù)的寫入,檢測數(shù)據(jù)是否有錯,若沒有再對數(shù)據(jù)進(jìn)行寫處理。完成對程序的編寫并實(shí)現(xiàn)對設(shè)備的相應(yīng)操作。
感知接口層各模塊具體實(shí)現(xiàn)過程如下。
步驟1 驅(qū)動。
①串口模塊是采用淘寶cnpm鏡像安裝第三方serialport模塊創(chuàng)建串口,匹配設(shè)備參數(shù)。
②CRC模塊是用于將一幀除CRC校驗(yàn)之外的數(shù)據(jù)進(jìn)行計算生成CRC校驗(yàn)碼,用于數(shù)據(jù)傳輸檢錯,以確保數(shù)據(jù)正確讀寫。
③數(shù)據(jù)讀/寫模塊是完成對寄存器中設(shè)備數(shù)據(jù)的讀寫操作,供設(shè)備控制模塊調(diào)用。
步驟2 控制。
控制主要完成對MODBUS常用功能碼的封裝,實(shí)現(xiàn)對設(shè)備的相關(guān)操作,模塊中每一個函數(shù)對應(yīng)實(shí)現(xiàn)某一功能碼特定功能,實(shí)際所需哪種,直接調(diào)用其對應(yīng)函數(shù)即可。以03H功能碼為例,用于讀取保持寄存器中溫/濕度值,調(diào)用封裝好的函數(shù)readHoldRegisters(address,dataAddress,length,next)可獲取設(shè)備數(shù)據(jù),其中address代表從機(jī)地址,dataAddress代表寄存器中數(shù)據(jù)初始位,length代表寄存器長度,next表示進(jìn)入下一個處理函數(shù)。本系統(tǒng)可實(shí)現(xiàn)8種常用功能碼,具體接口函數(shù)如下。
01H:readCoilsState() 讀線圈的狀態(tài)
02H:readDiscreteState() 讀離散狀態(tài)
03H:readHoldRegisters() 讀保持寄存器
04H:readInputRegisters() 讀輸入寄存器
05H:writeCoil() 寫單個線圈
06H:writeRegister() 寫單個寄存器
0FH:writeCoils() 寫多個線圈
10H:writeRegisters() 寫多個寄存器
圖8 驅(qū)動及控制程序流程
協(xié)議適配層包含協(xié)議轉(zhuǎn)換和數(shù)據(jù)封裝與解析兩個模塊。協(xié)議轉(zhuǎn)換完成MODBUS傳感設(shè)備數(shù)據(jù)與平臺定義JSON格式設(shè)備數(shù)據(jù)模型的格式轉(zhuǎn)換,數(shù)據(jù)封裝是將JSON數(shù)據(jù)模型按照物聯(lián)網(wǎng)平臺定義的統(tǒng)一數(shù)據(jù)幀格式進(jìn)行封裝。主要采用JSON格式數(shù)據(jù),具體包含3種類型:設(shè)備認(rèn)證、設(shè)備心跳和設(shè)備數(shù)據(jù)更新。各類型所對應(yīng)的相關(guān)函數(shù)、JSON數(shù)據(jù)格式及具體功能如下。
(1)設(shè)備認(rèn)證
①認(rèn)證函數(shù)及JSON格式數(shù)據(jù)模型如下。
devCertificate(gid,did,userkey,function(err)
{//應(yīng)答消息處理
})
sendDoc = {
msgType : string, // devCertificate操作
gwid : gid, //網(wǎng)關(guān)ID
devid : did, //設(shè)備ID
userkey : userkey //用戶秘鑰
}
②功能:設(shè)備發(fā)送認(rèn)證請求消息到網(wǎng)關(guān),網(wǎng)關(guān)認(rèn)證通過后激活設(shè)備,設(shè)備處于on狀態(tài)。
(2)設(shè)備心跳
①心跳函數(shù)及JSON格式數(shù)據(jù)模型如下。
devHeartBeat(did,function(err){
//應(yīng)答消息處理
})
sendDoc = {
msgType : string, // devHeartBeat操作
devid : did, //設(shè)備ID
n : num //心跳包序列號
}
②功能:設(shè)備定時發(fā)送心跳消息到網(wǎng)關(guān),用于檢測設(shè)備在線狀態(tài)。
(3)設(shè)備數(shù)據(jù)更新
①數(shù)據(jù)更新函數(shù)及JSON數(shù)據(jù)模型如下。
devUpdateData(did,doc,loc,function(err){
//應(yīng)答消息處理
})
sendDoc = {
msgType : string, //devUpdataData操作
devid : did, //設(shè)備ID
v : num, //數(shù)據(jù)點(diǎn)值(溫度)
time : string}
②功能:添加更新設(shè)備數(shù)據(jù)到JSON格式設(shè)備數(shù)據(jù)模型,并同步網(wǎng)關(guān)設(shè)備數(shù)據(jù)模型。
作為連接網(wǎng)關(guān)和設(shè)備之間的通信協(xié)議,TCP通信主要包含客戶端和服務(wù)器的建立兩部分內(nèi)容,具體TCP通信實(shí)現(xiàn)流程如圖9所示。
圖9 TCP通信實(shí)現(xiàn)流程
TCP通信實(shí)現(xiàn)步驟如下。
步驟1 建立TCP客戶端,通過使用socket套接字將協(xié)議轉(zhuǎn)換所生成的3種類型的物聯(lián)網(wǎng)平臺統(tǒng)一幀格式的完整數(shù)據(jù)包發(fā)送到TCP服務(wù)端。
步驟2 調(diào)用node.js原生net模塊[17],構(gòu)建TCP服務(wù)器,監(jiān)聽來自TCP客戶端事件,當(dāng)客戶端套接字連接到服務(wù)端時觸發(fā)連接事件。通過socket監(jiān)聽事件[18],若監(jiān)聽到結(jié)束事件,刪除網(wǎng)關(guān)列表對應(yīng)網(wǎng)關(guān);若監(jiān)聽到關(guān)閉事件,關(guān)閉網(wǎng)關(guān);若監(jiān)聽到數(shù)據(jù)事件,對一幀完整數(shù)據(jù)包里的JSON數(shù)據(jù)的解析,將解析到的JSON數(shù)據(jù)上傳至數(shù)據(jù)模型同步層,再作相應(yīng)處理。
數(shù)據(jù)模型同步層包含數(shù)據(jù)上傳和下發(fā)的同步,主要是指平臺虛擬網(wǎng)關(guān)和設(shè)備數(shù)據(jù)模型與物理網(wǎng)關(guān)和設(shè)備數(shù)據(jù)保持一致的操作過程,具體實(shí)現(xiàn)步驟如下。
步驟1 設(shè)備數(shù)據(jù)上傳,通過接收來自客戶端的事件并做相應(yīng)的處理,設(shè)備數(shù)據(jù)上傳步驟如圖10所示。
圖10中,TCP服務(wù)端監(jiān)聽來自TCP客戶端data事件所上傳的設(shè)備JSON數(shù)據(jù),通過判斷數(shù)據(jù)類型來做相應(yīng)處理。若為設(shè)備認(rèn)證,經(jīng)平臺通信層發(fā)送消息到平臺完成設(shè)備兩次認(rèn)證;若為心跳,經(jīng)平臺通信層發(fā)送心跳到平臺;若為設(shè)備數(shù)據(jù)更新,同步更新設(shè)備數(shù)據(jù)到平臺。
圖10 設(shè)備數(shù)據(jù)上傳步驟
步驟2 平臺數(shù)據(jù)下發(fā),通過接收來自平臺的事件并做相應(yīng)的處理,平臺數(shù)據(jù)下發(fā)設(shè)備控制消息如圖11所示。
圖11 平臺數(shù)據(jù)下發(fā)設(shè)備控制消息
圖11中,網(wǎng)關(guān)通過客戶端監(jiān)聽來自平臺的事件。若監(jiān)聽到連接事件則與平臺建立連接,連接成功后接收平臺下發(fā)的數(shù)據(jù)到數(shù)據(jù)模型同步層,經(jīng)TCP模塊、設(shè)備控制和驅(qū)動模塊轉(zhuǎn)發(fā)平臺數(shù)據(jù)到設(shè)備,完成對底層設(shè)備的控制操作;若監(jiān)聽到斷開事件,則斷開與平臺之間的連接。
構(gòu)建基于WebSocket協(xié)議的socket.io客戶端將解析后的數(shù)據(jù)上傳至云平臺,實(shí)現(xiàn)數(shù)據(jù)模型同步更新。分別對解析到設(shè)備認(rèn)證、心跳請求、設(shè)備數(shù)據(jù)更新3類消息類型作相應(yīng)處理,具體處理流程如下。
步驟1 設(shè)備認(rèn)證,通過兩次握手實(shí)現(xiàn),兩次握手實(shí)現(xiàn)步驟如圖12所示。
圖12 兩次握手實(shí)現(xiàn)步驟
圖12中,網(wǎng)關(guān)和平臺進(jìn)行兩次握手已達(dá)到設(shè)備的認(rèn)證。首次握手,網(wǎng)關(guān)向平臺發(fā)送網(wǎng)關(guān)和設(shè)備認(rèn)證識別號,平臺接收到數(shù)據(jù)后,生成驗(yàn)證隨機(jī)數(shù),發(fā)送到網(wǎng)關(guān);二次握手,網(wǎng)關(guān)對隨機(jī)數(shù)和用戶秘鑰一起加密,平臺認(rèn)證成功返回網(wǎng)關(guān)和設(shè)備模型到網(wǎng)關(guān),兩次握手結(jié)束。
步驟2 用設(shè)備心跳來判斷網(wǎng)關(guān)從屬設(shè)備狀態(tài),若為off,將其設(shè)為on,開啟網(wǎng)關(guān)設(shè)備,通過socket.io將更新的設(shè)備狀態(tài)上傳至云平臺。
步驟3 設(shè)備數(shù)據(jù)更新,通過利用Websocket協(xié)議中socket.emit方法將設(shè)備的數(shù)據(jù)發(fā)送至云平臺,同步更新設(shè)備數(shù)據(jù)模型。
測試包含功能及性能測試兩部分,功能測試完成API接口測試和設(shè)備數(shù)據(jù)上傳與平臺控制命令下發(fā)測試;性能測試通過增加測試數(shù)據(jù)完成對整個系統(tǒng)的丟包率、時延等各種性能參數(shù)的測試。
(1)API接口測試
調(diào)用API接口中相應(yīng)函數(shù),完成對傳感器接入數(shù)據(jù)采集,溫濕度數(shù)據(jù)采集如圖13所示。
圖13 溫濕度數(shù)據(jù)采集
圖13中,實(shí)現(xiàn)對傳感器溫濕度數(shù)據(jù)的采集,規(guī)定采集間隔為5秒。以其中一組數(shù)據(jù)為例,其中溫度值為24.5℃,濕度值為48.3%RH,并增加實(shí)時采樣時間。
(2)設(shè)備數(shù)據(jù)上傳
①設(shè)備接入模塊測試
測試之前需在本平臺對設(shè)備進(jìn)行注冊,平臺分配給用戶相應(yīng)網(wǎng)關(guān)ID(gwid)、設(shè)備ID(devid)和用戶秘鑰(userkey),全網(wǎng)唯一。設(shè)備數(shù)據(jù)上傳之前需要先進(jìn)行認(rèn)證,若存在有多個設(shè)備接入,則將設(shè)備注冊信息存放于單獨(dú)配置文件,便于后期更新維護(hù)。以溫度傳感(AM2301)為例進(jìn)行測試,設(shè)備接入模塊測試如圖14所示。
圖14中,設(shè)備請求消息包含3部分:一是設(shè)備的認(rèn)證請求,構(gòu)造認(rèn)證消息填充到JSON數(shù)據(jù)結(jié)構(gòu);二是設(shè)備的數(shù)據(jù)請求,將實(shí)時溫度填充到JSON數(shù)據(jù)結(jié)構(gòu);三是設(shè)備的心跳請求,心跳間隔為10秒,用于檢測設(shè)備是否在線。對構(gòu)造的3種類型請求按照平臺統(tǒng)一數(shù)據(jù)封裝格式進(jìn)行封裝,最后通過TCP對封裝好的buffer數(shù)據(jù)包進(jìn)行上傳。
②網(wǎng)關(guān)內(nèi)部模塊測試
作為網(wǎng)關(guān)內(nèi)部模塊,數(shù)據(jù)模型同步層及平臺通信層接收來自傳感設(shè)備3種類型數(shù)據(jù)并進(jìn)行相應(yīng)處理,網(wǎng)關(guān)內(nèi)部模塊測試如圖15所示。
圖15 網(wǎng)關(guān)內(nèi)部模塊測試
圖15中,包含3部分內(nèi)容:一是網(wǎng)關(guān)將接收到的認(rèn)證消息發(fā)送到平臺并接收到來自平臺的認(rèn)證隨機(jī)數(shù),然后對隨機(jī)數(shù)和userkey采用MD5加密,重新組包發(fā)往平臺兩次握手結(jié)束,完成設(shè)備認(rèn)證;二是設(shè)備溫度數(shù)據(jù)測試,同步更新設(shè)備數(shù)據(jù)到平臺;三是心跳測試,同步更新心跳到平臺。
(3)平臺數(shù)據(jù)下發(fā)
平臺通過構(gòu)造控制命令經(jīng)網(wǎng)關(guān)發(fā)送到對應(yīng)設(shè)備,完成對設(shè)備的控制操作,平臺數(shù)據(jù)下發(fā)如圖16所示。
圖16 平臺數(shù)據(jù)下發(fā)
圖16中,包含兩部分內(nèi)容:一是網(wǎng)關(guān)解析來自平臺buffer數(shù)據(jù)獲取JSON格式設(shè)備控制命令;二是打開設(shè)備,獲取設(shè)備溫度數(shù)據(jù),每5秒更新一次,更新后的數(shù)據(jù)會重新組包經(jīng)網(wǎng)關(guān)發(fā)往平臺實(shí)現(xiàn)數(shù)據(jù)模型的同步。
采用Jmeter軟件取1 000個樣本,測試網(wǎng)關(guān)性能[19]。各性能參數(shù)與預(yù)期聚合報告對比如表1所示。
表1 聚合報告對比
表1中,對網(wǎng)關(guān)性能測試的參數(shù)主要包含平均響應(yīng)時間、丟包率、錯誤率、時延以及傳輸速率5部分,通過聚合報告分析,對比得出,實(shí)測各類參數(shù)均符合預(yù)期目標(biāo)范圍,且網(wǎng)關(guān)通信良好。
測試結(jié)果,網(wǎng)關(guān)中各模塊均以實(shí)現(xiàn)各自功能。網(wǎng)關(guān)能夠?qū)崿F(xiàn)傳感設(shè)備的接入、控制以及數(shù)據(jù)的上傳與下發(fā),并且各種性能參數(shù)均符合預(yù)期設(shè)計的目標(biāo)。MODBUS網(wǎng)關(guān)的構(gòu)建實(shí)現(xiàn)了設(shè)備與平臺之間的高效,穩(wěn)定的雙向通信。
采用TCP服務(wù)器搭建技術(shù)、Socket.IO雙向通信技術(shù)、Node.js技術(shù)以及MODBUS客戶端搭建技術(shù)設(shè)計并實(shí)現(xiàn)了一種通用MODBUS物聯(lián)網(wǎng)網(wǎng)關(guān)。首先,在云平臺的基礎(chǔ)之上構(gòu)建網(wǎng)關(guān)的模型架構(gòu),將網(wǎng)關(guān)分為感知接口層,協(xié)議適配層,數(shù)據(jù)模型同步層和平臺通信層4層方便進(jìn)行實(shí)現(xiàn);其次,從網(wǎng)關(guān)的模塊化設(shè)計與通信系統(tǒng)的設(shè)計需求兩方面出發(fā),對網(wǎng)關(guān)通信系統(tǒng)設(shè)計,采用MODBUS、TCP與Socket.IO的實(shí)現(xiàn)路徑,具體實(shí)現(xiàn)設(shè)備、物聯(lián)網(wǎng)網(wǎng)關(guān)及平臺三者之間的設(shè)備認(rèn)證,數(shù)據(jù)上傳與下發(fā),設(shè)備心跳3大類實(shí)時信令的雙向交互;最后,對網(wǎng)關(guān)功能和性能進(jìn)行測試。通過測試表明,網(wǎng)關(guān)可實(shí)現(xiàn)對于支持標(biāo)準(zhǔn)MODBUS協(xié)議的各類傳感設(shè)備的接入、控制以及數(shù)據(jù)的上傳與下發(fā),從而實(shí)現(xiàn)設(shè)備與平臺之間的雙向通信。通過性能對比,其丟包率、時延等各類性能參數(shù)均滿足預(yù)期標(biāo)準(zhǔn),且網(wǎng)關(guān)通信良好,基本滿足設(shè)計要求。