張美平,丁文才,許友澤
(福建師范大學(xué) 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,福州 350007)
隨著科學(xué)技術(shù)的發(fā)展,信息技術(shù)的進(jìn)步,我們正逐漸的從互聯(lián)網(wǎng)向物聯(lián)網(wǎng)邁進(jìn).物聯(lián)網(wǎng)就是物物相連的互聯(lián)網(wǎng),是新一代信息技術(shù)的重要組成部分,也是“信息化”時(shí)代的重要階段.
物聯(lián)網(wǎng)技術(shù)在現(xiàn)代農(nóng)業(yè)中的應(yīng)用,對提高農(nóng)業(yè)的生產(chǎn)管理水平效果顯著.搭建一個(gè)智能農(nóng)業(yè)大棚系統(tǒng)模擬系統(tǒng),監(jiān)測環(huán)境數(shù)據(jù),探究溫度、濕度、光強(qiáng)等環(huán)境因素對農(nóng)作物的影響.采集節(jié)點(diǎn)采用移植了Contiki操作系統(tǒng)的傳感器,該操作系統(tǒng)支持6LoWPAN協(xié)議,該協(xié)議是IPv6在無線傳感網(wǎng)的一種實(shí)現(xiàn),為使傳感器節(jié)點(diǎn)接入網(wǎng)絡(luò),與現(xiàn)有的IPv4融合,需要設(shè)計(jì)移植一個(gè)支持IPv6的嵌入式設(shè)備作為物聯(lián)網(wǎng)接入網(wǎng)關(guān).
物聯(lián)網(wǎng)網(wǎng)關(guān),作為一個(gè)新的名詞,在未來的物聯(lián)網(wǎng)時(shí)代將會(huì)扮演非常重要的角色,它將成為連接物聯(lián)網(wǎng)與互聯(lián)網(wǎng)的紐帶.作為網(wǎng)關(guān)設(shè)備,物聯(lián)網(wǎng)網(wǎng)關(guān)可以實(shí)現(xiàn)物聯(lián)網(wǎng)與通信網(wǎng)絡(luò)以及不同類型無線傳感器與執(zhí)行器網(wǎng)絡(luò)之間的協(xié)議轉(zhuǎn)換設(shè)備.既可以實(shí)現(xiàn)廣域互聯(lián),也可以實(shí)現(xiàn)局域互聯(lián)[1].對于使用IPv6的無線傳感器與執(zhí)行器網(wǎng)絡(luò)的設(shè)備來說,如果要跟互聯(lián)網(wǎng)上的設(shè)備終端進(jìn)行連接,那就必須經(jīng)過協(xié)議轉(zhuǎn)換才能做到,但由于自身性能的限制,而不能自行進(jìn)行協(xié)議轉(zhuǎn)換,若在傳統(tǒng)的無線路由器上,結(jié)合開源無線路由操作系統(tǒng)OpenWRT,將其作為網(wǎng)關(guān)設(shè)備,就能實(shí)現(xiàn)與互聯(lián)網(wǎng)的無縫連接.
本網(wǎng)關(guān)是在OpenWRT無線路由器上部署MQTTMQTT-SN協(xié)議,以實(shí)現(xiàn)無線傳感器與執(zhí)行器網(wǎng)絡(luò)與傳統(tǒng)通信網(wǎng)絡(luò)的無縫連接.消息隊(duì)列遙測傳輸(Message Queuing Telemetry Transport,MQTT)是IBM開發(fā)基于消息發(fā)布與訂閱機(jī)制的即時(shí)通訊協(xié)議,有可能成為物聯(lián)網(wǎng)的重要組成部分.該協(xié)議支持大部分的嵌入式系統(tǒng)平臺,幾乎可以把大部分的物聯(lián)網(wǎng)硬件和外部網(wǎng)絡(luò)連接起來,通常被用來當(dāng)做傳感器和執(zhí)行器(比如通過Twitter讓房屋聯(lián)網(wǎng))的通信協(xié)議[2].MQTT-SN協(xié)議是MQTT針對無線傳感器網(wǎng)絡(luò)(Wireless Sensor Networks,WSN)的拓展.MQTT-SN的運(yùn)行需要依賴于已部署MQTT協(xié)議的網(wǎng)絡(luò).MQTT-SN協(xié)議中有兩個(gè)角色:節(jié)點(diǎn)(Node)和網(wǎng)關(guān)(GW).WSN節(jié)點(diǎn)通過MQTT-SN協(xié)議與網(wǎng)關(guān)交互,網(wǎng)關(guān)進(jìn)行協(xié)議轉(zhuǎn)換之后使節(jié)點(diǎn)接入MQTT服務(wù)器.由于MQTT-SN協(xié)議運(yùn)行需要依賴于MQTT協(xié)議,下文使用MQTT-SN協(xié)議泛指MQTTMQTT-SN的組合[3].
本文提出的IPv6物聯(lián)網(wǎng)接入網(wǎng)關(guān)將IPv6無線傳感網(wǎng)與現(xiàn)有的IPv4網(wǎng)絡(luò)相融合,進(jìn)行協(xié)議轉(zhuǎn)換.底層的物聯(lián)網(wǎng)使用部署了MQTT-SN協(xié)議的contiki節(jié)點(diǎn),這些節(jié)點(diǎn)通過IEEE 802.15.14無線協(xié)議與邊界節(jié)點(diǎn)通信;邊界節(jié)點(diǎn)則使用PL2302 USB轉(zhuǎn)串口芯片與運(yùn)行MQTT-SN網(wǎng)關(guān)的無線路由器相連;運(yùn)行OpenWRT系統(tǒng)的路由器可與contiki節(jié)點(diǎn)組建一個(gè)網(wǎng)絡(luò),MQTT服務(wù)器通過網(wǎng)線或Wifi接入網(wǎng)關(guān)所在的局域網(wǎng)內(nèi);物聯(lián)網(wǎng)應(yīng)用程序可運(yùn)行在手機(jī)、電腦、開發(fā)板或其它平臺,也是通過網(wǎng)線或Wifi接入該局域網(wǎng),并與MQTT服務(wù)器通信,系統(tǒng)結(jié)構(gòu)如圖1所示.
網(wǎng)關(guān)選擇華為HG255D無線路由器作為硬件平臺,其處理器為MIPS架構(gòu)的Ralink RT3052,擁有4個(gè)Lan口、1個(gè)Wan口、一個(gè)USB接口.運(yùn)行OpenWRT系統(tǒng),可拓展路由器的功能,配合contiki物聯(lián)網(wǎng)節(jié)點(diǎn),共同完成本設(shè)計(jì).
圖1 系統(tǒng)結(jié)構(gòu)
Contiki傳感器與執(zhí)行器節(jié)點(diǎn)的處理器為意法半導(dǎo)體公司的STM32W108,該處理器采用了32位ARMCortex-M3內(nèi)核,其特點(diǎn)是低功耗、處理能力強(qiáng),該微控制器提供了豐富的GIPO接口,可以當(dāng)作連接外部設(shè)備的控制接口,如用于提供LED、按鍵、蜂鳴器接口,使節(jié)點(diǎn)具有豐富的人機(jī)交互與設(shè)備控制功能;STM32W108提供豐富外設(shè)接口如UART、ADC等.
OpenWRT是一個(gè)高度模塊化、高度自動(dòng)化的嵌入式Linux操作系統(tǒng),具有強(qiáng)大的網(wǎng)絡(luò)功能和擴(kuò)展能力.同時(shí),還提供了100多個(gè)軟件以供編譯選擇,而且數(shù)量還在不斷增加,其中包含支持IPv6的相關(guān)軟件.在同類的無線路由器固件系統(tǒng)中,OpenWRT在性能、穩(wěn)定性、可擴(kuò)展性方面的出色表現(xiàn),贏得眾多開發(fā)者的支持.是一個(gè)全功能的,易于擴(kuò)展的路由器操作系統(tǒng),成為在同類產(chǎn)品中最好的固件解決方案.由于OpenWRT系統(tǒng)擁有強(qiáng)大的可擴(kuò)展性,可以通過交叉編譯來運(yùn)行OpenWRT官方未提供的程序,以滿足用戶定制的需求.此外,Linux也為用戶提供了眾多的開源且免費(fèi)的軟件,基于此,本系統(tǒng)選擇OpenWRT作為網(wǎng)關(guān)的操作系統(tǒng).
在物聯(lián)網(wǎng)中,運(yùn)行contiki系統(tǒng)的無線傳感器與執(zhí)行器網(wǎng)絡(luò)的節(jié)點(diǎn)通過contiki邊界節(jié)點(diǎn)與外界通信,基于6LoWPAN的物聯(lián)網(wǎng)使用IPv6協(xié)議,因此在路由器上需有一個(gè)IPv6的網(wǎng)絡(luò)接口與之建立通信.在路由運(yùn)行contiki自帶的tunslip6程序,該程序執(zhí)行后會(huì)建立一個(gè)名為“tun0”的虛擬網(wǎng)卡.Tunslip6的作用是建立RPL邊界節(jié)點(diǎn)與tun0兩者之間相互通信的橋梁,給邊界路由器賦予IPv6網(wǎng)絡(luò)地址,例如aaaa::1/64,它的原理是在主機(jī)上為tun0 虛擬網(wǎng)卡配置網(wǎng)絡(luò)參數(shù)(虛擬網(wǎng)卡設(shè)備位于/dev/net/tun0,可以直接用程序讀寫該設(shè)備,tun0建立在數(shù)據(jù)鏈路層,所以讀寫內(nèi)容為IP數(shù)據(jù)包),邊界路由器(border-router)與主機(jī)之間通信使用的是slip協(xié)議,slip協(xié)議為一個(gè)串口IP協(xié)議,tunslip6程序中包含讀串口的代碼,可將讀到的內(nèi)容可以寫到tun0設(shè)備上,tunslip6程序中還包含讀tun0的代碼,可以將tun0讀到的內(nèi)容通過slip協(xié)議封裝后寫到串口,其原理可由圖2表示.
圖2 tunslip6原理
MQTT協(xié)議是為大量計(jì)算能力有限,且工作在低帶寬、不可靠的網(wǎng)絡(luò)的遠(yuǎn)程傳感器和控制設(shè)備通訊而設(shè)計(jì)的協(xié)議.使用消息發(fā)布/訂閱模式,提供一對多的消息發(fā)布,使用TCP/IP提供網(wǎng)絡(luò)連接,小型傳輸,開銷很小(固定長度的頭部是2字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量,使用Last Will和Testament特性通知有關(guān)各方客戶端異常中斷的機(jī)制以及“至多一次”、“至少一次”、“只有一次”三種消息發(fā)布服務(wù)質(zhì)量.
在MQTT協(xié)議中有發(fā)布者、訂閱者和代理(broker)三種角色,消息由發(fā)布者通過topic發(fā)布,由訂閱者對感興趣的topic進(jìn)行訂閱,一個(gè)發(fā)布者可以對應(yīng)多個(gè)訂閱者,一個(gè)訂閱者也可以訂閱多個(gè)topic,另外訂閱者也可以是發(fā)布者,發(fā)布者也可以是訂閱者,這樣就實(shí)現(xiàn)了“M2M”(Machine to Machine)的通信.Broker類似于信差的角色,主要作用就是接收信件并投遞給訂閱信件的人.如果訂閱者不在線,也就是說沒有connected to the broker,那么消息會(huì)保留,等訂閱者在線時(shí)推送.圖3為MQTT協(xié)議消息訂閱發(fā)布模型.
圖3 MQTT訂閱發(fā)布模型
MQTT是基于TCP/IP協(xié)議的,在無線傳感器網(wǎng)絡(luò)中,可以采用MQTT-SN (MQTT for Sensor Networks)協(xié)議進(jìn)行補(bǔ)充,它是為了資源受限硬件如傳感器設(shè)計(jì)的,能夠通過IEEE 802.15.4發(fā)送UDP數(shù)據(jù)包,再通過MQTT-SN網(wǎng)關(guān)與MQTT broker建立連接.MQTTSN的網(wǎng)關(guān)程序名為“mipsmqttsn”,負(fù)責(zé)處理tun0上的數(shù)據(jù),然后由 tun0轉(zhuǎn)發(fā)處理這些數(shù)據(jù).在運(yùn)行mipsmqttsn程序時(shí),需要MQTT服務(wù)器的IPv4地址作為參數(shù).應(yīng)用程序則與MQTT服務(wù)器直接通信.其工作原理可由圖5表示,圖4為物聯(lián)網(wǎng)網(wǎng)關(guān)設(shè)計(jì)系統(tǒng)結(jié)構(gòu)示意圖.
圖4 系統(tǒng)結(jié)構(gòu)
圖5 MQTT-SN訂閱發(fā)布交互模型
為了測試該設(shè)計(jì),我們搭建一個(gè)簡單的測試環(huán)境,邏輯如圖6所示.
其中,MQTT服務(wù)器運(yùn)行在Windows系統(tǒng),應(yīng)用程序運(yùn)行在Linux系統(tǒng)中;contiki節(jié)點(diǎn)連接光敏傳感器,路由器為運(yùn)行OpenWRT的物聯(lián)網(wǎng)網(wǎng)關(guān).Contiki光照節(jié)點(diǎn)捕獲光照數(shù)據(jù)后,將所獲取的光照數(shù)據(jù)以IPv6數(shù)據(jù)包形式通過無線射頻發(fā)送給邊界節(jié)點(diǎn),邊界節(jié)點(diǎn)通過串口將數(shù)據(jù)包傳輸?shù)轿锫?lián)網(wǎng)網(wǎng)關(guān),網(wǎng)關(guān)進(jìn)行協(xié)議轉(zhuǎn)換,轉(zhuǎn)換為IPv4數(shù)據(jù)包,發(fā)布到MQTT服務(wù)器,運(yùn)行在Linux中的QT程序向MQTT服務(wù)器訂閱該topic,服務(wù)器收到訂閱請求后,向訂閱者推送訂閱消息,組網(wǎng)測試實(shí)物連接如圖7所示.
圖6 測試環(huán)境邏輯框圖
圖7 測試環(huán)境實(shí)物圖
在該測試系統(tǒng)中,contiki節(jié)點(diǎn)采集光敏傳感器的數(shù)據(jù),并向服務(wù)器發(fā)布數(shù)據(jù);contiki邊界節(jié)點(diǎn)則負(fù)責(zé)contiki節(jié)點(diǎn)與tun0網(wǎng)卡間的相互通信.
測試步驟:
1)啟動(dòng) MQTT服務(wù)器 apache-activemq,運(yùn)行“apache-activemq-5.9.0inwin64”目錄中的 activemq.bat批處理文件,即可啟動(dòng)服務(wù)器.該服務(wù)器的IP地址即為PC的IP地址,通過開始→運(yùn)行→cmd→ipconfig來查看PC的IP地址.此時(shí),IP地址為192.168.1.141.
圖8 MQTT服務(wù)器IP地址
2)查看無線路由器是否掛載邊界節(jié)點(diǎn),若成功掛載上contiki的RPL邊界節(jié)點(diǎn),則會(huì)在/dev/目錄下找到名為“ttyUSB0”的設(shè)備文件.
3)運(yùn)行tunslip6命令生成tun0網(wǎng)卡:
tunslip6 -s/dev/ttyUSB0 aaaa::1/64 &
運(yùn)行tunslip6,該程序使用tun/tap網(wǎng)絡(luò)協(xié)議使USB口可以作為虛擬網(wǎng)接口使用,在這里是建立起Contiki邊界節(jié)點(diǎn)與tun0之間的相互通信,結(jié)果如圖9所示.
圖9 運(yùn)行tunslip6
啟動(dòng)成功后,建立了tun0的接口,tun0節(jié)點(diǎn)的ip為aaaa::1/64,程序與邊界節(jié)點(diǎn)交互,根據(jù)tun0的網(wǎng)段與邊界節(jié)點(diǎn)自身的mac地址,獲得邊界節(jié)點(diǎn)的IPv6 地址為“aaaa::280:e102:15:c635”.
4)成功啟動(dòng)tunslip6程序后,即可運(yùn)行MQTTSN協(xié)議的網(wǎng)關(guān)程序.在路由器的終端輸入命令mipsmqttsn-h “MQTT服務(wù)器IP地址”,結(jié)果如圖10所示.
圖10 運(yùn)行 mipsmqttsn
5)接入 contiki節(jié)點(diǎn),給 contiki節(jié)點(diǎn)上電,它將自動(dòng)與邊界節(jié)點(diǎn)組成6LoWPAN網(wǎng)絡(luò),根據(jù)邊界節(jié)點(diǎn)所處網(wǎng)段與節(jié)點(diǎn)自身mac地址,獲得一個(gè)與邊界節(jié)點(diǎn)處于同一網(wǎng)段的 IPv6 地址“aaaa::280:e102:15:cda5”,并開始向MQTT服務(wù)器發(fā)布光照強(qiáng)度的數(shù)據(jù).
圖11 Contiki節(jié)點(diǎn)串口信息
6)在Linux虛擬機(jī)中運(yùn)行一個(gè)Qt數(shù)據(jù)采集程序,該程序向MQTT服務(wù)器訂閱光照強(qiáng)度的數(shù)據(jù),如圖12所示.
圖12 Qt應(yīng)用程序界面
結(jié)果顯示,該Qt程序能從MQTT服務(wù)器上獲取相應(yīng)的數(shù)據(jù).
在選擇物聯(lián)網(wǎng)網(wǎng)關(guān)的嵌入式設(shè)備與操作系統(tǒng)的過程中,我們曾考慮使用各種ARM嵌入式開發(fā)板,我們分別嘗試過運(yùn)行Arm-Linux的Tiny210、Mini2440開發(fā)板,最后選擇了支持帶USB接口并支持OpenWRT的無線路由器.因?yàn)橐笰RM開發(fā)板支持IPv6,就需要重新編譯內(nèi)核、新增相關(guān)模塊如tun/tap、IPv6以及各種硬件驅(qū)動(dòng),如果希望該網(wǎng)關(guān)提供無線熱點(diǎn)功能,還需要增加并驅(qū)動(dòng)無線網(wǎng)卡,配置并交叉編譯HostAP,步驟繁瑣復(fù)雜.而提供USB接口的無線路由器可以方便連接contiki IPv6邊界路由節(jié)點(diǎn),并且OpenWRT提供官方固件,各項(xiàng)內(nèi)核模塊以及相關(guān)硬件驅(qū)動(dòng)(如USB串口驅(qū)動(dòng))均可通過“opkg install xxx”命令在線安裝(opkg是一個(gè)輕量快速的套件管理系統(tǒng),目前已成為Opensource界嵌入式系統(tǒng)標(biāo)準(zhǔn).常用于路由、交換機(jī)等嵌入式設(shè)備中,用來管理軟件包的安裝升級與下載).更重要的是無線路由器本身就板載無線Wifi模塊,并完美驅(qū)動(dòng)可作為無線熱點(diǎn)AP使用,此外OpenWRT提供的WEB配置界面方便用戶配置各種網(wǎng)絡(luò)參數(shù).
在選擇MQTT服務(wù)器方面,當(dāng)前流行的開源MQTT代理服務(wù)器(MQTT Broker)的實(shí)現(xiàn)有:Mosquitto、HiveMQ、Apache ActiveMQ、RabbitMQ、Apollo、RSMB等.MQTT客戶端也有不同操作系統(tǒng)和編程語言的實(shí)現(xiàn),流行的客戶端庫有:Eclipse Paho(支持C、C++、Java、JavaScript、Python、Go、C#),M2MQTT(C#),FusesourceMQTTClient(Java),MQTT.js(javascript),libmosquitto(c/c++)等等,我們使用了Apache ActiveMQ作為MQTT服務(wù)器;由于contiki的應(yīng)用程序使用C語言開發(fā),在MQTT客戶端的開發(fā)也采用了基于Mosquitto庫來開發(fā)客戶端.
本設(shè)計(jì)是為解決物聯(lián)網(wǎng)中無線傳感器與執(zhí)行器網(wǎng)絡(luò)與傳統(tǒng)互聯(lián)網(wǎng)的接入網(wǎng)關(guān)問題,通過部署MQTTSN協(xié)議,使無線傳感器與執(zhí)行器網(wǎng)絡(luò)的各節(jié)點(diǎn)具備訂閱/發(fā)布的功能,通過移植MQTT-SN協(xié)議的網(wǎng)關(guān)程序到OpenWRT系統(tǒng)上,并與MQTT服務(wù)器相連,再加入自行開發(fā)的C/C++ Linux應(yīng)用程序,即可構(gòu)成一個(gè)簡單、實(shí)用的IPv6物聯(lián)網(wǎng)應(yīng)用系統(tǒng).
無線傳感與執(zhí)行器網(wǎng)絡(luò)的各節(jié)點(diǎn)采用IPv6協(xié)議,打破了傳統(tǒng)的IPv4物聯(lián)網(wǎng)格局,增大了地址量、增強(qiáng)了安全性.外部終端通過有線無線均可接入,使底層物聯(lián)網(wǎng)的控制變得更方便,具有一定的實(shí)際應(yīng)用意義與推廣價(jià)值.
但本次的設(shè)計(jì)也存在一些不足,如未將MQTT服務(wù)器架設(shè)到Internet上,以實(shí)現(xiàn)真正意義上的遠(yuǎn)程控制物聯(lián)網(wǎng),如果將MQTT服務(wù)器架設(shè)到Internet上,將能實(shí)現(xiàn)遠(yuǎn)程推送服務(wù),增強(qiáng)物聯(lián)網(wǎng)應(yīng)用系統(tǒng)的實(shí)用功能.
1互聯(lián)網(wǎng).物聯(lián)網(wǎng)網(wǎng)關(guān)總結(jié).http://wenku.baidu.com/link?url=R847CuPuArEW4ErfZwkV_yYoLBfVyjjhdgvK0sZGvignP6 wYik-GiG_DQ6TNES011Hx8wNn-N-CyLAbBfS1KRAr SntR1nr549XYjoBJQwwe.[2015-01-29].
2互聯(lián)網(wǎng).MQTT.http://baike.baidu.com/link?url=DEeX5Hzg ZIOlxUTy2w5VjX2e__WcmkRmQxr7iXg_prTVM-1dU0JRtdPu8HbsHAXMtW2sVaOiDdRr9BzIWf9Uw_.[2016-08-01].
3陳旖,張美平,許力.WSN應(yīng)用層協(xié)議MQTT-SN與CoAP的剖析與改進(jìn).計(jì)算機(jī)系統(tǒng)應(yīng)用,2015,24(2):229-234.