,
(華中科技大學(xué) 自動化學(xué)院,武漢 430074)
物聯(lián)網(wǎng)是在傳統(tǒng)互聯(lián)網(wǎng)基礎(chǔ)上進(jìn)行了衍生和擴展,使生活中的物品可以通過網(wǎng)絡(luò)互連,進(jìn)行數(shù)據(jù)交互。在物聯(lián)網(wǎng)中,設(shè)備通過自組織的模式構(gòu)建無線網(wǎng)絡(luò),提供實現(xiàn)人與物、物與物之間的通信。不足的是,物聯(lián)網(wǎng)中通信協(xié)議多種多樣,各種感知技術(shù)和通信協(xié)議沒有統(tǒng)一的標(biāo)準(zhǔn)[1],感知網(wǎng)絡(luò)與以太網(wǎng)之間很難通信,而且物聯(lián)網(wǎng)中一些通信協(xié)議無法遠(yuǎn)距離傳輸數(shù)據(jù)。因而,在物聯(lián)網(wǎng)發(fā)展的過程中,產(chǎn)生了一種新型的網(wǎng)元設(shè)備——物聯(lián)網(wǎng)網(wǎng)關(guān)。
物聯(lián)網(wǎng)網(wǎng)關(guān)可以實現(xiàn)感知網(wǎng)絡(luò)與通信網(wǎng)絡(luò),以及不同類型感知網(wǎng)絡(luò)之間的協(xié)議轉(zhuǎn)換,既可以實現(xiàn)廣域互聯(lián),也可以實現(xiàn)局域互聯(lián)。另一方面,物聯(lián)網(wǎng)網(wǎng)關(guān)能夠?qū)⒉煌O(shè)備收集到的信息整合起來,實現(xiàn)對終端設(shè)備的統(tǒng)一管理和控制。此外,物聯(lián)網(wǎng)的一些應(yīng)用場景(如智能家居),需要點對點連接,不利于數(shù)據(jù)安全傳輸。
Node.js[2]是一個基于Chrome V8引擎的JavaScript運行環(huán)境。目前,Node.js主要用于構(gòu)建Web應(yīng)用[3],將Node.js用于物聯(lián)網(wǎng)設(shè)備端連接的應(yīng)用還不多。通過事件驅(qū)動、非阻塞式I/O模型,Node.js可以處理數(shù)萬條連接[11]。而物聯(lián)網(wǎng)中數(shù)據(jù)的顯著特點是海量、周期性強、隨著終端設(shè)備數(shù)量的增長而增多[9]。因此,可以使用Node.js構(gòu)建能夠承受大量持續(xù)的并發(fā)訪問請求的網(wǎng)關(guān)系統(tǒng),提高系統(tǒng)的吞吐量和執(zhí)行效率。
Node.js的事件驅(qū)動模型與物聯(lián)網(wǎng)開發(fā)中通常采用的中斷響應(yīng)模型作用一致,而且Node.js通過單線程異步執(zhí)行程序,相比多進(jìn)程或者多線程的編程方式,Node.js可以更加高效地使用內(nèi)存資源。
Node.js是跨平臺的,即同樣的JavaScript代碼可以部署運行在Windows、Linux、OSX等平臺,所以使用Node.js開發(fā)的網(wǎng)關(guān)可以很容易部署到嵌入式Linux平臺。JavaScript支持JSON數(shù)據(jù)格式,目前各種云服務(wù)和數(shù)據(jù)傳輸都是基于JSON數(shù)據(jù)格式實現(xiàn)的,當(dāng)物聯(lián)網(wǎng)網(wǎng)關(guān)采用JavaScript開發(fā)時,可以對接互聯(lián)網(wǎng)上海量的云服務(wù)與云資源[10]。
目前,JavaScript腳本語言已經(jīng)可以用于物聯(lián)網(wǎng)終端設(shè)備的開發(fā)。Espruino 是一個專門為微控制器設(shè)計的JavaScript解釋器。Duktape是一個輕量級的嵌入式JavaScript引擎,專注于可移植性和低占用率[4]。JerryScript是由三星開發(fā)的一個小型的適用于嵌入式設(shè)備JavaScript引擎[5]。如果使用JavaScript同時進(jìn)行物聯(lián)網(wǎng)節(jié)點和網(wǎng)關(guān)的開發(fā)[8],可以明顯提高開發(fā)效率,緩解當(dāng)前物聯(lián)網(wǎng)系統(tǒng)開發(fā)周期長、代價大等問題。
作為物聯(lián)網(wǎng)中感知層和傳輸層的紐帶,物聯(lián)網(wǎng)網(wǎng)關(guān)需要滿足以下功能需求[3]:
① 數(shù)據(jù)感知功能:網(wǎng)關(guān)能夠感知接收物聯(lián)網(wǎng)節(jié)點發(fā)送的數(shù)據(jù);
② 廣泛的接入能力:目前物聯(lián)網(wǎng)常用的應(yīng)用層協(xié)議有多種,網(wǎng)關(guān)能夠兼容多種應(yīng)用層協(xié)議,實現(xiàn)不同物聯(lián)網(wǎng)節(jié)點互聯(lián)互通;
③ 協(xié)議轉(zhuǎn)換能力:將下層標(biāo)準(zhǔn)格式的數(shù)據(jù)統(tǒng)一封裝,保證不同協(xié)議變成統(tǒng)一的數(shù)據(jù)和信令,將下發(fā)的數(shù)據(jù)包解析成相應(yīng)協(xié)議可以識別的控制命令;
④ 設(shè)備管理能力:物聯(lián)網(wǎng)的節(jié)點數(shù)量多,通過網(wǎng)關(guān)對節(jié)點設(shè)備進(jìn)行狀態(tài)查詢、監(jiān)控、配置等;
⑤ 云接入能力:通過將網(wǎng)關(guān)接入云端,實現(xiàn)遠(yuǎn)程控制、數(shù)據(jù)存儲、數(shù)據(jù)分析等功能。
物聯(lián)網(wǎng)網(wǎng)關(guān)平臺使用Raspberry Pi 3B,由于Linux的內(nèi)核小、效率高,適應(yīng)多種CPU和硬件平臺,而且Node.js可以很容易部署到Linux上,所以在Raspberry Pi上運行嵌入式Linux操作系統(tǒng)作為實現(xiàn)網(wǎng)關(guān)功能的基礎(chǔ),然后使用Node.js擴展出網(wǎng)關(guān)所需要的各個功能模塊,實現(xiàn)網(wǎng)關(guān)與互聯(lián)網(wǎng)和傳感器網(wǎng)絡(luò)的數(shù)據(jù)信息交互。
1.3.1 網(wǎng)關(guān)系統(tǒng)架構(gòu)
根據(jù)網(wǎng)關(guān)在物聯(lián)網(wǎng)中的作用,采用分層設(shè)計方法將網(wǎng)關(guān)分為感知層、模型層、視圖層。各層之間的數(shù)據(jù)傳遞是相互的、可控制的[7]。圖1是網(wǎng)關(guān)系統(tǒng)的三層架構(gòu)圖。
圖1 網(wǎng)關(guān)系統(tǒng)架構(gòu)圖
1.3.2 感知層
感知層主要作用是感知物聯(lián)網(wǎng)節(jié)點設(shè)備的工作參數(shù),并根據(jù)需要改變設(shè)備的工作狀態(tài)。在物聯(lián)網(wǎng)系統(tǒng)中,數(shù)據(jù)交換主要依靠應(yīng)用層協(xié)議來解決。目前常見的物聯(lián)網(wǎng)應(yīng)用層協(xié)議有CoAP[6]、MQTT、LwM2M、AMQP等,因此在感知層需要集成不同應(yīng)用層協(xié)議的服務(wù)端,以感知接收不同設(shè)備的請求,同時當(dāng)網(wǎng)關(guān)接收到下達(dá)命令時,調(diào)用相應(yīng)的服務(wù)端向設(shè)備發(fā)送控制命令。
1.3.3 模型層
模型層是整個物聯(lián)網(wǎng)網(wǎng)關(guān)的核心,主要完成對上傳數(shù)據(jù)和下達(dá)命令的解析,并實現(xiàn)兩者之間的相互轉(zhuǎn)換,以實現(xiàn)對物聯(lián)網(wǎng)節(jié)點的統(tǒng)一控制和管理,同時向上屏蔽底層通信協(xié)議的異構(gòu)型。當(dāng)視圖層下達(dá)控制命令時,模型層解析命令并調(diào)用相應(yīng)模塊,將命令轉(zhuǎn)換成終端設(shè)備能夠理解的數(shù)據(jù)格式。當(dāng)感知層接收到上傳數(shù)據(jù)時,該層解析消息并將數(shù)據(jù)轉(zhuǎn)換成統(tǒng)一的數(shù)據(jù)格式。同時,模型層將設(shè)備數(shù)據(jù)進(jìn)行緩存,并周期性地將緩存數(shù)據(jù)存儲到數(shù)據(jù)庫,并清理緩存。
物聯(lián)網(wǎng)中設(shè)備數(shù)據(jù)不間斷地生成,并且數(shù)據(jù)量大,無法將這些數(shù)據(jù)存儲到網(wǎng)關(guān),而且部分?jǐn)?shù)據(jù)有很大的研究價值。因此,可以利用云技術(shù)管理并支撐基于大數(shù)據(jù)的新型智能應(yīng)用。
為了實現(xiàn)與視圖層的數(shù)據(jù)交互,在模型層加入HTTP、WebSocket兩個子模塊,其中通過HTTP協(xié)議請求頁面,使用WebSocket協(xié)議實現(xiàn)長連接。此外,在模型層實現(xiàn)了AWS IoT平臺的客戶端,將數(shù)據(jù)上傳到AWS云實現(xiàn)遠(yuǎn)程控制、云端數(shù)據(jù)存儲和數(shù)據(jù)分析等功能。圖2是模型層結(jié)構(gòu)圖。
圖2 模型層結(jié)構(gòu)圖
1.3.4 視圖層
視圖層即用戶界面,把物聯(lián)網(wǎng)設(shè)備的工作狀態(tài)顯示給用戶,同時用戶可以輸入指令以控制設(shè)備。其中,當(dāng)用戶處于局域網(wǎng)環(huán)境下,可以直接登陸局域網(wǎng)查看數(shù)據(jù);當(dāng)處于外網(wǎng)時,主要通過云端查看數(shù)據(jù)。視圖層使用Freeboard實現(xiàn),在其中實現(xiàn)了WebSocket和AWS IoT的客戶端。相比傳統(tǒng)的網(wǎng)關(guān)系統(tǒng),視圖層可以使網(wǎng)關(guān)不受網(wǎng)絡(luò)環(huán)境限制,隨時查看網(wǎng)關(guān)和設(shè)備運行狀態(tài)。
圖3為網(wǎng)關(guān)的整體工作流程圖。具體流程如下:
① 初始化感知層各個服務(wù)端模塊,初始化模型層數(shù)據(jù)緩沖區(qū)。
② 感知層接收到物聯(lián)網(wǎng)節(jié)點上傳的數(shù)據(jù),數(shù)據(jù)被緩存到Redis數(shù)據(jù)庫,然后由模型層進(jìn)行數(shù)據(jù)的解析和轉(zhuǎn)換。最后上傳到AWS IoT和視圖層的WebSocket客戶端。當(dāng)用戶網(wǎng)關(guān)與Freeboard處于同一局域網(wǎng)環(huán)境下,F(xiàn)reeboard通過WebSocket客戶端直接查看數(shù)據(jù)。當(dāng)處于不同網(wǎng)絡(luò)環(huán)境下,F(xiàn)reeboard從AWS IoT提取數(shù)據(jù)顯示。
③ 視圖層下達(dá)控制命令時,數(shù)據(jù)首先被緩存到Redis數(shù)據(jù)庫,當(dāng)用戶與網(wǎng)關(guān)處于同一局域網(wǎng)環(huán)境下,數(shù)據(jù)由模型層進(jìn)行解析和轉(zhuǎn)換,然后下發(fā)給物聯(lián)網(wǎng)節(jié)點設(shè)備。當(dāng)處于不同網(wǎng)絡(luò)環(huán)境下,視圖層通過AWS IoT的客戶端將命令發(fā)送給云端,然后由云端將命令發(fā)送給模型層,再由模型層進(jìn)行解析和轉(zhuǎn)換,最后下發(fā)給物聯(lián)網(wǎng)節(jié)點設(shè)備。
④ 系統(tǒng)周期性讀取Redis數(shù)據(jù)庫緩存的數(shù)據(jù),然后進(jìn)行處理,最后清除Redis數(shù)據(jù)庫緩存的數(shù)據(jù)。
在智能家居場景下搭建了一個物聯(lián)網(wǎng)系統(tǒng)。該系統(tǒng)包含兩個節(jié)點:節(jié)點一(CN)是一個臺燈,可以在界面上顯示和控制臺燈的開關(guān)狀態(tài);節(jié)點二(WN)有溫度傳感器、運動傳感器、測量心率的傳感器。為了方便驗證網(wǎng)關(guān)的功能,實驗中使用Node.js模擬節(jié)點,不斷地向網(wǎng)關(guān)發(fā)送數(shù)據(jù)。
圖3 網(wǎng)關(guān)工作流程圖
根據(jù)用戶所處的網(wǎng)絡(luò)環(huán)境,系統(tǒng)測試分別在家庭局域網(wǎng)環(huán)境和外網(wǎng)環(huán)境下進(jìn)行。首先在家庭局域網(wǎng)環(huán)境下,運行網(wǎng)關(guān)程序,訪問地址http://127.0.0.1,即可查看本地設(shè)備數(shù)據(jù)。圖4顯示局域網(wǎng)環(huán)境下節(jié)點的工作狀態(tài):其中本地連接是一個可控制按鈕,可以控制本地連接通斷,警報欄顯示的是具體的數(shù)值和狀態(tài)判斷,體征欄顯示的是體溫和心率曲線,睡眠欄顯示的是運動量和根據(jù)運動量計算的睡/醒狀態(tài)。
圖4 局域網(wǎng)環(huán)境下節(jié)點工作狀態(tài)
當(dāng)點擊本地連接按鈕時,可以改變本地連接的狀態(tài)。PC通過PuTTY訪問樹莓派,圖5所示為當(dāng)點擊本地連接按鈕時網(wǎng)關(guān)打印的日志。
圖5 網(wǎng)關(guān)日志
在外網(wǎng)環(huán)境下,通過云端訪問數(shù)據(jù),其中網(wǎng)頁部署到Github,根據(jù)部署時生成的網(wǎng)址(http://wangnuannuan.github.io/ibaby-python)訪問界面。圖6所示為外網(wǎng)環(huán)境下節(jié)點工作狀態(tài)。
實驗中虛擬節(jié)點分別采用不同的應(yīng)用層協(xié)議接入網(wǎng)關(guān),實現(xiàn)與網(wǎng)關(guān)的數(shù)據(jù)交互。首先節(jié)點設(shè)備向網(wǎng)關(guān)發(fā)送數(shù)據(jù),以驗證網(wǎng)關(guān)是否能夠接收不同設(shè)備的請求,并正確處理數(shù)據(jù),然后在網(wǎng)關(guān)的視圖層點擊按鈕,驗證節(jié)點設(shè)備是否能接收到網(wǎng)關(guān)的命令。
根據(jù)實驗得出,網(wǎng)關(guān)可以感知接收不同設(shè)備的數(shù)據(jù)并正確顯示,同時實時顯示更新狀態(tài),并能響應(yīng)視圖層用戶的控制命令。
圖6 外網(wǎng)環(huán)境下節(jié)點工作狀態(tài)