李 穎,楊光松,郭文靜,康雙全
(1.集美大學誠毅學院, 福建 廈門 361021; 2.集美大學 信息工程學院, 福建 廈門 361021)
海洋是地球可持續發展的重要戰略資源,海洋資源的保護、開發和利用離不開海洋監測高技術的支持。海洋監測技術包括海洋環境的監測、預測和預警,涉及能源、信息、電子、通信、材料等多學科,對海洋的防災減災、生態監測、資源開發、軍事安防等提供服務[1]。目前海洋監測技術已實現立體監測,完成在線監測和災害預警等功能,但存在采集信息穩定性不足、精度低、傳輸和處理能力局限等問題[2]。
本文設計實現了一種基于ZigBee[3-9]的海洋監控系統,在水面、水下高密度布置節點并自組構建無線傳感網絡,可以提供實時監控,具備功耗低、距離短、通信穩定、成本低等特點,在一定程度上彌補海洋監測手段的不足。
首先,基于NodeMCU微控制器和CC2530[10]的ZigBee芯片[11-12]設計了無線傳感節點,通過ESP8266 Wi-Fi模塊或USB串口模塊,實現協調器與數據處理中心的信息傳遞,完成系統硬件框架的搭建。其次,完成數據采集部分的軟件設計[13],通過UDP Socket嵌套字,實現傳感器數據遠程采集的功能。使用node.js技術和串口,實現傳感器數據本地采集的功能。最后,完成數據展示部分的設計,使用Vue.js前端框架進行前端頁面開發,基于WEB實現跨設備的訪問和瀏覽。經實際測試證明,系統可以通過ZigBee終端節點定時采集傳感器數據,通過ZigBee拓撲傳輸到協調器節點,然后通過有線或者無線的方式,將數據傳輸到本地或者透傳到遠程的服務器,完成采集工作[14]。在后臺分析采集數據,加入到相應的數據庫中。最后,使用web界面展示所采集的數據,完成跨設備的實時數據展示和查詢。
本系統原理圖如圖1所示,傳感節點采集數據后送到傳輸路由器,然后由路由器轉發至協調器,最后上傳至服務器。用戶可以通過PC機或者手機等移動終端,通過WEB的形式查看其統計數據,實現環境對海洋環境的監控[15]。

圖1 系統原理
系統結構由3部分組成:
第1部分是硬件感測模塊,主要由ZigBee采集節點構成。采集的節點也分成3種:第1種是由1個ZigBee(cc2530)微型控制器和1個或者多個傳感器組成的終端采集設備(End Device);第2種是以延長傳輸距離為主要作用的傳輸路由(Router)作為傳感信息中轉站;第3種就是協調器(Coordinate),為信息采集的匯集點。在無線傳輸部分,在ZigBee協調器上增加一塊Wi-Fi微控制器(Esp8266),將ZigBee收到的數據通過Rx/Tx串口通信的方式,透傳、連接到Internet網的Wi-Fi模塊實現數據的實時采集。ZigBee(cc2530)收集到的節點測量數據,通過Tx傳輸到ESP8266的Rx完成透傳并分別識別設備標識符和采集數據,實時通過Http Get 的方式,發送數據到遠程服務器。有線傳輸部分,則直接使用串口進行傳輸,無Wi-Fi模塊。
第2部分為服務器端,主要是存儲和處理數據。在無線傳輸架構中,Wi-Fi模塊通過無線局域網連接到遠程服務器。信息通過socket連接方式實時地透傳到遠程服務器的數據庫中。后臺系統主要用PHP語言進行開發,配合MySQL數據庫,基本滿足實時數據提取的要求。在有線傳輸架構中,ZigBee協調器通過串口USB界面傳輸到本地的服務器,本地服務器使用node.js為技術底層,完成數據從串口采集到數據庫保存并進行數據格式化的過程。
第3部分為網頁展示部分。構建前端頁面的整體架構,通過輪詢的方法實時獲取后臺數據庫的數據,并使用動態曲線圖進行展示。用戶可以選取時間范圍等方法進行數據查詢。采用web形式的展示使用戶實現跨設備實時的數據查詢。
傳感器節點硬件框圖如圖2所示。包括CC2530MCU以及溫度傳感器、pH值傳感器、空氣質量傳感器、光照傳感器等硬件設備模塊,還有電源模塊和無線通信模塊以及ADC模塊。電源模塊是給傳感器節點供應正常工作所需能量,無線通信模塊負責數據和命令的傳輸與接收,ADC模塊負責處理傳感器采集到的數據。各個傳感器將采集到的數據通過ADC通道發送到CC2530的微處理器,微處理器對數據進行再次處理、存儲然后通過無線通信模塊進行數據傳輸并且控制電源模塊。

圖2 傳感器節點硬件結構
本文所提出的監測系統主要是監測近海環境,方便監測人員實時獲取相關監測數據,以備做出環境保護的對應措施。目前對于近海水域的監測參數主要有水質參數、水文氣象參數以及物理化學參數[16]。水質參數主要包括pH值、有機物、鹽度等數據;水文氣象參數包括氣溫、光照強度、水溫、波浪、風速等數據;物理化學參數有空氣質量(有害氣體含量)、重金屬、營養鹽等參考數據[17]。
溫度測量采用LM35DZ溫度傳感器,它是精密集成電路溫度傳感器,其輸出電壓與攝氏溫度成線性關系,具有重復性好、輸出阻抗低以及應用簡單的特點。LM35DZ型號溫度傳感器的靈敏度為10.0 mV/℃,精度為0.4~0.8 ℃,輸出溫度范圍為-55~150 ℃。典型應用電路如圖3所示。

圖3 LM35DZ傳感器電路
空氣質量是環境監測的一個重要數據,很多污染因素都會引起空氣質量的數據變化,傳感器的電導率會隨空氣中污染氣體的增加而增加[18]。本方案選擇MQ135型空氣質量傳感器,它在較寬的濃度范圍內監測有害氣體,具有靈敏度高、驅動電路簡單、使用壽命長且成本較低等特點。其測量數據范圍在0~2 047之間,數值越大表明空氣質量越差。如圖4是MQ135傳感器的典型應用電路。

圖4 MQ135傳感器電路
在近海環境監測中,如果某海域的光照強度低于一定數值時,則可以大致判定該水域污染情況。本文選擇光敏二極管型傳感器測量光照強度,該傳感器對光照的靈敏度較高,并且可以感知固定方向的光源。典型的應用電路如圖5所示。

圖5 光敏二極管傳感器電路
近海水域的污染源還可以通過pH值來進行判斷。本文選用E-201-C型pH值傳感器,該傳感器可根據被測水質的酸堿度不同而輸出不同電位,線性度較好。
為了實現對海洋環境的數據檢測,在系統設計時還需要對電路和傳感器進行防水處理;安裝時,無線部分置放在高處,避免潮汐時淹沒天線;傳感器節點的布置上,充分考慮覆蓋范圍,確保節點間正常通信。
傳感節點主要使用TI公司所開源的Z-Stack軟件進行開發。其中一些主要的步驟,如添加相應的應用任務程式,先調用osal_init_ststem()執行初始化工作,包括硬件配置、網絡協議等的初始化,然后調用osal_start_system()初始化操作系統。
SampleApp_Init()用戶應用任務初始化函數。在這個函數里面定義了OSAL分配的任務ID、將設備狀態定義為ZDO層的初始化狀態、設置發送數據的方式和目的尋址的模式等等。
還有一些重要的事件函數,如SampleApp_ProcessEvent()用戶應用任務的事件處理函數、SampleApp_MessageMSGCB()接受數據函數、SampleApp_SendPeriodicMessage() 發送周期信息函數和AF_DataRequest()發送函數。這些函數都是理解Z-stack的重要步驟。
與ESP8266的通信是通過SampleApp_MessageMSGCB()接收函數,在此函數中通過將接收到的數據進行格式轉換并封裝,然后調用HalUARTWrite()函數,輸出接收到的節點數據。
包括PHP為后端的無線網采集和Node.js為平臺的串口采集2種模式實現端口的讀取、數據庫的連接和數據處理功能。
3.2.1 以PHP為后端的無線網采集
服務器運行環境為Windows Server 2012,node.js v6.10.2,npm v4.5.0。
1) 基于UDP socket的數據傳輸
接收節點協調器上的Wi-Fi芯片連接到一個能夠連接服務器ip的局域網中,確保ESP8226 Wi-Fi芯片能夠穩定傳輸信號。基于ESP8266搭建NodeMCU開發平臺,使用Lua作為開發語言。ESP8266建立客戶端UDP Socket及連接遠程服務器Socket的代碼如下:
wifi.setmode(wifi.STATION)//設置NodeMCU模式
wifi.sta.config(“SSID”,“password”) //連接局域網
print(wifi.sta.getip());
cu=net.createConnection(net.UDP) //設置為UDP連接
cu:on(“receive”,function(cu,c) re=c end)
cu:connect(port,“IPaddress”)//遠程服務器端口及IP地址
在服務器端,建立UDP socket連接。使用PHP作為后臺開發語言,代碼及創建過程如下:
$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 ”;
當服務器端的UDP socket及客戶端的socket建立完成之后,當客戶端請求一次連接并成功之后,客戶端和服務端保持常連接,當數據傳輸時,其連接端口不變。
2) 數據存儲
服務器端數據存儲使用PHP進行操作。當客戶端連接時,服務器端建立循環連接,判斷客戶端是否有數據傳入。如有數據傳入,將其按照一定的格式存儲到數據庫當中。其代碼如下:
while(1)
{
$db=new mysqli(DBHOST,DBUSER,DBPASSWORD,DBNAME);
link = mysql_connect(DBHOST,DBUSER,DBPASSWORD) or die (“Could not connect:”.mysql_error($link)); //建立數據庫連接
$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’)”;//存儲位置及對應的列表欄數據
$result = $db->query($sql);//將處理過的數據存入指定數據表
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();//連接數據庫
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”],
);//將處理過后的數據,存入數據庫 socket_close($socket);//關閉socket連接
3.2.2 以Node.js為平臺的串口采集
服務器運行環境為window 7 Ultimate,node.js v6.10.2[19],npm v4.5.0。
1) 從串口中讀取數據
安裝在npm(Javascript包管理器)2個主要的依賴包(node-pre-gyp 和serialport)。node-pre-gyp提供二進制文件部署的跨平臺的方法,這個模塊為安裝serialport做準備;Serialport是一個串口模塊,可以通過編寫JavaScript控制串口,也可以通過它為Arduino芯片進行編程,為X10無線通信甚至是Z-Wave或者Zigbee標準所需的低級串行端口代碼提供界面。
在window環境下安裝serialport需要使用node-pre-gyp進行編譯,并且node-pre需要Python2.x的支持。
編寫讀取串口數據之前,要明確2個要素,即串口端口號(Serialport)和其傳輸的波特率(BaudRate)。在Linux系統中,其串口端號一般如“/dev/tty-usbserialX”,而在window系統中,直接使用系統顯示的端口,如“COM3”。
其讀取代碼如下:
varSerialPort = require(‘serialport’);
var port = new SerialPort(‘COM3’,{
“baudRate”:57600,
“autoOpen”:true});
port.on(‘data’,function (data) {
console.log(“orl:”+data.toString(‘hex’)+“ ”);//打印出讀取的數據
2) 連接數據庫并存儲數據
安裝mysql依賴包,在命令行中輸入“npm install mysql”,完成安裝。在服務器端開有一個MySQL服務器,其連接代碼如下:
在整體架構上面,前端展示頁面定位為后端應用,需要后臺的配合才能完成。其后端數據由架在PHP和MySQL上面的服務端處理完成[20],并生成靜態數據文件,以便前臺頁面的調用。Vue.js使用了組件化的開發,組件之前高度解耦,數據綁定和視圖更新特性極其簡單和優秀,其非常適合本套系統的前端的頁面搭建。
3.3.1 前端頁面程序
前端頁面采用漸進式的JavaScript 框架Vue.js,簡單來說,這是一個用來開發web界面的前端庫。它具有virtual DOM,提供組件化(composable)和響應式(reactive)的視圖組件。
前端頁面使用動態可操作的圖表和簡單的信息展示方式,不僅可以在桌面端應用實時查詢數據,還可以在任何可以連接互聯網的移動設備上,查看數據圖表;響應式頁面設計,實現互聯網多種移動設備實時、便捷、準確地進行數據查詢和數據實時展示。
目前已有一些開發框架(如google的Angular、Facebook的React)可以用來簡化腳本的開發,提高代碼的復用性。本項目采用基于Vue.js進行前端頁面搭建,其使用到的文件及庫依賴在“package.json”中,其webpack構建時所用的配置在“webpack.base.conf.js”中。
展示頁面主要由3個組件組成,分別是頂部欄(page/ghnavtop.vue)、左側欄(page/ghnavleft.vue)和內容部分(sensorNode/nodePreview.vue)。內容部分由1個節點詳細欄組件(sensorNode/nodedetail.vue)進行組件復用,其內部的數據條目由1個節點感測器數據組件(sensoNode/nodedata.vue)進行組件循環復用。
PC頁面使用動態可操作的圖表進行數據查詢和展示。其展示查詢功能主要分為數據實時展示和數據查詢功能。數據實時展示部分由實時數據和實時圖表完成。
3.3.2 EChart圖表庫
為了實現圖形的顯示,本系統采用了Echart表組件,使用”require(‘echarts/lib/echarts’)”進行加載圖表的主模塊,然后使用require(“echarts/lib/chart/line”)進行引入折線圖組件,接著使用此方法引入標題組件。此方法在經過webpack的打包之后,使存儲空間從原來的400多kB減少到150多kB。
Echart圖標庫的使用方法比較簡單,繪制Canvas之前準備一個具有寬高的DOM容器,在移動終端顯示時,我們采用了自適應的百分比制寬高,調用其初始化方法Echart.init(Dom),并通過設置其圖表的各種參數options,使用setOption(options)完成圖表繪制。此外,還采用媒體查詢(Media Query)的方法,實現自適應圖表。
3.3.3 SPA的應用
單頁 Web 應用 (single-page application 簡稱為 SPA) 是一種特殊的 Web 應用。它將所有的活動局限于一個Web頁面中,僅在該Web頁面初始化時加載相應的HTML、JavaScript 和 CSS。本系統使用SPA的方法,如單日報表和數據報表之間的切換,不使用整頁刷新,在前端頁面使用組件切換,不再向服務器發起多次請求,只更改其視圖表現,用戶操作更改模型數據。再如添加感測節點數據展示圖,其不整頁更新數據,在表現層添加組件,組件模型向后臺發送數據請求,異步更新數據,并更改DOM節點數據。
3.3.4 數據管理
本系統中,使用的存儲數據的數據庫為MariaDB,它是MySQL一個分支,其由開源社區維護,所以MariaDB的部分特性優于MySQL。本系統在數據庫方面暫時沒有大量并發和性能上的要求。數據的管理界面使用phpMyAdmin,這是一個界面簡單且易于管理查看的管理系統。后臺數據處理系統由Apache及PHP搭建,PHP版本為5.6.19,PHP擴展為mysqli,其phpMyAdmin版本為4.5.1。
本系統基于Wi-Fi無線網絡和基于USB串口2種采集方式完成數據收集、傳輸、處理和前端頁面數據實時呈現和查詢功能,實現海洋監測系統的預期功能。
本系統搭建后,能夠采集傳感數據并進行統計,而且可以在PC機上和移動終端上進行訪問,如圖6所示。

圖6 前端頁面的實時數據圖表
為了驗證系統的有效性,選取01∶17到6∶17時間段進行實驗測試,檢測數據如圖7所示。對于空氣傳感器在01∶00時,在系統作品附近點燃一個蚊香,可以看到在01∶17到6∶17這段時間內,其空氣質量由180降低到120;對于光敏傳感器在01∶05時,用手遮蓋光敏傳感器,可以看到在01∶05時,光照強度突然下降;對于溫度傳感器,實測溫度24 ℃左右,與溫度表測量得到的結果一致。

圖7 實驗測試數據圖表
本文基于ZigBee技術進行海洋監測系統硬件和軟件的設計,完成監測模塊的軟、硬件設計,完成ZigBee無線網絡信息通過串口采集、無線網絡定時采集和傳送傳感器數據的功能,完成跨設備和跨平臺的監測頁面設計和開發,實現數據實時動態顯示和查詢。通過實驗驗證,借助ZigBee技術進行海洋監測并使用跨平臺web技術,可以完成海洋數據的實時采集、傳遞、處理和查詢,使得海洋資源得到更科學和便捷的管理和開發。