毛 林, 王永红, 刘雪兰, 程 涛, 周 鹏, 沈茂梅
(江苏农牧科技职业学院,江苏泰州 225300)
农业物联网综合运用无线通信、无线射频识别(radio frequency identification,简称RFID)、微电子、嵌入式、分布式系统等技术,通过电子、无线传感等设备,按约定通信协议将物与物相连接进行信息互联互通、交换和共享,突破了农业生产、经营、管理受制于环境、地理、气候等因素的不利影响和限制,使传统农业快速向现代设施农业方式转变。温室(群)环境监控系统是基于物联网的设施农业自动化管理系统,在智慧农业发展中扮演着重要角色,可以对温室(群)、连栋温室生产环境进行精准识别、定位、感知、监测、控制等,提升农业生产信息化、自动化、智能化管理水平,实现管理效能和经济效益最大化目标。
温室(群)监控物联网系统能够支持以网站、Web浏览器、视频等客户端访问方式提供近距离或远程监测与控制管理。随着3G/4G通信技术与装备的快速发展与应用,运用移动互联技术构建面向智能终端应用的远程监控系统,可随时随地为用户提供方便快捷的服务。本研究结合江苏农牧科技职业学院园艺温室(群)物联网平台——JYP平台,进行移动终端业务流程分析及功能设计,重点研究服务数据交换、数据转换、客户端通信、数据解析等关键技术及实现方法,提出基于Android的远程温室监控智能终端解决方案,以期提升现代设施农业自动化、智能化管理水平、效率、服务质量等,具有示范效应和现实意义。
JYP平台分本地系统(下位机)、远程系统(上位机)、中间网络,由底层硬件系统、无线传感网络(wireless sensor networks,简称WSN)、网关、远程服务器、远程客户端、监控屏幕等构成(图1)。底层(感知层)无线传感网络是平台环境数据的主要来源,采用层次分簇异构增强型结构[1-2],纵向与横向上具有良好的伸缩性、可扩展性,适应感知对象、监测范围、覆盖密度、感知数据、通信距离等变化要求,满足大规模复杂形态的服务质量需求[3]。JYP平台包括数据采集、远程监测、历史数据查看、远程控制、视频监控、紧急报警等功能模块,采用基于Java2平台企业版(Java 2 platform enterprise edition,简称J2EE)的SSI(Struts 2.0+Spring 2.0+iBatis)开源框架部署、整合应用程序,实现总体业务联动。JYP平台业务流程包括数据采集与处理、远程传输、统计分析、实时浏览、报警、视频监控等(图2)。通过平台业务流程,完成现场实时环境数据的采集、转换、压缩、融合处理和远程传输[2],提供数据持久化存储、统计分析处理。用户可随时随地登录平台进行环境监控,浏览现场温度、湿度、光照度、CO2浓度等变化,查看历史数据、监测报警、浏览监控视频,实现远程控制。
智能终端系统架构为基于客户端/服务端的3层结构:Android客户端、服务端、3G/4G移动网络(通信链路层)(图3)。客户端系统部署在智能终端设备(如智能手机、平板电脑、掌上电脑等),提供无线通信接口、数据解析等中间层业务组件,为用户查询、控制等应用服务所调用。底层操作系统(Android系统)、硬件、移动网络、软件工具作为应用服务的支撑平台。移动终端存储空间和计算资源有限,本地数据存储、处理要求不高时,可满足轻量级应用需求,保证客户端系统基本性能要求[4]。
服务端构建于JYP平台服务器,平台服务器搭建云计算平台,包括基础设施即服务(infrastructure as a service,简称IaaS)、平台即服务(platform as a service,简称PaaS)、软件即服务(software as a service,简称SaaS)等3层,提供多操作系统、虚拟化硬软件资源,统一调度管理资源使用,承担海量数据存储、计算、复杂业务处理,快速提供用户所需服务[5]。在JYP平台开发服务端数据交换接口、数据转换处理等业务组件,满足客户端数据访问需求。
平台服务器为智能终端客户端提供远程访问、查询环境数据。客户端登录后进入软件操作界面,发送监测、查询、控制远程访问请求时,经互联网服务提供商(internet service provider,简称ISP)移动通信网络提交至服务器,首先访问服务端接口,测试与平台服务端建立连接。连接成功后,服务端与客户端建立会话(Session),服务端生成客户端唯一的专属标志(SessionID),保存客户端标志,在会话期间识别客户端。服务端交换接口接受访问请求信息,调用相关业务组件查询数据库,获取所需信息内容,转换为预定交换格式数据后返回给服务端接口,连同客户端SessionID一并发送至客户端。客户端验证来自服务端的SessionID后,接受数据并解析数据,通过操作系统将最终结果展示到客户端用户页面[4]。系统的业务流程如图4所示。
Android为Google发布的主流开源智能终端操作系统,是基于Linux的开放式嵌入式系统。Android智能终端(如智能手机、平板电脑、掌上电脑等)使用广,占据目前国内用户市场80%以上的份额。因其版本更新快、功能强大、开发效率高等特点,深受业界欢迎。Android系统包括活动(activity)、服务(service)、组播接收器(broadcast receiver)、移动数据内容提供商(content provider)等4个组件,内置控件箱拥有丰富、美观的用户控件,支持轻量级数据库SQLite数据存取,提供多媒体、网络接口通信、全球定位功能和通用工具类服务[6]。
本研究的设计选用Google官方开源集成开发环境工具Android Studio开发客户端系统。Android Studio集成了Android所有软件开发工具包(包括ADT、第三方开源库等),开发环境更易于搭建,与Eclipse相比,仅须配置少数额外插件,功能、效率、便捷性较高[6]。服务端基于J2EE架构的视图-模型-控制器(model-view-controller,简称MVC)设计模式[5],部署SSI轻量级开源框架[7],使之与JYP平台相一致。Struts框架使Web服务交换层与控制层相互分离,iBatis充当数据访问(data access object,简称DAO)层数据库访问组件,Spring框架组装和管理全局应用程序,实现数据交换接口与数据库的交互。SSI自适应、可扩展的半成品框架特性,使服务端应用开发与维护更加快捷、便利、高效。
服务端部署于JYP平台服务器,服务端应用程序工作区src的com.jyp.mobile包括以下分层(图5):Web服务交换(webservice)层、控制(action)层、业务(biz)层、数据访问(dao)层、持久化(PO)层,各层仅含1个组件(组件内定义并实现业务方法),避免组件过多引起服务端资源开销过大问题,利用SSI框架简化应用程序组装,以即插即用的方式管理全局应用程序,降低软件模块耦合度,减少系统开销、提高运行效率。
3.1.1 数据交换 Web服务接口实现服务端、客户端之间的交互和数据交换。Web服务运用SOAP、WSDD、XML、UDDI在服务端应用程序上对外共享开放式网络服务,提供客户端远程访问服务端功能,运用消息或请求服务发现处理机制,接收网络请求、做出响应[4]。互联网应用中,超文本传输协议(hypertext transfer protocol,简称HTTP)是网络通信的普适标准[8],提供了Webservice交换接口规则描述,被网络信息系统广泛用于Internet网络资源定位与交换服务。
基于Webservice及HTTP规则开发服务交换接口,开发过程:(1)设置Web服务交换地址,JYP平台服务端应用程序包括6个服务接口,即用户登录(http://localhost:8080/jmob/jmob_login.action)、实时监测(http://localhost:8080/jmob/jmob_monitor.action)、远程控制(http://localhost:8080/jmob/jmob_control.action)、紧急报警(http://localhost:8080/jmob/jmob_alarm.action)、历史查询(http://localhost:8080/jmob/jmob_statistics.action)、基础设置(http://localhost:8080/jmob/jmob_setting.action),按顺序从1开始编号,分别与客户端通信接口地址统一资源定位符(uniform resource locator,简称URL)对应。(2)设置接口交换规则。根据HTTP协议为交换接口定义交换规则,包括请求参数、HTTP请求方法、消息类型及处理方式、返回值等。这里以登录请求接口为例描述接口规则(表1),其他接口除请求参数种类、个数、功能不同外,其他规则类同。(3)配置和发布Web服务。在JYP平台项目WebRoot/WEB-INF目录deploy.wsdd文件中配置(配置代码见图6),指示对外共享的Web服务类MobService;配置完成后,使用Apache axis2发布工具AdminClient发布Web服务,在服务端IE浏览器地址栏中输入http://localhost:8080/AxisWebService/servlet/AxisServlet进行测试,显示发布成功信息。
交换接口通过业务组件与底层数据库交互,服务端数据交换过程:(1)Spring容器监听来自客户端的通信请求,获取请求访问的服务端接口,传递给交换层组件MobileWebService;(2)struts.xml中配置MobileWebService调用action层组件mobileAction业务方法,如登录(login)、监测(monitor)、历史查询(statistics)、控制(control)等,将请求参数打包成持久化对象PO或HashMap对象;(3)Spring框架定义action层、biz层、dao层组件调用,通过applicationContext.xml配置依赖注入(dependency injection,简称DI)和反转控制(inversion of control,简称IoC)实现;mobileDao.ibatis.xml(ibatis框架)中注册sqlMap标签访问数据库,执行指定的结构化查询语言(structured query language,简称SQL)查询操作。
3.1.2 数据转换 网络上传输数据一般是XML、JSON数据格式的数据。数据交换接口接受客户端HTTP请求做出响应,调用各层业务组件查询数据库,若读取到了数据,则返回结果。包括3种类型数据:HashMap、持久化对象Vo、ArrayList(存储持久化对象PO的顺序列表)。服务端交换接口不能将这种数据直接通过网络发送到客户端,而须要预先进行数据转换处理。JSON为轻量级交换格式数据,有效压缩了数据容量,网络宽带占用小、传输效率高,可快速送达客户端。与XML、PULL、SAX等解析方法相比,JSON数据大大降低或消除了Android解析的复杂性,客户端读取、解析简单方便[9]。
表1 Web服务交换接口规则
本研究的设计是在action层的mobileAction组件中完成数据格式转换的。服务端数据转换过程:(1)在mobileAction中定义转换方法parseDataToJson(data),data为来自数据库返回的数据,data包括HashMap、持久化对象Vo、ArrayList等3种类型。(2)parseDataToJson中依据data类型,将data转换成JSON格式数据,JSON数据通过JSONObject或JSONArray实例对象来存储(图7)。(3)当data为HashMap或Vo时,以JSONObject保存JSON。HashMap使用get(key)取得键值对key-value(键值对可包括多个,key唯一),Vo使用getXXX属性方法获得键值对。通过JSONObject实例的put(key,value)保存键值对到JSONObject中。(4)data为ArrayList时,利用get方法依次取出Vo,将Vo中的键值对保存到JSONObject,再使用put将JSONObject保存到JSONArray。
客户端系统包含用户登录、环境监测、控制、历史查询、报警等功能模块。Android系统中,视图与业务是相互分离的。客户端包括登录界面、主界面和若干功能界面,界面中安放Button按钮、ListView列表、Spinner下拉框、DatePicker时间、ImageView图片等控件,添加HelloCharts 图表绘制工具,界面布局、控件样式通过LinearLayout、RelativeLayout等布局方式设置,在res/layout工程目录xml文件中进行定义和编辑。activity充当事件处理器,绑定视图界面,接收事件对象或消息,进行业务处理,将处理结果展示到视图界面。activity通过AndroidManifest.xml注册生效。activity事件处理程序是用户进入界面时,首先由onCreate保存当前的activity状态,setContentView锁定用户界面;当用户操作时,监听器onClickListener监听事件对象,触发onClick事件对用户操作执行1次业务处理。activity可通过Intent对象转向另一个activity,实现在客户端不同界面切换,响应速度快。客户端功能实现中,接口通信、数据解析是activity事件业务处理的关键。
3.2.1 通信接口 通信接口负责与远程服务器交互,包括测试连接服务端、发送远程请求、与服务端建立会话、接收返回结果。本研究的设计采用自定义外部公共类ClientUtility,类中定义重载方法getJSONByInterface来创建客户端通信接口。通信接口实现步骤:(1)在getJSONByInterface中为HttpURLConnection实例对象设置请求访问的服务端交换地址URL、提交方式(GET/POST)、时延(Timeout)、协议头类型(Content-Type)、是否允许缓存(UseCaches)等特性,设置参数由外部Activity调用时传入;(2)通过JSONObject将请求参数包装成支持网络传输编码格式HTTP.UTF-8的键值对,存入JSONArray;(3)JSONArray转换成String字符串,再经getBytes转换后写入BufferedOutputStream(缓冲字节输出流),追加到URL,以POST方式提交,测试连接服务端;(4)通过getResponseCode获取服务端响应码,判断连接状态,响应码为200时表示已建立连接;(5)连接成功后,获取服务端响应数据,包装成BufferedReader(缓冲字符流),读取BufferedReader保存为字符串responseData,再使用decodeUnicode解码成UTF-8编码格式的JSON数据;若是初次连接,还须通过HttpURLConnection的getHeaderFields获取服务端分配的客户端标志,存入客户端Cookie中。
客户端系统涉及登录、实时监测、历史查询、远程控制等多项操作,每项操作都须执行接口通信、数据处理。用户操作时,绑定用户界面的Activity作为主线程,Activity内部onCreate、onClick开启子线程来调用通信接口,通信结束后,关闭子线程、返回主线程,确保主线程畅通,增强用户体验。客户端通信过程为(1)初次登录访问时,Activity开启子线程调用接口方法getJSONByInterface,传递登录接口地址http://localhost:8080/jmob/jmob_login.action及登录帐号、密码,提交至服务端;(2)与服务端连接成功后,服务端返回响应数据,读取状态码验证通过后,保存客户端标识编号,返回主线程;(3)用户点击进入其他界面进行监测、查询、控制等操作时,开启子线程再次调用getJSONByInterface,传入对应服务接口地址URL、客户端SessionID等相关参数后提交服务端,服务端返回响应结果,读取状态码有效且返回值不为空时,提取响应结果,经UTF-8解码存储JSON数据,进行后续解析处理。
3.2.2 数据解析 从服务端响应数据中提取JSON数据,不能直接用于视图界面。数据解析的目标是,将JSON数据转换为加载到可视化操作界面的显示数据,包括数字、文本、符号、图表等。JSON数据分2种类型(图7),一种是键/值对集合对象;另一种是键/值对集合的有序列表。对于前者,解析时通过JSONObject的getString(key)方法一一获取所有键/值对,封装成持久化对象Vo;对于后者,解析较复杂,须同时利用JSONArray和JSONObject将JSON数据转换为持久化对象Vo的列表ArrayList。本研究的设计使用GSON方法解析JSON数据[10],GSON开源库由Google提供,利用GSON解析、处理复杂类型数据时,更加简单高效。解析过程是(1)在ClientUtility类中自定义解析方法getDataFromJSON,通信接口子线程结束后,Activity主线程启动子线程调用该方法,并传递JSON数据jsonResponse;(2)getDataFromJSON分析JSON类型,通过Gson实例方法fromJson直接转换,若为JSONObject时,转换为Vo对象,若是JSONArray则转换为ArrayList
本研究实例中,根据JYP平台实际数据为样本,测试智能手机客户端系统,用户登录后进入功能主界面。通过实时监测模块可查看各温室的实时环境监测值,展示动态数值变化曲线,可通过手动方式滚动查看;选择远程控制模块时,可根据当前环境状态开启/关闭执行机,调节温度、湿度、光照度、CO2浓度等参数至合理区间;通过历史查询模块可显示某段时间内环境监测最高值、最低值、平均值等信息;进入紧急报警模块后,通过开启/关闭按钮,可对监控温室报警地点启动或关闭报警;基础设置模块可设置温度、湿度、光照度、CO2浓度等参数的上下限阈值(图9)。通过系统测试,能够达到智能手机远程监控管理的目标。
以温室(群)远程监控智能终端为研究对象,结合园艺温室物联网平台JYP架构及业务,采用Android、SSI框架、Web服务、HTTP等技术,设计开发智能终端服务端与客户端系统。重点研究服务接口交换、数据转换、客户端接口通信与数据解析技术方法,提出了面向Android的远程温室监控智能终端解决方案。通过系统测试,智能手机以快捷、便利方式,获得来自现场环境感知数据,监控实时环境变化情况、查询历史数据,获取报警信息、进行远程控制,实现温室自动化管理。该方案将移动互联与农业物联网应用相融合,提高了设施农业智能化、自动化管理服务效能。