綦聲波,吳學英
(中國海洋大學 工程學院,山東 青島 266100)
我國沿海地區受臺風、海浪、風暴潮、海冰等多種災害影響,是世界上海洋災害最嚴重的國家之一。開發沿海環境數據采集和管理系統并為海洋災害預警提供數據資源,已經成為海洋開發、防災減災等戰略部署和社會發展的迫切需要。而沿海海洋自動監測臺站網絡則是海洋環境監測系統中重要的一環。
目前海洋臺站監測系統尚未形成有效的共享機制,往往自成體系,實時海洋信息監測和智能預警在國內的研究也相對滯后。為更好實現海洋信息數據資源共享,王振東[1]基于ARM7+uLinux設計了海洋臺站自動觀測系統,使用GPRS與監測中心站進行數據通信;秦明慧[2]設計了一套基于JSP的海洋臺站數據動態發布系統,較好實現了海洋氣象數據的動態發布。上述研究雖然部分實現了數據的共享,但仍存在著現場復雜、開發成本高等問題。
本文將無線傳感器網絡和Web數據庫技術結合,設計了一套可應用于海洋臺站的自動監測系統,該系統由6LoWPAN無線傳感器采集子系統與云數據庫存儲子系統組成,利用低速無線個域網的優點搭建了數據信息采集系統,前端結合PHP,數據庫技術,不但實現了海洋信息參數的網絡存儲,實時發布,而且具有節點功耗低、成本低、傳感器可動態添加等特點。
綜合性的海洋臺站監測系統是一個集海洋監測、數據收集、數據處理、產品對外發布于一體的監測系統。如圖1所示,本文設計的監測系統主要由搭建在海洋臺站的無線傳感器參數采集網絡與通過以太網連接的云服務器及數據存儲系統組成。
在傳感器網絡中,各傳感器由于安裝位置不同,例如,《海濱觀測規范》中對風參數測量的周邊環境、安裝高度都有特殊的要求,與潮位、鹽度等水文參數測量地點往往距離較遠,現場布線安裝要求較高。針對上述問題,選用了6LoWPAN無線個域網搭建傳感器參數采集網絡,這些無線節點運行于精簡、低功耗的6LoWPAN網絡協議棧之上,上電后自動讀取節點MAC地址,并自動配置好所需的IPv6地址。傳感器采集到的監測數據如氣象參數、水文參數數據等通過多跳組網的方式發送到邊界路由進行數據的轉發,最后接入互聯網,將數據存儲到數據庫中,管理用戶與普通用戶可通過Web端訪問。采用上述設計方案,不但省去了布線問題,而且可以實現對氣象水文參數信息的實時共享。
6LoWPAN無線傳感器網絡由負責采集數據的傳感器節點與負責數據轉發的邊界路由節點組成。基于海洋環境復雜多變性與傳感器接口多樣性的特點,節點嵌入式處理器需滿足性能穩定、功耗小、處理能力強等需求,本文選用了TI公司的CC2538,該芯片基于ARM Cortex-M3內核,具備高達32 KB的片上RAM和高達512 KB的片上閃存,提供了2個 UART,2 個 SPI,1 個 I2C 接口,內置 2.4 GHz IEEE 802.15.4 兼容 RF 收發器,在睡眠模式下電流僅為 1.3 μA。
在考慮低成本,低功耗,易拓展等因素之后,傳感器節點與邊界路由采用模塊化設計,以方便針對不同應用場合自由增減,如圖2所示。節點由電源模塊,采集模塊與網絡模塊三部分組成,傳感器節點與邊界路由節點在硬件設計上基本相同,不同之處在于傳感器節點可以實現無線自組網,故較之邊界路由節點去掉了網絡模塊。
無線傳感器節點需在無人管理的情況下連續運行,本文設計了太陽能電池板與蓄電池供電的電源模塊,保證了傳感器節點穩定長時間工作,同時本文還通過降低節點能耗和傳輸能耗實現了低功耗。
(1)傳感器節點基于Contiki操作系統,該操作系統和ProtoThreads輕量級線程模型和事件機制完美結合,ProtoThreads輕量級線程的使用使得系統占用內存極小,而事件驅動內核機制則降低了系統的功耗;MAC層采用ContikiMAC RDC機制,在該機制的作用下,節點工作占空比低于1%,大部分時間下都處于休眠狀態,整體上降低了節點能耗。
(2)傳感器節點運行6LoWPAN中的精簡IPv6協議棧,可將IPv6頭部壓縮到4 byte,極大地降低了傳感器節點的數據傳輸量;網絡層基于RPL路由協議,通過使用目標函數和度量集合構建一種類似樹形拓撲圖,確立最優路徑,從而減少數據在整個傳感器網絡中的傳輸能耗[4]。
云技術目前在網絡服務中已得到廣泛運用,云技術采用分布式架構,可以根據數據的規模來靈活伸縮和擴大。在海洋臺站快速增加時,可以非常方便地通過增加云服務器規模來迅速滿足功能需求。為匹配云服務系統的可拓展性,服務器語言架構必須具有高度的拓展性,本文選用了純開源,支持分布式部署,能支持數百萬甚至更高的并發連接的Workerman服務器框架作為云服務系統的研發技術棧。
云服務系統為監測系統提供后端支持,主要功能包括與無線傳感器通訊,數據存儲,與監測用戶Web端實時傳輸數據等。本文基于Workerman框架,設計了用于監聽處理硬件數據的UDP服務器,用于與用戶Web端保持長連接的Websocket服務器,用于之前實現發布-訂閱的推送服務器,服務器架構如圖3所示。Master Workerman服務是Workerman框架中的主進程,以守護進程的形式運行,自動檢查服務器環境,創建并管理自定義的UDP、WebSocket、推送服務器。

圖3 云服務器架構設計
無線傳感器節點為了達到低功耗需求,需長時間處于休眠狀態,無法采用長連接的方式,因此選用了UDP數據傳輸方式。云服務器接收無線傳感器節點發送的數據包時,搭建了UDP服務器進程來實時監聽端口,以便數據包到達時能及時接收。UDP數據包在傳輸過程中有可能丟失或者錯誤,在數據接收之后對數據進行校驗,確定數據包的完整性,校驗正確之后進行下一步的數據存儲工作。基于上述設計,關鍵偽代碼如下:
$udp=new UDP(udp://localhost');
//創建UDP服務
$udp->port=9090;
//指定UDP端口
$ws_worker->onMessage($data)
{
//當有UDP數據包到來時調用
Check($data)//數據校驗
Dump($data)//數據解析
}
接收并解析無線傳感器節點發來的數據包之后,將數據按照一定的格式及時存儲在數據庫中便于后續使用。基于數據分析可實現數據的報表顯示、歷史數據查詢、數據走勢曲線、實時預警等功能。
根據現場無線傳感器的實際情況,設計兩個字段(TYPE與ID)來區分不同傳感器類型與不同地區的同類傳感器。為了減小網絡數據包的大小,數據被整合為一條字符串。為節省現場開支,根據數據包到達服務器的時間,服務器以時間戳的方式存儲到達時間。基于上述描述,數據字符串設計如表1所示。

表1 數據字符串設計
字段以逗號隔開,DATA中不同參數以‘|’分割,以西安中銘電氣有限公司的WXA100-06M六合一氣象傳感器為例,一條典型的數據如下:
0x0A,0x00,22.6|30.3|10.7|244.2|957.7|101.9,1477550996
在接收到無線傳感器節點的數據之后,云服務器首先需要調用與數據庫之間的連接,然后將數據插入數據庫。關鍵偽代碼如下:
//數據解析之后
$con->connect(mysql)
//云服務連接數據庫
mysql->query(insert$data)
//執行插入數據庫語句
$con->disconnect()
//操作完畢后關閉連接
3.3.1 Websocket服務器設計 WebSocket是 HTML5一種新的協議,它實現了瀏覽器與服務器全雙工通信,可以非常方便地實現跨平臺。而且該協議具有實時性,可以保證監測系統用戶的實時使用。為保證監測用戶端與服務器保持長連接,服務器建立了一個監聽接口,來管理Websocket客戶端的連接。通訊方案實現關鍵偽代碼如下:
$ws=new ws("ws://localhost");
//建立 WebSocket服務
$ws->port=9292
//指定WebSocket監聽端口
$ws->onWebSocketConnect()
//有連接時進行連接握手
$ws->onMessage()
//連接上后進行其他操作
用戶端發出查詢數據請求,WebSocket服務器根據用戶發送來的查詢指令通過數據庫進行查詢,并將結果反饋給用戶。關鍵偽代碼如下:
$con->connect(mysql)
//云服務連接數據庫
mysql->query(selecet$data)
//執行查詢數據庫語句并返回數據
$con->disconnect()
//操作完畢后關閉連接
3.3.2 長連接的斷線重連心跳機制 本文引入了心跳機制用于解決長時間連接過程中意外發生的斷線與斷線重連問題,以保證用戶意外斷線后系統能夠自動重連恢復工作。客戶端定時給服務器發送固定心跳包,避免連接由于長時間沒有通訊而被某些節點的防火墻關閉導致連接斷開的情況發生。服務端可以通過心跳包來判斷客戶端是否在線,如果客戶端在規定時間內沒有發來任何心跳包,就認定客戶端意外下線,發起重連。實現關鍵偽代碼如下:
//設置心跳間隔25 s
$HEARTBEAT_TIME=25
//設置一個lastMTime,用來記錄上次收到消息的時間
$connection->lastMTime=time()
//記錄時間
//進程啟動后設置一個每秒運行一次的定時器
$ws->onStart($connection)
{
//若該connection還沒收到過消息,則lastMTime設置為當前時間
if(empty($connection->lastMTime))
{
$connection->lastMTime=$time_now;continue;
}
//上次通訊時間間隔大于心跳間隔,則認為客戶端已經下線,關閉連接
if($time_now-$connection->lastMTime
>HEARTBEAT_TIME)
{
$connection->close();
}
}
3.3.3 推送服務器設計 本文設計推送服務器負責保持與UDP和Websocket服務器的長連接,Websocket服務器向推送服務器訂閱UDP服務器“消息到達”的事件,當UDP服務器接收到氣象數據時,向訂閱服務器發布“消息到達”消息,推送服務器將該消息推送給Websocket服務器。通過上述設計實現了無線傳感器節點與用戶的實時通訊。關鍵偽代碼如下:
Chanel_Server=new ChannelServer();//創建推送服務器
ChannelServer()::on{}
//收到廣播后向訂閱該事件的客戶端發送
ChannelClient::on($udp){}
//收到無線傳感器端的數據后向推送服務器廣播
ChannelClient::on($ws){}
//訂閱“收到無線傳感器端的數據”事件
//當收到無線傳感器端數據的時候會收到來自推送服務器的廣播
為了驗證本文設計的監測系統的有效性,搭建包含水文參數采集節點和氣象參數節點的無線傳感網絡,設備實物如圖4所示。
以上節點通過多跳組網將數據發送至服務器,服務器同步推送至Web端,此時瀏覽器顯示界面如圖5所示。當用戶點擊主界面的左側按鈕選擇“表層海水溫度”一項,將進入下一層菜單(即為該單一數據的詳細界面)。在“表層海水溫度”單一界面中,用戶可選擇查看當天數據、最近7 d數據、最近1個月數據、最近1 a數據等內容,Web端會根據用戶需求通過服務器訪問數據庫調取對應時間數據顯示在表層海水溫度單一數據折線圖6中。

圖4 設備實物圖

圖5 多節點Web端顯示界面

圖6 表層海水溫度單一數據折線圖
用戶可以通過具體時間區間的折線圖,直觀地觀察海洋平臺附近海水表層溫度的變化趨勢。同時,數據折線圖底部也支持拖動來縮放時間軸,用戶可以操作并獲得更短時間內海水表層溫度的變化趨勢,保證所需數據在某一時間段的精確性和適用性。
上述圖示結果證明本系統能夠及時準確地接收傳感器數據,并同步推送至Web端,實現了環境參數的動態添加以及數據在網絡的動態發布及數據處理。
本文設計了一種基于6LoWPAN的近海環境監測系統,針對目前海洋臺站監測系統共享渠道差,現場搭建成本較高等問題,將低速無線個域網的成本低、組網靈活、易拓展的優點引入到環境監測當中,提出了一種可行的解決方案。實驗結果表明了設計的有效性。
[1]王振東.基于ARM的海洋臺站自動觀測系統的設計[D].青島:中國海洋大學,2009.
[2]秦明慧,李平,戴永壽,等.海洋臺站數據管理及動態發布系統的設計[J].海洋預報,2010,03:66-71.
[3]李立立.基于海洋臺站和浮標的近海海洋觀測系統現狀與發展研究[D].青島:中國海洋大學,2010.
[4]王靜涵.基于Contiki操作系統的RPL路由協議能耗均衡的研究[D].蘭州:蘭州大學,2015.
[5]G Oikonomou,I Phillips.Stateless multicast forwarding with RPL in 6LoWPAN sensor networks[C]//Proceedings of IEEE International Conference on Pervasive Computing and Communications Workshops,2012:272-277.
[6]何世鈞,陳中華,張雨,等.基于物聯網的海洋環境監測系統的研究[J].傳感器與微系統,2011,03:13-15.
[7]盛平,丁波.基于WebSocket協議的智能溫室測控系統設計與實現[J].軟件導刊,2016,08:65-68.
[8]王曉喃,殷旭東.基于6LoWPAN無線傳感器網絡的農業環境實時監控系統[J].農業工程學報,2010,10:224-228.
[9]袁紅春,汪辰,梅海彬.一種適用于近海環境監測的WSNs節點設計方法[J].傳感器與微系統,2015,04:85-88.
[10]M Jung,P Raich,W Kastner.The relevance and impact of IPv6 multicasting for Wireless Sensor and Actuator Networks based on 6LoWPAN and constrained RESTful environments[C]//2014 International Conference on the Internet of Things(IOT),Oct.2014.