張美平,丁文才,許友澤
(福建師范大學 數學與計算機科學學院,福州 350007)
隨著科學技術的發展,信息技術的進步,我們正逐漸的從互聯網向物聯網邁進.物聯網就是物物相連的互聯網,是新一代信息技術的重要組成部分,也是“信息化”時代的重要階段.
物聯網技術在現代農業中的應用,對提高農業的生產管理水平效果顯著.搭建一個智能農業大棚系統模擬系統,監測環境數據,探究溫度、濕度、光強等環境因素對農作物的影響.采集節點采用移植了Contiki操作系統的傳感器,該操作系統支持6LoWPAN協議,該協議是IPv6在無線傳感網的一種實現,為使傳感器節點接入網絡,與現有的IPv4融合,需要設計移植一個支持IPv6的嵌入式設備作為物聯網接入網關.
物聯網網關,作為一個新的名詞,在未來的物聯網時代將會扮演非常重要的角色,它將成為連接物聯網與互聯網的紐帶.作為網關設備,物聯網網關可以實現物聯網與通信網絡以及不同類型無線傳感器與執行器網絡之間的協議轉換設備.既可以實現廣域互聯,也可以實現局域互聯[1].對于使用IPv6的無線傳感器與執行器網絡的設備來說,如果要跟互聯網上的設備終端進行連接,那就必須經過協議轉換才能做到,但由于自身性能的限制,而不能自行進行協議轉換,若在傳統的無線路由器上,結合開源無線路由操作系統OpenWRT,將其作為網關設備,就能實現與互聯網的無縫連接.
本網關是在OpenWRT無線路由器上部署MQTTMQTT-SN協議,以實現無線傳感器與執行器網絡與傳統通信網絡的無縫連接.消息隊列遙測傳輸(Message Queuing Telemetry Transport,MQTT)是IBM開發基于消息發布與訂閱機制的即時通訊協議,有可能成為物聯網的重要組成部分.該協議支持大部分的嵌入式系統平臺,幾乎可以把大部分的物聯網硬件和外部網絡連接起來,通常被用來當做傳感器和執行器(比如通過Twitter讓房屋聯網)的通信協議[2].MQTT-SN協議是MQTT針對無線傳感器網絡(Wireless Sensor Networks,WSN)的拓展.MQTT-SN的運行需要依賴于已部署MQTT協議的網絡.MQTT-SN協議中有兩個角色:節點(Node)和網關(GW).WSN節點通過MQTT-SN協議與網關交互,網關進行協議轉換之后使節點接入MQTT服務器.由于MQTT-SN協議運行需要依賴于MQTT協議,下文使用MQTT-SN協議泛指MQTTMQTT-SN的組合[3].
本文提出的IPv6物聯網接入網關將IPv6無線傳感網與現有的IPv4網絡相融合,進行協議轉換.底層的物聯網使用部署了MQTT-SN協議的contiki節點,這些節點通過IEEE 802.15.14無線協議與邊界節點通信;邊界節點則使用PL2302 USB轉串口芯片與運行MQTT-SN網關的無線路由器相連;運行OpenWRT系統的路由器可與contiki節點組建一個網絡,MQTT服務器通過網線或Wifi接入網關所在的局域網內;物聯網應用程序可運行在手機、電腦、開發板或其它平臺,也是通過網線或Wifi接入該局域網,并與MQTT服務器通信,系統結構如圖1所示.
網關選擇華為HG255D無線路由器作為硬件平臺,其處理器為MIPS架構的Ralink RT3052,擁有4個Lan口、1個Wan口、一個USB接口.運行OpenWRT系統,可拓展路由器的功能,配合contiki物聯網節點,共同完成本設計.

圖1 系統結構
Contiki傳感器與執行器節點的處理器為意法半導體公司的STM32W108,該處理器采用了32位ARMCortex-M3內核,其特點是低功耗、處理能力強,該微控制器提供了豐富的GIPO接口,可以當作連接外部設備的控制接口,如用于提供LED、按鍵、蜂鳴器接口,使節點具有豐富的人機交互與設備控制功能;STM32W108提供豐富外設接口如UART、ADC等.
OpenWRT是一個高度模塊化、高度自動化的嵌入式Linux操作系統,具有強大的網絡功能和擴展能力.同時,還提供了100多個軟件以供編譯選擇,而且數量還在不斷增加,其中包含支持IPv6的相關軟件.在同類的無線路由器固件系統中,OpenWRT在性能、穩定性、可擴展性方面的出色表現,贏得眾多開發者的支持.是一個全功能的,易于擴展的路由器操作系統,成為在同類產品中最好的固件解決方案.由于OpenWRT系統擁有強大的可擴展性,可以通過交叉編譯來運行OpenWRT官方未提供的程序,以滿足用戶定制的需求.此外,Linux也為用戶提供了眾多的開源且免費的軟件,基于此,本系統選擇OpenWRT作為網關的操作系統.
在物聯網中,運行contiki系統的無線傳感器與執行器網絡的節點通過contiki邊界節點與外界通信,基于6LoWPAN的物聯網使用IPv6協議,因此在路由器上需有一個IPv6的網絡接口與之建立通信.在路由運行contiki自帶的tunslip6程序,該程序執行后會建立一個名為“tun0”的虛擬網卡.Tunslip6的作用是建立RPL邊界節點與tun0兩者之間相互通信的橋梁,給邊界路由器賦予IPv6網絡地址,例如aaaa::1/64,它的原理是在主機上為tun0 虛擬網卡配置網絡參數(虛擬網卡設備位于/dev/net/tun0,可以直接用程序讀寫該設備,tun0建立在數據鏈路層,所以讀寫內容為IP數據包),邊界路由器(border-router)與主機之間通信使用的是slip協議,slip協議為一個串口IP協議,tunslip6程序中包含讀串口的代碼,可將讀到的內容可以寫到tun0設備上,tunslip6程序中還包含讀tun0的代碼,可以將tun0讀到的內容通過slip協議封裝后寫到串口,其原理可由圖2表示.

圖2 tunslip6原理
MQTT協議是為大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議.使用消息發布/訂閱模式,提供一對多的消息發布,使用TCP/IP提供網絡連接,小型傳輸,開銷很小(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量,使用Last Will和Testament特性通知有關各方客戶端異常中斷的機制以及“至多一次”、“至少一次”、“只有一次”三種消息發布服務質量.
在MQTT協議中有發布者、訂閱者和代理(broker)三種角色,消息由發布者通過topic發布,由訂閱者對感興趣的topic進行訂閱,一個發布者可以對應多個訂閱者,一個訂閱者也可以訂閱多個topic,另外訂閱者也可以是發布者,發布者也可以是訂閱者,這樣就實現了“M2M”(Machine to Machine)的通信.Broker類似于信差的角色,主要作用就是接收信件并投遞給訂閱信件的人.如果訂閱者不在線,也就是說沒有connected to the broker,那么消息會保留,等訂閱者在線時推送.圖3為MQTT協議消息訂閱發布模型.

圖3 MQTT訂閱發布模型
MQTT是基于TCP/IP協議的,在無線傳感器網絡中,可以采用MQTT-SN (MQTT for Sensor Networks)協議進行補充,它是為了資源受限硬件如傳感器設計的,能夠通過IEEE 802.15.4發送UDP數據包,再通過MQTT-SN網關與MQTT broker建立連接.MQTTSN的網關程序名為“mipsmqttsn”,負責處理tun0上的數據,然后由 tun0轉發處理這些數據.在運行mipsmqttsn程序時,需要MQTT服務器的IPv4地址作為參數.應用程序則與MQTT服務器直接通信.其工作原理可由圖5表示,圖4為物聯網網關設計系統結構示意圖.

圖4 系統結構

圖5 MQTT-SN訂閱發布交互模型
為了測試該設計,我們搭建一個簡單的測試環境,邏輯如圖6所示.
其中,MQTT服務器運行在Windows系統,應用程序運行在Linux系統中;contiki節點連接光敏傳感器,路由器為運行OpenWRT的物聯網網關.Contiki光照節點捕獲光照數據后,將所獲取的光照數據以IPv6數據包形式通過無線射頻發送給邊界節點,邊界節點通過串口將數據包傳輸到物聯網網關,網關進行協議轉換,轉換為IPv4數據包,發布到MQTT服務器,運行在Linux中的QT程序向MQTT服務器訂閱該topic,服務器收到訂閱請求后,向訂閱者推送訂閱消息,組網測試實物連接如圖7所示.

圖6 測試環境邏輯框圖

圖7 測試環境實物圖
在該測試系統中,contiki節點采集光敏傳感器的數據,并向服務器發布數據;contiki邊界節點則負責contiki節點與tun0網卡間的相互通信.
測試步驟:
1)啟動 MQTT服務器 apache-activemq,運行“apache-activemq-5.9.0inwin64”目錄中的 activemq.bat批處理文件,即可啟動服務器.該服務器的IP地址即為PC的IP地址,通過開始→運行→cmd→ipconfig來查看PC的IP地址.此時,IP地址為192.168.1.141.

圖8 MQTT服務器IP地址
2)查看無線路由器是否掛載邊界節點,若成功掛載上contiki的RPL邊界節點,則會在/dev/目錄下找到名為“ttyUSB0”的設備文件.
3)運行tunslip6命令生成tun0網卡:
tunslip6 -s/dev/ttyUSB0 aaaa::1/64 &
運行tunslip6,該程序使用tun/tap網絡協議使USB口可以作為虛擬網接口使用,在這里是建立起Contiki邊界節點與tun0之間的相互通信,結果如圖9所示.

圖9 運行tunslip6
啟動成功后,建立了tun0的接口,tun0節點的ip為aaaa::1/64,程序與邊界節點交互,根據tun0的網段與邊界節點自身的mac地址,獲得邊界節點的IPv6 地址為“aaaa::280:e102:15:c635”.
4)成功啟動tunslip6程序后,即可運行MQTTSN協議的網關程序.在路由器的終端輸入命令mipsmqttsn-h “MQTT服務器IP地址”,結果如圖10所示.

圖10 運行 mipsmqttsn
5)接入 contiki節點,給 contiki節點上電,它將自動與邊界節點組成6LoWPAN網絡,根據邊界節點所處網段與節點自身mac地址,獲得一個與邊界節點處于同一網段的 IPv6 地址“aaaa::280:e102:15:cda5”,并開始向MQTT服務器發布光照強度的數據.

圖11 Contiki節點串口信息
6)在Linux虛擬機中運行一個Qt數據采集程序,該程序向MQTT服務器訂閱光照強度的數據,如圖12所示.

圖12 Qt應用程序界面
結果顯示,該Qt程序能從MQTT服務器上獲取相應的數據.
在選擇物聯網網關的嵌入式設備與操作系統的過程中,我們曾考慮使用各種ARM嵌入式開發板,我們分別嘗試過運行Arm-Linux的Tiny210、Mini2440開發板,最后選擇了支持帶USB接口并支持OpenWRT的無線路由器.因為要使ARM開發板支持IPv6,就需要重新編譯內核、新增相關模塊如tun/tap、IPv6以及各種硬件驅動,如果希望該網關提供無線熱點功能,還需要增加并驅動無線網卡,配置并交叉編譯HostAP,步驟繁瑣復雜.而提供USB接口的無線路由器可以方便連接contiki IPv6邊界路由節點,并且OpenWRT提供官方固件,各項內核模塊以及相關硬件驅動(如USB串口驅動)均可通過“opkg install xxx”命令在線安裝(opkg是一個輕量快速的套件管理系統,目前已成為Opensource界嵌入式系統標準.常用于路由、交換機等嵌入式設備中,用來管理軟件包的安裝升級與下載).更重要的是無線路由器本身就板載無線Wifi模塊,并完美驅動可作為無線熱點AP使用,此外OpenWRT提供的WEB配置界面方便用戶配置各種網絡參數.
在選擇MQTT服務器方面,當前流行的開源MQTT代理服務器(MQTT Broker)的實現有:Mosquitto、HiveMQ、Apache ActiveMQ、RabbitMQ、Apollo、RSMB等.MQTT客戶端也有不同操作系統和編程語言的實現,流行的客戶端庫有:Eclipse Paho(支持C、C++、Java、JavaScript、Python、Go、C#),M2MQTT(C#),FusesourceMQTTClient(Java),MQTT.js(javascript),libmosquitto(c/c++)等等,我們使用了Apache ActiveMQ作為MQTT服務器;由于contiki的應用程序使用C語言開發,在MQTT客戶端的開發也采用了基于Mosquitto庫來開發客戶端.
本設計是為解決物聯網中無線傳感器與執行器網絡與傳統互聯網的接入網關問題,通過部署MQTTSN協議,使無線傳感器與執行器網絡的各節點具備訂閱/發布的功能,通過移植MQTT-SN協議的網關程序到OpenWRT系統上,并與MQTT服務器相連,再加入自行開發的C/C++ Linux應用程序,即可構成一個簡單、實用的IPv6物聯網應用系統.
無線傳感與執行器網絡的各節點采用IPv6協議,打破了傳統的IPv4物聯網格局,增大了地址量、增強了安全性.外部終端通過有線無線均可接入,使底層物聯網的控制變得更方便,具有一定的實際應用意義與推廣價值.
但本次的設計也存在一些不足,如未將MQTT服務器架設到Internet上,以實現真正意義上的遠程控制物聯網,如果將MQTT服務器架設到Internet上,將能實現遠程推送服務,增強物聯網應用系統的實用功能.
1互聯網.物聯網網關總結.http://wenku.baidu.com/link?url=R847CuPuArEW4ErfZwkV_yYoLBfVyjjhdgvK0sZGvignP6 wYik-GiG_DQ6TNES011Hx8wNn-N-CyLAbBfS1KRAr SntR1nr549XYjoBJQwwe.[2015-01-29].
2互聯網.MQTT.http://baike.baidu.com/link?url=DEeX5Hzg ZIOlxUTy2w5VjX2e__WcmkRmQxr7iXg_prTVM-1dU0JRtdPu8HbsHAXMtW2sVaOiDdRr9BzIWf9Uw_.[2016-08-01].
3陳旖,張美平,許力.WSN應用層協議MQTT-SN與CoAP的剖析與改進.計算機系統應用,2015,24(2):229-234.