APP下载

一种基于ZigBee的海洋环境监控系统设计与实现

2018-10-17杨光松郭文静康双全

关键词:串口页面组件

李 颖,杨光松,郭文静,康双全

(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 系统框架

本系统原理图如图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 硬件设计实现

2.1 传感节点设计

传感器节点硬件框图如图2所示。包括CC2530MCU以及温度传感器、pH值传感器、空气质量传感器、光照传感器等硬件设备模块,还有电源模块和无线通信模块以及ADC模块。电源模块是给传感器节点供应正常工作所需能量,无线通信模块负责数据和命令的传输与接收,ADC模块负责处理传感器采集到的数据。各个传感器将采集到的数据通过ADC通道发送到CC2530的微处理器,微处理器对数据进行再次处理、存储然后通过无线通信模块进行数据传输并且控制电源模块。

图2 传感器节点硬件结构

2.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值传感器,该传感器可根据被测水质的酸碱度不同而输出不同电位,线性度较好。

为了实现对海洋环境的数据检测,在系统设计时还需要对电路和传感器进行防水处理;安装时,无线部分置放在高处,避免潮汐时淹没天线;传感器节点的布置上,充分考虑覆盖范围,确保节点间正常通信。

3 系统软件设计实现

3.1 传感节点软件设计

传感节点主要使用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()函数,输出接收到的节点数据。

3.2 数据采集软件设计

包括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服务器,其连接代码如下:

3.3 人机界面设计

在整体架构上面,前端展示页面定位为后端应用,需要后台的配合才能完成。其后端数据由架在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。

4 系统检测结果

本系统基于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 实验测试数据图表

5 结束语

本文基于ZigBee技术进行海洋监测系统硬件和软件的设计,完成监测模块的软、硬件设计,完成ZigBee无线网络信息通过串口采集、无线网络定时采集和传送传感器数据的功能,完成跨设备和跨平台的监测页面设计和开发,实现数据实时动态显示和查询。通过实验验证,借助ZigBee技术进行海洋监测并使用跨平台web技术,可以完成海洋数据的实时采集、传递、处理和查询,使得海洋资源得到更科学和便捷的管理和开发。

猜你喜欢

串口页面组件
刷新生活的页面
无人机智能巡检在光伏电站组件诊断中的应用
浅谈AB PLC串口跟RFID传感器的通讯应用
新型碎边剪刀盘组件
U盾外壳组件注塑模具设计
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
串口技术的实物调试和虚拟仿真联合教学模式
风起新一代光伏组件膜层:SSG纳米自清洁膜层
Web安全问答(3)