李 穎,楊光松,郭文靜,康雙全
(1.集美大學(xué)誠毅學(xué)院, 福建 廈門 361021; 2.集美大學(xué) 信息工程學(xué)院, 福建 廈門 361021)
海洋是地球可持續(xù)發(fā)展的重要戰(zhàn)略資源,海洋資源的保護(hù)、開發(fā)和利用離不開海洋監(jiān)測高技術(shù)的支持。海洋監(jiān)測技術(shù)包括海洋環(huán)境的監(jiān)測、預(yù)測和預(yù)警,涉及能源、信息、電子、通信、材料等多學(xué)科,對海洋的防災(zāi)減災(zāi)、生態(tài)監(jiān)測、資源開發(fā)、軍事安防等提供服務(wù)[1]。目前海洋監(jiān)測技術(shù)已實現(xiàn)立體監(jiān)測,完成在線監(jiān)測和災(zāi)害預(yù)警等功能,但存在采集信息穩(wěn)定性不足、精度低、傳輸和處理能力局限等問題[2]。
本文設(shè)計實現(xiàn)了一種基于ZigBee[3-9]的海洋監(jiān)控系統(tǒng),在水面、水下高密度布置節(jié)點并自組構(gòu)建無線傳感網(wǎng)絡(luò),可以提供實時監(jiān)控,具備功耗低、距離短、通信穩(wěn)定、成本低等特點,在一定程度上彌補海洋監(jiān)測手段的不足。
首先,基于NodeMCU微控制器和CC2530[10]的ZigBee芯片[11-12]設(shè)計了無線傳感節(jié)點,通過ESP8266 Wi-Fi模塊或USB串口模塊,實現(xiàn)協(xié)調(diào)器與數(shù)據(jù)處理中心的信息傳遞,完成系統(tǒng)硬件框架的搭建。其次,完成數(shù)據(jù)采集部分的軟件設(shè)計[13],通過UDP Socket嵌套字,實現(xiàn)傳感器數(shù)據(jù)遠(yuǎn)程采集的功能。使用node.js技術(shù)和串口,實現(xiàn)傳感器數(shù)據(jù)本地采集的功能。最后,完成數(shù)據(jù)展示部分的設(shè)計,使用Vue.js前端框架進(jìn)行前端頁面開發(fā),基于WEB實現(xiàn)跨設(shè)備的訪問和瀏覽。經(jīng)實際測試證明,系統(tǒng)可以通過ZigBee終端節(jié)點定時采集傳感器數(shù)據(jù),通過ZigBee拓?fù)鋫鬏數(shù)絽f(xié)調(diào)器節(jié)點,然后通過有線或者無線的方式,將數(shù)據(jù)傳輸?shù)奖镜鼗蛘咄競鞯竭h(yuǎn)程的服務(wù)器,完成采集工作[14]。在后臺分析采集數(shù)據(jù),加入到相應(yīng)的數(shù)據(jù)庫中。最后,使用web界面展示所采集的數(shù)據(jù),完成跨設(shè)備的實時數(shù)據(jù)展示和查詢。
本系統(tǒng)原理圖如圖1所示,傳感節(jié)點采集數(shù)據(jù)后送到傳輸路由器,然后由路由器轉(zhuǎn)發(fā)至協(xié)調(diào)器,最后上傳至服務(wù)器。用戶可以通過PC機或者手機等移動終端,通過WEB的形式查看其統(tǒng)計數(shù)據(jù),實現(xiàn)環(huán)境對海洋環(huán)境的監(jiān)控[15]。
圖1 系統(tǒng)原理
系統(tǒng)結(jié)構(gòu)由3部分組成:
第1部分是硬件感測模塊,主要由ZigBee采集節(jié)點構(gòu)成。采集的節(jié)點也分成3種:第1種是由1個ZigBee(cc2530)微型控制器和1個或者多個傳感器組成的終端采集設(shè)備(End Device);第2種是以延長傳輸距離為主要作用的傳輸路由(Router)作為傳感信息中轉(zhuǎn)站;第3種就是協(xié)調(diào)器(Coordinate),為信息采集的匯集點。在無線傳輸部分,在ZigBee協(xié)調(diào)器上增加一塊Wi-Fi微控制器(Esp8266),將ZigBee收到的數(shù)據(jù)通過Rx/Tx串口通信的方式,透傳、連接到Internet網(wǎng)的Wi-Fi模塊實現(xiàn)數(shù)據(jù)的實時采集。ZigBee(cc2530)收集到的節(jié)點測量數(shù)據(jù),通過Tx傳輸?shù)紼SP8266的Rx完成透傳并分別識別設(shè)備標(biāo)識符和采集數(shù)據(jù),實時通過Http Get 的方式,發(fā)送數(shù)據(jù)到遠(yuǎn)程服務(wù)器。有線傳輸部分,則直接使用串口進(jìn)行傳輸,無Wi-Fi模塊。
第2部分為服務(wù)器端,主要是存儲和處理數(shù)據(jù)。在無線傳輸架構(gòu)中,Wi-Fi模塊通過無線局域網(wǎng)連接到遠(yuǎn)程服務(wù)器。信息通過socket連接方式實時地透傳到遠(yuǎn)程服務(wù)器的數(shù)據(jù)庫中。后臺系統(tǒng)主要用PHP語言進(jìn)行開發(fā),配合MySQL數(shù)據(jù)庫,基本滿足實時數(shù)據(jù)提取的要求。在有線傳輸架構(gòu)中,ZigBee協(xié)調(diào)器通過串口USB界面?zhèn)鬏數(shù)奖镜氐姆?wù)器,本地服務(wù)器使用node.js為技術(shù)底層,完成數(shù)據(jù)從串口采集到數(shù)據(jù)庫保存并進(jìn)行數(shù)據(jù)格式化的過程。
第3部分為網(wǎng)頁展示部分。構(gòu)建前端頁面的整體架構(gòu),通過輪詢的方法實時獲取后臺數(shù)據(jù)庫的數(shù)據(jù),并使用動態(tài)曲線圖進(jìn)行展示。用戶可以選取時間范圍等方法進(jìn)行數(shù)據(jù)查詢。采用web形式的展示使用戶實現(xiàn)跨設(shè)備實時的數(shù)據(jù)查詢。
傳感器節(jié)點硬件框圖如圖2所示。包括CC2530MCU以及溫度傳感器、pH值傳感器、空氣質(zhì)量傳感器、光照傳感器等硬件設(shè)備模塊,還有電源模塊和無線通信模塊以及ADC模塊。電源模塊是給傳感器節(jié)點供應(yīng)正常工作所需能量,無線通信模塊負(fù)責(zé)數(shù)據(jù)和命令的傳輸與接收,ADC模塊負(fù)責(zé)處理傳感器采集到的數(shù)據(jù)。各個傳感器將采集到的數(shù)據(jù)通過ADC通道發(fā)送到CC2530的微處理器,微處理器對數(shù)據(jù)進(jìn)行再次處理、存儲然后通過無線通信模塊進(jìn)行數(shù)據(jù)傳輸并且控制電源模塊。
圖2 傳感器節(jié)點硬件結(jié)構(gòu)
本文所提出的監(jiān)測系統(tǒng)主要是監(jiān)測近海環(huán)境,方便監(jiān)測人員實時獲取相關(guān)監(jiān)測數(shù)據(jù),以備做出環(huán)境保護(hù)的對應(yīng)措施。目前對于近海水域的監(jiān)測參數(shù)主要有水質(zhì)參數(shù)、水文氣象參數(shù)以及物理化學(xué)參數(shù)[16]。水質(zhì)參數(shù)主要包括pH值、有機物、鹽度等數(shù)據(jù);水文氣象參數(shù)包括氣溫、光照強度、水溫、波浪、風(fēng)速等數(shù)據(jù);物理化學(xué)參數(shù)有空氣質(zhì)量(有害氣體含量)、重金屬、營養(yǎng)鹽等參考數(shù)據(jù)[17]。
溫度測量采用LM35DZ溫度傳感器,它是精密集成電路溫度傳感器,其輸出電壓與攝氏溫度成線性關(guān)系,具有重復(fù)性好、輸出阻抗低以及應(yīng)用簡單的特點。LM35DZ型號溫度傳感器的靈敏度為10.0 mV/℃,精度為0.4~0.8 ℃,輸出溫度范圍為-55~150 ℃。典型應(yīng)用電路如圖3所示。
圖3 LM35DZ傳感器電路
空氣質(zhì)量是環(huán)境監(jiān)測的一個重要數(shù)據(jù),很多污染因素都會引起空氣質(zhì)量的數(shù)據(jù)變化,傳感器的電導(dǎo)率會隨空氣中污染氣體的增加而增加[18]。本方案選擇MQ135型空氣質(zhì)量傳感器,它在較寬的濃度范圍內(nèi)監(jiān)測有害氣體,具有靈敏度高、驅(qū)動電路簡單、使用壽命長且成本較低等特點。其測量數(shù)據(jù)范圍在0~2 047之間,數(shù)值越大表明空氣質(zhì)量越差。如圖4是MQ135傳感器的典型應(yīng)用電路。
圖4 MQ135傳感器電路
在近海環(huán)境監(jiān)測中,如果某海域的光照強度低于一定數(shù)值時,則可以大致判定該水域污染情況。本文選擇光敏二極管型傳感器測量光照強度,該傳感器對光照的靈敏度較高,并且可以感知固定方向的光源。典型的應(yīng)用電路如圖5所示。
圖5 光敏二極管傳感器電路
近海水域的污染源還可以通過pH值來進(jìn)行判斷。本文選用E-201-C型pH值傳感器,該傳感器可根據(jù)被測水質(zhì)的酸堿度不同而輸出不同電位,線性度較好。
為了實現(xiàn)對海洋環(huán)境的數(shù)據(jù)檢測,在系統(tǒng)設(shè)計時還需要對電路和傳感器進(jìn)行防水處理;安裝時,無線部分置放在高處,避免潮汐時淹沒天線;傳感器節(jié)點的布置上,充分考慮覆蓋范圍,確保節(jié)點間正常通信。
傳感節(jié)點主要使用TI公司所開源的Z-Stack軟件進(jìn)行開發(fā)。其中一些主要的步驟,如添加相應(yīng)的應(yīng)用任務(wù)程式,先調(diào)用osal_init_ststem()執(zhí)行初始化工作,包括硬件配置、網(wǎng)絡(luò)協(xié)議等的初始化,然后調(diào)用osal_start_system()初始化操作系統(tǒng)。
SampleApp_Init()用戶應(yīng)用任務(wù)初始化函數(shù)。在這個函數(shù)里面定義了OSAL分配的任務(wù)ID、將設(shè)備狀態(tài)定義為ZDO層的初始化狀態(tài)、設(shè)置發(fā)送數(shù)據(jù)的方式和目的尋址的模式等等。
還有一些重要的事件函數(shù),如SampleApp_ProcessEvent()用戶應(yīng)用任務(wù)的事件處理函數(shù)、SampleApp_MessageMSGCB()接受數(shù)據(jù)函數(shù)、SampleApp_SendPeriodicMessage() 發(fā)送周期信息函數(shù)和AF_DataRequest()發(fā)送函數(shù)。這些函數(shù)都是理解Z-stack的重要步驟。
與ESP8266的通信是通過SampleApp_MessageMSGCB()接收函數(shù),在此函數(shù)中通過將接收到的數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換并封裝,然后調(diào)用HalUARTWrite()函數(shù),輸出接收到的節(jié)點數(shù)據(jù)。
包括PHP為后端的無線網(wǎng)采集和Node.js為平臺的串口采集2種模式實現(xiàn)端口的讀取、數(shù)據(jù)庫的連接和數(shù)據(jù)處理功能。
3.2.1 以PHP為后端的無線網(wǎng)采集
服務(wù)器運行環(huán)境為Windows Server 2012,node.js v6.10.2,npm v4.5.0。
1) 基于UDP socket的數(shù)據(jù)傳輸
接收節(jié)點協(xié)調(diào)器上的Wi-Fi芯片連接到一個能夠連接服務(wù)器ip的局域網(wǎng)中,確保ESP8226 Wi-Fi芯片能夠穩(wěn)定傳輸信號。基于ESP8266搭建NodeMCU開發(fā)平臺,使用Lua作為開發(fā)語言。ESP8266建立客戶端UDP Socket及連接遠(yuǎn)程服務(wù)器Socket的代碼如下:
wifi.setmode(wifi.STATION)//設(shè)置NodeMCU模式
wifi.sta.config(“SSID”,“password”) //連接局域網(wǎng)
print(wifi.sta.getip());
cu=net.createConnection(net.UDP) //設(shè)置為UDP連接
cu:on(“receive”,function(cu,c) re=c end)
cu:connect(port,“IPaddress”)//遠(yuǎn)程服務(wù)器端口及IP地址
在服務(wù)器端,建立UDP socket連接。使用PHP作為后臺開發(fā)語言,代碼及創(chuàng)建過程如下:
$socket = socket_create( AF_INET,SOCK_DGRAM,SOL_UDP );
if ( $socket === false ) {
echo “socket_create() failed:reason:”
.socket_strerror(socket_last_error() ).“ ”;
}
echo “Socket created. ”;
$socket = socket_bind( $socket,‘0.0.0.0’,port );//0.0.0.0 接受任意IP段連接
if ( $ok === false ) {
echo “socket_bind() failed:reason:”
.socket_strerror( socket_last_error( $socket ) );
}
echo “Socket bind OK ”;
當(dāng)服務(wù)器端的UDP socket及客戶端的socket建立完成之后,當(dāng)客戶端請求一次連接并成功之后,客戶端和服務(wù)端保持常連接,當(dāng)數(shù)據(jù)傳輸時,其連接端口不變。
2) 數(shù)據(jù)存儲
服務(wù)器端數(shù)據(jù)存儲使用PHP進(jìn)行操作。當(dāng)客戶端連接時,服務(wù)器端建立循環(huán)連接,判斷客戶端是否有數(shù)據(jù)傳入。如有數(shù)據(jù)傳入,將其按照一定的格式存儲到數(shù)據(jù)庫當(dāng)中。其代碼如下:
while(1)
{
$db=new mysqli(DBHOST,DBUSER,DBPASSWORD,DBNAME);
link = mysql_connect(DBHOST,DBUSER,DBPASSWORD) or die (“Could not connect:”.mysql_error($link)); //建立數(shù)據(jù)庫連接
$sql = “INSERT INTO ‘esp_log’.‘log_envirparameters’
(‘ID’,‘nwkAddr’,‘ClusterID’,‘Date’,‘type’,‘value’,‘extAddr’,‘location’,‘isbackup’)VALUES
(NULL,‘$nwkaddr’, NULL, ‘$date’, ‘$type’, ‘$value’,NULL, ‘$location’,‘0’)”;//存儲位置及對應(yīng)的列表欄數(shù)據(jù)
$result = $db->query($sql);//將處理過的數(shù)據(jù)存入指定數(shù)據(jù)表
socket_sendto($sock,“OK ”.$buf,$remote_ip,$remote_port);//返回消息給客戶端
varmysql= require(‘mysql’);
var connection = mysql.createConnection({
host:‘localhost’,//主機號
user:‘root’,
password:‘’,
database:‘lab’
});
connection.connect();//連接數(shù)據(jù)庫
connection.query(‘INSERT INTO ?? SET
ID=?,nwkAddr=?,ClusterID=?,Date=?,type=?,
value=?
,extAddr=?,location=?,isbackup=?’,[‘log_envirparameters’,
“NULL”,nwkaddr,“LAB_01”,date,type,value,
“NULL”,location,“0”],
);//將處理過后的數(shù)據(jù),存入數(shù)據(jù)庫 socket_close($socket);//關(guān)閉socket連接
3.2.2 以Node.js為平臺的串口采集
服務(wù)器運行環(huán)境為window 7 Ultimate,node.js v6.10.2[19],npm v4.5.0。
1) 從串口中讀取數(shù)據(jù)
安裝在npm(Javascript包管理器)2個主要的依賴包(node-pre-gyp 和serialport)。node-pre-gyp提供二進(jìn)制文件部署的跨平臺的方法,這個模塊為安裝serialport做準(zhǔn)備;Serialport是一個串口模塊,可以通過編寫JavaScript控制串口,也可以通過它為Arduino芯片進(jìn)行編程,為X10無線通信甚至是Z-Wave或者Zigbee標(biāo)準(zhǔn)所需的低級串行端口代碼提供界面。
在window環(huán)境下安裝serialport需要使用node-pre-gyp進(jìn)行編譯,并且node-pre需要Python2.x的支持。
編寫讀取串口數(shù)據(jù)之前,要明確2個要素,即串口端口號(Serialport)和其傳輸?shù)牟ㄌ芈?BaudRate)。在Linux系統(tǒng)中,其串口端號一般如“/dev/tty-usbserialX”,而在window系統(tǒng)中,直接使用系統(tǒng)顯示的端口,如“COM3”。
其讀取代碼如下:
varSerialPort = require(‘serialport’);
var port = new SerialPort(‘COM3’,{
“baudRate”:57600,
“autoOpen”:true});
port.on(‘data’,function (data) {
console.log(“orl:”+data.toString(‘hex’)+“ ”);//打印出讀取的數(shù)據(jù)
2) 連接數(shù)據(jù)庫并存儲數(shù)據(jù)
安裝mysql依賴包,在命令行中輸入“npm install mysql”,完成安裝。在服務(wù)器端開有一個MySQL服務(wù)器,其連接代碼如下:
在整體架構(gòu)上面,前端展示頁面定位為后端應(yīng)用,需要后臺的配合才能完成。其后端數(shù)據(jù)由架在PHP和MySQL上面的服務(wù)端處理完成[20],并生成靜態(tài)數(shù)據(jù)文件,以便前臺頁面的調(diào)用。Vue.js使用了組件化的開發(fā),組件之前高度解耦,數(shù)據(jù)綁定和視圖更新特性極其簡單和優(yōu)秀,其非常適合本套系統(tǒng)的前端的頁面搭建。
3.3.1 前端頁面程序
前端頁面采用漸進(jìn)式的JavaScript 框架Vue.js,簡單來說,這是一個用來開發(fā)web界面的前端庫。它具有virtual DOM,提供組件化(composable)和響應(yīng)式(reactive)的視圖組件。
前端頁面使用動態(tài)可操作的圖表和簡單的信息展示方式,不僅可以在桌面端應(yīng)用實時查詢數(shù)據(jù),還可以在任何可以連接互聯(lián)網(wǎng)的移動設(shè)備上,查看數(shù)據(jù)圖表;響應(yīng)式頁面設(shè)計,實現(xiàn)互聯(lián)網(wǎng)多種移動設(shè)備實時、便捷、準(zhǔn)確地進(jìn)行數(shù)據(jù)查詢和數(shù)據(jù)實時展示。
目前已有一些開發(fā)框架(如google的Angular、Facebook的React)可以用來簡化腳本的開發(fā),提高代碼的復(fù)用性。本項目采用基于Vue.js進(jìn)行前端頁面搭建,其使用到的文件及庫依賴在“package.json”中,其webpack構(gòu)建時所用的配置在“webpack.base.conf.js”中。
展示頁面主要由3個組件組成,分別是頂部欄(page/ghnavtop.vue)、左側(cè)欄(page/ghnavleft.vue)和內(nèi)容部分(sensorNode/nodePreview.vue)。內(nèi)容部分由1個節(jié)點詳細(xì)欄組件(sensorNode/nodedetail.vue)進(jìn)行組件復(fù)用,其內(nèi)部的數(shù)據(jù)條目由1個節(jié)點感測器數(shù)據(jù)組件(sensoNode/nodedata.vue)進(jìn)行組件循環(huán)復(fù)用。
PC頁面使用動態(tài)可操作的圖表進(jìn)行數(shù)據(jù)查詢和展示。其展示查詢功能主要分為數(shù)據(jù)實時展示和數(shù)據(jù)查詢功能。數(shù)據(jù)實時展示部分由實時數(shù)據(jù)和實時圖表完成。
3.3.2 EChart圖表庫
為了實現(xiàn)圖形的顯示,本系統(tǒng)采用了Echart表組件,使用”require(‘echarts/lib/echarts’)”進(jìn)行加載圖表的主模塊,然后使用require(“echarts/lib/chart/line”)進(jìn)行引入折線圖組件,接著使用此方法引入標(biāo)題組件。此方法在經(jīng)過webpack的打包之后,使存儲空間從原來的400多kB減少到150多kB。
Echart圖標(biāo)庫的使用方法比較簡單,繪制Canvas之前準(zhǔn)備一個具有寬高的DOM容器,在移動終端顯示時,我們采用了自適應(yīng)的百分比制寬高,調(diào)用其初始化方法Echart.init(Dom),并通過設(shè)置其圖表的各種參數(shù)options,使用setOption(options)完成圖表繪制。此外,還采用媒體查詢(Media Query)的方法,實現(xiàn)自適應(yīng)圖表。
3.3.3 SPA的應(yīng)用
單頁 Web 應(yīng)用 (single-page application 簡稱為 SPA) 是一種特殊的 Web 應(yīng)用。它將所有的活動局限于一個Web頁面中,僅在該Web頁面初始化時加載相應(yīng)的HTML、JavaScript 和 CSS。本系統(tǒng)使用SPA的方法,如單日報表和數(shù)據(jù)報表之間的切換,不使用整頁刷新,在前端頁面使用組件切換,不再向服務(wù)器發(fā)起多次請求,只更改其視圖表現(xiàn),用戶操作更改模型數(shù)據(jù)。再如添加感測節(jié)點數(shù)據(jù)展示圖,其不整頁更新數(shù)據(jù),在表現(xiàn)層添加組件,組件模型向后臺發(fā)送數(shù)據(jù)請求,異步更新數(shù)據(jù),并更改DOM節(jié)點數(shù)據(jù)。
3.3.4 數(shù)據(jù)管理
本系統(tǒng)中,使用的存儲數(shù)據(jù)的數(shù)據(jù)庫為MariaDB,它是MySQL一個分支,其由開源社區(qū)維護(hù),所以MariaDB的部分特性優(yōu)于MySQL。本系統(tǒng)在數(shù)據(jù)庫方面暫時沒有大量并發(fā)和性能上的要求。數(shù)據(jù)的管理界面使用phpMyAdmin,這是一個界面簡單且易于管理查看的管理系統(tǒng)。后臺數(shù)據(jù)處理系統(tǒng)由Apache及PHP搭建,PHP版本為5.6.19,PHP擴展為mysqli,其phpMyAdmin版本為4.5.1。
本系統(tǒng)基于Wi-Fi無線網(wǎng)絡(luò)和基于USB串口2種采集方式完成數(shù)據(jù)收集、傳輸、處理和前端頁面數(shù)據(jù)實時呈現(xiàn)和查詢功能,實現(xiàn)海洋監(jiān)測系統(tǒng)的預(yù)期功能。
本系統(tǒng)搭建后,能夠采集傳感數(shù)據(jù)并進(jìn)行統(tǒng)計,而且可以在PC機上和移動終端上進(jìn)行訪問,如圖6所示。
圖6 前端頁面的實時數(shù)據(jù)圖表
為了驗證系統(tǒng)的有效性,選取01∶17到6∶17時間段進(jìn)行實驗測試,檢測數(shù)據(jù)如圖7所示。對于空氣傳感器在01∶00時,在系統(tǒng)作品附近點燃一個蚊香,可以看到在01∶17到6∶17這段時間內(nèi),其空氣質(zhì)量由180降低到120;對于光敏傳感器在01∶05時,用手遮蓋光敏傳感器,可以看到在01∶05時,光照強度突然下降;對于溫度傳感器,實測溫度24 ℃左右,與溫度表測量得到的結(jié)果一致。
圖7 實驗測試數(shù)據(jù)圖表
本文基于ZigBee技術(shù)進(jìn)行海洋監(jiān)測系統(tǒng)硬件和軟件的設(shè)計,完成監(jiān)測模塊的軟、硬件設(shè)計,完成ZigBee無線網(wǎng)絡(luò)信息通過串口采集、無線網(wǎng)絡(luò)定時采集和傳送傳感器數(shù)據(jù)的功能,完成跨設(shè)備和跨平臺的監(jiān)測頁面設(shè)計和開發(fā),實現(xiàn)數(shù)據(jù)實時動態(tài)顯示和查詢。通過實驗驗證,借助ZigBee技術(shù)進(jìn)行海洋監(jiān)測并使用跨平臺web技術(shù),可以完成海洋數(shù)據(jù)的實時采集、傳遞、處理和查詢,使得海洋資源得到更科學(xué)和便捷的管理和開發(fā)。