基于Android的气象WSN监测系统设计与实现
2014-11-30杜景林
韩 吉,周 杰,杜景林
(南京信息工程大学 电子与信息工程学院,江苏 南京210044)
0 引 言
本文引入气象无线传感器网络的概念,将无线传感器网络 (wireless sensor networks,WSN)[1]技术应用于气象基本要素的观测中,辅助传统自动气象站的气象观测,用于局部区域气象要素收集工作,监测环境温度、湿度、气压、风速、风向和雨量等状态。由于无线传感器网络中的传感器节点会在短时间内采集大量的传感信息,对这些信息的加工处理成为了一项重要任务,因此本文提出了分层次的气象无线传感器网络监测系统体系结构,并设计实现了原型系统。通过该系统传感器网络的采集信息被上传保存到服务器的数据库中,服务器端使用Web服务技术和实时通信技术等,使得用户能够在安卓智能手机上实时以曲线图、表格等多种形式查看监测区域的气象信息,同时还能查看网络拓扑结构、管理传感器节点、接收预警信息等。
1 相关工作
目前,已有一些利用无线传感器网络构建环境监测系统的研究工作。文献 [2]介绍了一个基于WSNs和Web技术构建农作物温室环境监测系统的案例。文献 [3]提出了一种基于Web技术,设计无线传感器网络监测系统的模式。
如上所述,虽然已有一些关于无线传感器网络监测系统的研究,但关于无线传感器网络技术,更多的工作集中于对网络通信协议、网络安全管理等方面的研究。本文的主要工作是提出了分层次的无线传感网监测系统体系结构,组件了监测原型系统。同时,区别于一些类似工作,本系统中考虑到移动用户、移动应用场景的大量增长,设计了基于安卓智能手机的移动管理客户端,不仅实现了传统Web客户端中常见的数据展示、节点管理等功能,结合移动设备的特色还实现了高效的预警推送的功能。
2 系统体系结构及设计
本文提出分层的气象无线传感器网络监测系统,其体系架构如图1所示,由下到上依次为感知层、接入层、服务平台层和应用层。
基于上述体系结构,构建的气象无线传感网监测系统工作方式为:感知层中监测区域内大量传感器节点通过自组织形成的一个感知网络,将采集到的数据经过多跳方式进行传输和处理,最后传递到汇聚节点 (sink node),然后经过接入层的网关设备上传到服务平台层的网络服务器,最终应用层的客户端用户就可以通过浏览器、手机等多种方式对传感网进行配置和管理,完成监测任务。每个层次的具体说明如下。
2.1 感知层
感知层,即多个传感器节点组成的环境监测网络。常见的传感器节点,如Crossbow公司的TelosB、MicaZ等。在本项目中,使用的是基于CC2530自制传感器节点,并移植了TinyOS无线传感器网络操作系统。传感器节点可分成一般传感器节点 (sensor node)和汇聚节点 (sink node),本项目中传感器节点主要负责采集基本环境气象数据,汇聚节点主要负责向网关传输数据包。
2.2 接入层
接入层主要是指网关设备。网关既需要与汇聚节点进行通信,还需要有接入互联网的能力。常见的网关是基于ARM的嵌入式设备,其通过串口 (RS232)与汇聚节点保持通信,同时它可以通过3G、WIFI或其他互联网接入方式与服务器通信。
2.3 服务平台层
在分层的气象无线传感器网络监测系统中,服务平台层尤为重要,上层客户端稳定可靠的运行离不开服务平台层提供的各项基本服务。在本系统中,服务平台层主要包括如下几个模块:数据收发模块、数据服务模块和推送服务模块。
2.3.1 数据收发模块
服务平台层中,数据收发模块起到了 “桥梁”的角色,它主要起到数据存储和指令中转的功能。
数据存储是指数据收发模块负责将无线传感器网络采集到的数据包按照指定的格式解析并存入数据库。具体的,传感器节点按预定义的频率采集到气象要素数据之后,以多跳路由的方式将数据包中转到汇聚节点,继而汇聚节点将数据包发送到网关。网关通过3G或WIFI方式,与数据收发模块进行Socket通信,向其发送数据包。数据收发模块监听到Socket发送请求之后,接收数据包并根据预定义的协议标准检验数据包的完整性与合法性,判断数据包是否有效。如果有效,按照指定的格式数据收发模块解析数据包,获得传感器数据 (如温度值)、路由中转路径、网关ID编号等,然后将这些数据存入数据库相应的表中。如果无效,则丢弃该数据包。
指令中转是指数据收发模块负责向传感器节点传达客户端的操作请求。客户端的控制请求指令,经由数据收发模块、网关、多跳路由到达指定传感器节点,可对节点的工作模式和状态进行控制,如改变节点传感器的采样频率、控制节点使其休眠或工作等。
2.3.2 数据服务模块
数据服务模块的主要任务是为客户端提供数据源,客户端将得到的数据以图表、表格等多种形式展示给用户。基本的客户端功能包括历史数据查询功能和动态数据展示功能等。通过构建Web服务,客户端可以通过HTTP请求的方式向数据服务模块的Web服务器请求数据,服务器根据请求内容从数据库中查找数据集并以XML或JSON格式返回给客户端。通过这种方式可以很方便地实现历史数据查询功能。而对于客户端的动态数据展示功能,使用了WebSocket实时通信技术。具体如下分析:
(1)构建REST式的Web服务API
为实现移动客户端和数据库的交互,需要构建Web服务为客户端提供模块化、通用的应用程序接口 (API)。有远程过程调用 (RPC),面向服务架构 (SOA)以及表述性状态转移 (REST)3种常见的 Web服务架构[4]。因为REST风格的Web服务与复杂的SOA和RPC相比更加灵活简易,因此本系统中采用了REST架构,这里重点说明。REST是由Roy Fielding在其博士论文中首次提出,是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。在REST的概念中,整个Web被看作一组资源的集合,资源由URI标识,对资源进行的操作由客户端指定的URI和HTTP协议动词 (GET、POST、PUT和DELETE)的组合来实施。REST这种基于资源的设计改变了传统的基于服务的设计思想[5]。
构建REST服务的关键是设计易于理解且结构良好的URI。在本系统中设计资源URI时,采用了如下模板:/{nameSpace}/ {resourceName}/ {resourceId}/ {resourceName}.{format}。 如,URI:http:// [serverip]/nodes/1/temperature.json,将得到节点编号为1的传感器节点上的最新的温度数据。另外,假设需要查询2013-09-15到2013-09-20时间段内节点1上温度传感器数据集时,需构建的 URI为:http:// [server-ip]/nodes/1/history/temperature/2013-09-15/2013-09-20.json。注意到,构建REST式Web服务时选用了JSON作为返回数据的格式,因为JSON较常见的XML格式而言更加轻量级,更易阅读,且更易于解析处理。借助如此构建的REST式Web服务API,当Android客户端向服务器发送HTTP GET或POST请求后,服务器就会返回JSON格式的结果集,形式如下所示:
{
"node":[
{
"id":"1",
"tempature":"22.3",
"time":"11:20:30"
"date":"2013-09-20"
},
…
]
}
(2)基于WebSocket的实时通信技术
在本系统中,Android客户端用户对于一些功能的实时性要求较高,比如需要实时刷新显示当前某节点的传感器数值、需要动态显示传感网中节点路由拓扑图、客户端操作传感器节点使其休眠或启动等,这些功能的实现都依赖于可靠稳定的客户端-服务器实时通信技术。
在传统的Web客户端中,存在大量实时性要求较高的信息展示需求,因此出现了多种客户端-服务器实时通信解决方案。其中基于Ajax长轮询方式是最常用的技术,其通过轮询的异步请求方式实现客户端刷新。随着HTML5的兴起,出现了另一种实时通信机制:WebSocket。Web-Socket是一种全双工的双向通信技术,主要目的是在Web浏览器 (或其他客户端)和Web服务器之间提供一种类似TCP socket的双向的、持续的、有状态的通信方式。基于WebSocket实时通信的优势在于,服务器和客户端能够彼此相互推送消息[6]。在Android原生APP客户端中,要实现与WebSocket服务器的实时通信,需借助于第三方开源库:AutobahnAndroid[7]。
通常在无线传感器网络应用中,节点数目大,传感器种类多,服务器端数据更新较快,因此Ajax长轮询方式的性能将大大降低,且会给服务器带来较大的处理压力。此外在本文所述的气象无线传感网监测系统中,客户端的形式是Android原生APP,Ajax方式显然不适用于此应用场景。综合考虑WebSocket的性能优势,借助于AutobahnAndroid开源项目,实现了Android客户端与服务器的实时通信,其工作模式如图2所示,服务器端能够实时地将定时更新的传感器数值发送到Android客户端,客户端收到数据后立即更新显示界面。同时,Android客户端能够向服务器端实时发送请求指令,经过数据收发服务器、网关,用户可实时操控传感器节点,使其休眠或启动。此外,用户也可以查询节点的实时数据,使其在固定的上传频率之外立即上传即时数据包,供用户即时查询节点的当前工作状态。
2.3.3 推送服务模块
推送 (push)是一种由服务器主动向客户端推送消息的技术,与拉取 (pull)相比,它不需要用户不断的刷新以检查是否有消息更新,推送会主动将更新信息发送给客户端用户[8]。目前,推送服务广泛应用于各种类型的智能手机应用中,如:新闻应用会向用户及时推送重大新闻、天气应用会向用户及时推送灾害性天气预报信息等。通过推送服务,不仅能够增强用户黏度,更重要的是能够及时向用户通知一些关键性信息。在本系统中,推送服务模块的主要功能是将预警信息及时推送给Android客户端用户,这里说的预警信息如:某一传感器节点测得的温度超出阈值,雨量传感器测得的每小时降水量超出阈值等。通过推送服务模块,想要达到的效果是:只要用户的Android智能手机处于开机且保持网络连接状态,预警信息就能以Notification通知的形式即时的显示在手机上。
根据Google官方的建议,推送服务可采用谷歌云消息(Google cloud messaging,GCM)实现。但由于Android是开放源码的操作系统,不同手机厂商会根据源码进行深度定制操作系统,所以GCM服务并不能够有效地工作在每部手机上。如果自行实现高效推送服务,主要存在这样2种技术方案:
(1)长连接方案。长连接是指客户端与服务器之间维护一个TCP长连接,当服务器有数据时,通过该连接实时将数据推送到客户端,即所谓的Push。TCP连接通过发送心跳包的方式保持连接存在,心跳间隔通常设定为10到30分钟,在Android客户端发起心跳时耗电稍多,但在心跳间隔期间耗电极少,所以总体上看TCP长连接方式实现的推送服务不仅耗电少而且实时性很高[9]。
(2)开源解决方案。基于XMPP(可扩展通讯和表示协议)的开源项目androidopn[10]是一种常用的开源方案。但由于XMPP的协议体是基于XML的,所以较为冗余,对于流量和电量敏感的手机客户端而言,该方案并不是最佳选择。
综合考虑上述2种方案,长连接方案的性能最佳,但自行实现该方案需要设计一个长连接服务器,该服务器需要维护与所有客户端的连接,当客户端数目过大时服务器的设计是一个很大的挑战。注意到目前出现一些第三方推送服务供应商,如国外的Parse[11],国内的极光推送[12]等。分析它们的技术原理,都是通过心跳包的方式使得网络环境复杂的移动客户端和服务器保持TCP长连接,从而提供稳定可靠的推送服务。在本系统中,为节约成本、快速开发,使用了极光推送的服务进行气象无线传感网内预警信息的推送。
具体的工作流程如图3所示。为使用极光推送服务,Android客户端需要加入极光推送的Android SDK,即1个库文件,借助这个库文件,客户端可以与极光云推送服务器保持较为稳定的长连接,其内部通过心跳包机制实现跳线重连。在本系统的自建服务器中,通过数据收发模块过滤下层网络传来的传感器数据,第一时间检测到预警信息并转交给推送服务模块。推送服务模块收到预警消息后将消息生成统一的JSON格式,然后通过HTTP请求调用极光推送远程API将消息推送出去,数秒钟之内Android客户端用户就能收到Notification形式的预警信息。
2.4 应用层
在本文提出的无线传感器网络监测系统层次结构中,应用层位于最上层,是指可视化的传感网监测、管理客户端,提供用户交互界面。区别于常见的Web管理客户端,该项目中的客户端是基于Android平台的原生应用,其主要功能结构如图4所示。
图4 中Android客户端主要分成5个模块,体现在用户界面上是5个选项卡,每个模块可细分出各个功能类别,详细说明如下:
(1)气象预报模块,即首页选项卡。该模块提供了气象预报服务,通过政府气象部门的Web服务提供全国各大城市7天天气预报查询功能。借助于Android的基站、WIFI或GPS定位,可自动识别当前所在城市。该模块还提供了查看当前传感网内气象数据的功能。此外,借助于各大社交网站提供的API,可以方便的将天气预报或传感网气象数据分享到微博等平台。
(2)历史数据模块,即历史选项卡。该模块提供传感器节点历史数据查询功能,用户选择节点编号、传感器类型和时间段条件后,客户端向Web服务器提交查询请求,客户端得到返回的JSON数据后,将其解析并以列表和图表的形式展示给用户。其中绘制图表时,使用了开源的Android图表绘制库 AChartEngine[13]。
(3)节点管理模块,即管理选项卡。该模块提供了节点状态管理功能和动态路由拓扑图查看功能。其中节点状态管理包括了更新节点的采样频率和工作状态,同时在节点现场借助于Android手机精准的GPS定位可确定该节点的GPS坐标并导入数据库。
(4)地图服务模块,即地图选项卡。借助于第三方地图服务,可方便地在地图上标注出每个传感器节点的地理位置。点击地图上的节点标记,可以弹出气泡对话框显示出当前节点所包含的传感器类别以及最新的传感器数据。同时借助于GPS定位追踪功能,可方便的到达无线传感器网络部署现场找到对应的节点。
(5)应用配置模块,即设置选项卡。该模块主要包括了对客户端的一些配置功能,包括:管理用户账号、配置服务器地址、开关预警推送、客户端更新和反馈意见等。
如上所述,借助于服务平台层提供的Restful Web服务和WebSocket实时通信服务,该Android客户端实现了路由拓扑信息展示、传感器信息查询和节点控制等基本功能。同时,借助于第三方推送服务,通过服务平台层的推送服务模块,实现了预警信息即时推送功能。
3 系统实现与测试
按照如图1所示的系统体系结构组件气象无线传感器网络监测系统,整个监测网络部署在室外环境中。系统具体包括18个传感器节点及6个附加传感器,1个网关,1个系统服务平台和1个Android客户端。
其中18个传感器节点为基于CC2530的自行设计节点(如图5(a)所示),基于TinyOS操作系统组成监测网络。节点电路板的设计可根据需求添加贴片式的温度、湿度和光照和气压传感器,只需烧录对应的驱动程序即可正常工作。这18个传感器节点中的2个节点作为汇聚节点,它们采用太阳能蓄电池直流供电系统作为电源,搭载了功耗较高的工业级传感器,包括了风速、风向、温湿度、气压和雨量传感器。
网关为基于ARM 6410的嵌入式设备 (如图5(b)所示),采用Linux操作系统,通过串口 (RS232)接收汇聚节点传来的数据包,并通过3G、WIFI上传到服务器。
系统服务平台部署在一台Windows Server 2008服务器上。其中数据收发模块和推送服务模块采用C#技术实现,数据库采用MySQL开源数据库。数据服务模块采用Java语言,通过MyEclipse、Jetty和Jersey技术构建RESTful Web服务。
Android客户端基于Google Android SDK (system development kit),采用Java语言编写实现,已在三星i9300,Google Nexus 4等多部手机上安装调试成功。图6展示了Android客户端部分功能效果。如图6(a)所示,用户可以给定条件,查询传感器节点的历史气象数值。当用户点击右上角的查询按钮后,客户端根据请求条件向Web服务器发起HTTP请求,从而得到对应的历史数据集,然后生成表格展示给用户。如图6(b)所示,借助于第三方地图服务,用户可以随时查看传感器节点 (图中气泡状标记)部署的位置以及自身 (实心圆点标记)所处位置。打开该地图选项卡后,客户端后台就与服务平台层的数据服务模块保持了WebSocket实时通信,点击传感器节点气泡标记,就会弹出显示该节点的详细信息。
4 结束语
本文以气象无线传感器网络为应用背景,提出了分层次的监测系统结构,并根据应用需求,设计和实现了可视化的监测、管理系统。其中,感知层的物理感知设备,即传感器节点负责监测环境状态并将采集到的数据包以多跳路由的方式通过汇聚节点、网关 (接入层)上传到服务器(服务平台层)。服务器端通过构建REST风格的 Web服务、稳定的WebSocket实时通信服务等,为Android客户端 (应用层)的可视化数据展示提供了稳定可靠的数据源。同时,利用服务器端的推送服务模块和第三方推送服务,Android客户端实现了高效的预警信息推送功能。本监测系统尚处于原型开发阶段,有些功能仍需完善,如推送功能依赖于第三方服务,后续工作将考虑自行开发推送服务器。此外,考虑提高系统的可扩展性,以满足不同的应用场景。
[1]Jennifer Yick,Biswanath Mukherjee,Dipak Ghosal.Wireless sensor network survey [J].Computer Networks,2008,52(12):2292-2330.
[2]Francisco G Montoya,Julio Gómez,Alejandro Cama,et al.A monitoring system for intensive agriculture based on mesh networks and the Android system [J].Computers and Electronics in Agriculture,2013,99:14-20.
[3]Anthony Marcus,Mihaela Cardei,Ionut Cardei,et al.A pattern for Web-based WSN monitoring [J].Journal of Communications,2011,6 (5):393-399.
[4]LI Ang.Designing and implementation of RESTful workflow middleware[J].Computer Engineering and Design,2012,33(9):3455-3459 (in Chinese).[李昂.REST架构工作流中间件设计与实现 [J].计算机工程与设计,2012,33 (9):3455-3459.]
[5]CHENG Xiaofei.Research and design of Web Services [D].Wuhan:Wuhan University of Technology,2010:18-19 (in Chinese).[程小飞.基于REST架构的 Web Services的研究与设计 [D].武汉:武汉理工大学,2010:18-19.]
[6]JIANG Fengyan,DUAN Huichuan.Application research of WebSocket technology on Web tree component[C]//IEEE International Symposium on Information Technologies in Medicine and Education,2012:889-892.
[7]Tavendo.Autobahn Android [CP/OL].[2013-10-25].https://github.com/tavendo/AutobahnAndroid.
[8]WANG Kefeng.The design and implementation of information push and management system based on Android [D].Dalian:Dalian University of Technology,2012:5-6 (in Chinese).[王克峰.基于Android的信息推送管理系统的设计和实现[D].大连:大连理工大学,2012:5-6]
[9]SHAO Xiaozhe,WU Guoquan,WEI Jun,et al.Design and implementation of messaging service for mobile platform [J].Computer Engineering & Science,2013,35 (9):78-82 (in Chinese).[邵小哲,吴国全,魏峻,等.面向移动平台的消息通讯服务设计与实现 [J].计算机工程与科学,2013,35(9):78-82.]
[10]Androidpn[CP/OL].[2013-10-25].http://sourceforge.net/projects/androidpn/.
[11]Parse [EB/OL].[2013-10-25].https://www.parse.com/.
[12]JPush [EB/OL].[2013-10-25].https://www.jpush.cn/(in Chinese).[极光推送[EB/OL].[2013-10-25].https://www.jpush.cn/.
[13]A Chart Engine[CP/OL].[2013-10-25].https://code.google.com/p/achartengine/.