基于Android的温室环境无线监控系统的设计与实现第5章下.docx
《基于Android的温室环境无线监控系统的设计与实现第5章下.docx》由会员分享,可在线阅读,更多相关《基于Android的温室环境无线监控系统的设计与实现第5章下.docx(15页珍藏版)》请在冰豆网上搜索。
基于Android的温室环境无线监控系统的设计与实现第5章下
(4)数据显示与绘制曲线
在Android系统下,Android的UI操作不是线程安全的,当多个线程同时操作UI时,会导致线程安全问题,因此Android界面的UI操作都是只能在主线程中执行。
监控终端的数据显示和曲线的绘制在主线程进行,但是在Android机制中,如果一条消息处理超过一定时间,Android就会抛出无响应的消息,为了避免数据处理时间过长和使监控终端开发简单化,在数据显示和曲线绘制部分采用Handler消息传递机制。
Handler主要是实现在新启线程中发送消息,在主线程中接收消息和处理消息[50],如图5.10是通过Handler进行数据显示和绘制的执行过程图。
图5.10Handler执行过程图
如图5.10所示数据处理线程通过sendMessage()方法把Message对象发送到MessageQueue消息队列当中,Looper对象从MessageQueue队列读取Message对象,然后把消息对象送给Handler处理,每个线程只能有一个Looper对象。
在主线程中,温室环境数据通过Handler来接收数据处理线程发来的信息,通过Message获取Bundle对象,从而获取对应的有效数据,最后对温室数据进行显示和绘制曲线。
myMessageHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
Bundleb=msg.getData();
envirfo=(Envirfo)b.get("envirfo");
datadisplay(envirfo);
curvedrawing(envirfo);
super.handleMessage(msg);}};
数据的曲线绘制功能是采用Android系统上制作图表的框架AChartEngine。
AchartEngine框架使用简单,如图5.11所示是封装的图表类Curve的成员方法和属性。
图5.11曲线类的方法和属性
如图5.11所示,在Curve类中定义了多个属性和方法,renderer描述的是图表的样式,如曲线的颜色、标题等样式;dataset描述的图表统计数据;draw方法是绘制曲线方法,根据传入的数据对象进行曲线绘制。
3.配置温室环境监控信息
监控终端可以对温室环境监控信息进行配置,其中配置的温室环境监控信息包括温室环境范围修改信息、温室设备状态修改信息、温室监控模式修改信息。
监控终端对温室环境监控信息进行修改之后,向远程服务端发送请求,修改远程服务端数据库中的数据。
监控终端对温室环境监控信息修改后,先把修改信息存储到缓存中,然后由数据上传线程优先把修改信息发送到远程服务端。
4.数据信息的上传
上传的数据分为两大类,分别是温室环境参数数据和配置的温室环境监控信息,上传数据的线程需要对上面两种数据进行分时上传,因此在上传时需要对这两种数据设置上传的优先级。
通过分析知道,配置的温室环境监控信息是最重要的,同时考虑到温室环境监控信息修改频率比较低,因此这两种数据上传的优先级最高的是配置的温室环境监控信息,其次是温室环境因子信息。
配置的温室环境监控信息中的三种数据按温室环境范围修改信息、温室设备状态修改信息、温室监控模式修改信息来上传。
如图5.12是数据上传线程的流程图。
图5.12数据上传流程图
从图5.12中可以看出,当缓存中同时有温室环境因子信息和温室环境监控修改信息时,优先上传温室环境监控修改信息,在数据上传线程中的关键代码如下所示:
if(AlterData.equipmentsize()==0&&AlterData.houseparasize()==0&&AlterData.housemodesize()==0){
if(ReceiveData.size()!
=0){
state=HttpClientUtil.postRequest(receiveurl,ReceiveData.getData());
}
}else{
if(AlterData.houseparasize()!
=0){
state=HttpClientUtil.postRequest(receiveurl,AlterData.gethouseparaData());}
if(AlterData.equipmentsize()!
=0){
state=HttpClientUtil.postRequest(receiveurl,AlterData.getequipmentData());}
if(AlterData.housemodesize()!
=0){
state=HttpClientUtil.postRequest(receiveurl,AlterData.gethousemodeData());}
}
为了能够准确的知道数据是否正确的上传,在代码中添加了校验符state,当数据正确上传后,返回对应上传成功的整数,然后移除缓存中刚上传的数据,当返回-1时,表示没有上传成功,数据需要继续上传。
5.设备控制功能
监控终端具有控制温室设备的功能,温室环境调节设备控制器就是串口继电器,通过控制继电器来控制温室设备。
监控终端通过串口发送开关指令到ZigBee协调器,然后再传输到温室环境调节设备控制器,该控制器使用16路串口继电器便于系统的维护和升级。
当数据处理线程发现温室环境处于紧急状态时,触发设备控制事件,对串口继电器进行操作,并返回操作状态。
对串口继电器操作,有多种组合方式,本文使用“组开”和“组关”模式,如表5.5所示是串口继电器发送帧格式说明。
表5.5串口继电器发送帧格式说明
帧首
设备类
命令
参数0
参数1
参数2
校验和
0x00
0x5A
0x05(组开)
-
-
-
校验和
0x00
0x5A
0x06(组关)
-
-
-
校验和
如表5.5所示,指令发送到串口继电器的帧格式,其命令列的0x05代表一次能使几个继电器吸合,0x06一次能使几个继电器断开,具体哪一个由参数0-2决定,无效的参数建议设置成0x00。
例如当要吸合串口继电器中的Y15、Y13、Y11、Y9、Y6、Y5、Y4、Y3,其他关闭,则参数0的指令为“01111000”,参数1的指令为“10101010”,参数2为“00000000”。
参数0-2的数据在监控终端登录后获取的温室信息,其指令存储在远程服务端设备表中,存储方式统一,如设备表控制为[1xxxxxxx:
xxxxxxxx:
xxxxxxxx]表示打开Y7,其他状态不变。
当监控终端接收到远程服务端的控制命令或现场控制命令后,对命令进行解析,然后发送命令到设备控制器,继电器完成操作后,会立即返回设备状态,让监控终端能够检验操作是否成功。
6.信息的接收与处理
监控终端通过短信接收的信息包括三种,分别为温室环境范围修改信息、温室设备状态修改信息、温室监控模式修改信息。
其流程图如图5.13所示。
图5.13接收控制信息处理流程
在接收到信息时,先要对信息进行分析,如果是温室环境范围修改信息就通知终端修改环境参数范围;如果是设备状态修改信息,查看是控制哪个设备,然后通过串口发送命令到协调器调节温室环境调节设备控制器;如果是监控模式修改信息就通知终端修改监控模式。
在对接收短信进行监听时,需要在AndroidManifest.xml文件中添加监听权限和注册广播,其代码如下所示。
name=".SMSBroadcastReceiver">
priority="1000">
name="android.provider.Telephony.SMS_RECEIVED"/>
name="android.permission.SEND_SMS">
name="android.permission.RECEIVE_SMS">
name="android.permission.READ_SMS">
如上面代码,注册了SMSBroadcastReceiver,当系统接收到短信后就会立即触发onReceive方法,其分析短信的关键代码如下:
Bundlebundle=intent.getExtras();
Objectmessages[]=(Object[])bundle.get("pdus");
SmsMessagesmsMessage[]=newSmsMessage[messages.length];
for(intn=0;nsmsMessage[n]=SmsMessage.createFromPdu((byte[])messages[n]);
}
5.3远程服务端软件设计
本节将对远程服务端功能模块进行设计,对数据进行持久化设计与实现,对远程服务端各个基本功能进行详细设计,并编程实现。
5.3.1远程服务端功能模块设计
根据第三章远程服务端的框架设计和开发方案分析,远程服务端采用MVC分层模式,图5.14是其远程服务端基本功能图。
图5.14远程服务端的基本功能图
如图5.14所示,为系统远程服务端的基本功能图,根据功能将其分为系统管理模块、接收数据与存储模块、查询模块。
在查询功能模块中又包括实时数据查询、曲线绘制、设备/传感器的查询、设备的工作状态、温室作物的信息以及历史数据查询;系统管理功能模块中包括监控终端信息管理、温室信息管理、设备/传感器信息管理、环境参数信息管理以及用户信息管理;数据接收与存储模块包括温室环境数据和配置的温室环境监控信息的接收与存储。
5.3.2数据库设计与数据持久化实现
在对各个功能模块进行设计之前,需要对远程服务端的数据库进行设计和创建,并对使用Hibernate工具持久化进行详细介绍,为实现远程服务端的功能做好准备。
1.数据库的设计
数据库是温室环境无线监控系统关键部分,温室监控系统的温室环境数据、温室设备信息、作物信息、传感器信息、温室信息、温室环境参数范围信息等都需要存储,以帮助远程服务端对温室的管理。
利用数据库可以实现对温室设备状态、传感器信息的统一管理,温室管理人员可以很方便的对温室进行管理,保证温室作物的生长。
以下是对系统的远程服务端数据库表的定义。
(1)温室信息表:
温室信息表包括自动标识、温室名称、温室中监控终端的号码、温室监控模式、温室一些说明,温室信息表的结构如表5.6所示。
表56温室信息表
字段名
字段类型
描述
HOUSE_ID
INT
自动标签
HOUSE_NAME
VARCHAR
温室名称
HOUSE_NUMBER
VARCHAR
终端号码
HOUSE_AUTO
TINYINT
监控模式
HOUSE_COMMENT
VARCHAR
温室表述
(2)温室环境参数范围设置表:
温室环境参数范围表包括自动标识、温室ID、温室的温度范围、湿度范围、光照强度范围、CO2范围。
这些数据能够帮助监控终端查看温室的环境因子数据是否异常,其表的结构如表5.7所示。
表5.7环境参数范围设置表
字段名
字段类型
描述
HOUSE_PARA_RANGE_ID
INT
自动标签
HOUSE_ID
INT
温室ID
TEMPERATURE_MAX
DOUBLE
温度最大值
TEMPERATURE_MIN
DOUBLE
温度最小值
HUMIDIY_MAX
DOUBLE
湿度最大值
HUMIDIY_MIN
DOUBLE
湿度最小值
CARBONDIOXIDE_MAX
DOUBLE
CO2最大值
CARBONDIOXIDE_MIN
DOUBLE
CO2最小值
LIGHTINTENSITY_MAX
DOUBLE
光照强度最大值
LIGHTINTENSITY_MIN
DOUBLE
光照强度最小值
(3)区域表:
为了更精确的控制温室环境,对温室进行分区域,温室分为5部分,即A、B、C、D、E。
其表结构如表5.8所示。
表5.8区域表
字段名
字段类型
描述
AREA_ID
INT
自动标签
AREA_NAME
VARCHAR
区域
(4)温室设备表:
温室设备表包括自动标签、设备序列号、设备名称、设备类型、设备工作状态、设备对应的温室ID、区域ID和设备控制指令。
温室设备表主要帮助温室监控系统控制温室的环境,通过调节设备工作状态来调节环境,其表的结构如表5.9所示。
表5.9温室设备表
字段名
字段类型
描述
EQUT_ID
INT
自动标签
EQUT_CODE
VARCHAR
设备序列号
EQUT_NAME
VARCHAR
设备名称
EQUI_TYPE
VARCHAR
设备类型
EQUT_STATUS
TINYINT
设备工作状态
HOUSE_ID
INT
温室ID
AREA_ID
INT
区域ID
EQUT_INSTRUCTION
VARCHAR
设备控制指令
(5)温室传感器信息表:
传感器信息表包括自动标签、传感器序列号、温室ID、传感器名称、传感器类型、传感器区域ID、传感器说明。
该表记录温室内传感器信息,管理员可以管理这些数据,其表结构如表5.10所示。
表5.10温室传感器信息表
字段名
字段类型
描述
SENSOR_ID
INT
自动标签
SENSOR_CODE
VARCHAR
传感器序列号
HOUSE_ID
INT
温室ID
SENSOR_NAME
VARCHAR
传感器名称
SENSOR_TYPE
VARCHAR
传感器类型
AREA_ID
INT
传感器区域ID
SENSOR_COMMENT
VARCHAR
传感器说明
(6)温室环境参数信息表:
温室环境参数信息表包括自动标签、传感器ID、温室ID、环境参数值、数据的时间。
该表就是存储监控终端发送来的数据信息,其表的结构如表5.11所示。
表5.11温室环境参数信息表
字段名
字段类型
描述
INFO_ID
INT
自动标签
SENSOR_ID
INT
传感器ID
HOUSE_ID
INT
温室ID
INFO_VALUE
DOUBLE
环境参数值
INFO_DATA
DATATIME
时间
(7)作物信息表:
作物信息表包括自动标签、温室ID、农作物名称、农作物类型、农作物栽种时间、农作物收成时间等信息,其表结构如表5.12所示。
表5.12作物信息表
字段名
字段类型
描述
CROP_ID
INT
自动标签
HOUSE_ID
INT
温室ID
CROP_NAME
VARCHAR
农作物名称
CROP_TYPE
VARCHAR
农作物类型
CROP_PLAN_TIME
DATA
农作物栽种时间
CROP_HAVE_TIME
DATA
农作物收成时间
CROP_HAVE_OPERATER
VARCHAR
农作物收成人
CROP_HAVE_WEIGHT
VARCHAR
农作物收成重量
CROP_COMMENT
VARCHAR
农作物说明
CROP_STATUE
VARCHAR
农作物的状态
(8)管理人员登录表:
管理人员登录表包括自动标签、用户名、密码、级别。
该表主要记录管理人员的相关信息,其表结构如表5.13所示。
表5.13管理人员登录表
字段名
字段类型
描述
USER_ID
INT
自动标签
USER_NAME
VARCHAR
用户名
USER_PASSWORD
VARCHAR
密码
USER_GRADE
VARCHAR
级别
(9)监控终端信息表:
监控终端信息表包括自动标签、温室ID、终端登录名、登录密码。
该表主要记录远程监控终端的信息,其表结构如表5.14所示。
表5.14监控终端信息表
字段名
字段类型
描述
AUSER_ID
INT
自动标签
HOUSE_ID
INT
温室ID
AUSER_NAME
VARCHAR
终端登录名
AUSER_PASSWORD
VARCHAR
登录密码
2.数据持久化实现
通过第三章对远程服务端的方案分析,系统的远程服务端使用Hibernate对数据库数据进行持久化,Hibernate持久化框架图如图5.15所示。
图5.15Hibernate持久化框架
如图5.15所示,Hibernate持久化框架演示了Hibernate如何访问关系数据库。
Hibernate从配置文件中读取和数据库相关的信息,通过Hibernate的API对数据库进行相关操作。
在对数据库进行持久化时,首先需要对其进行配置,其配置流程如下:
(1)在MyEclipse中,先使用MyEclipsedatabaseExplorer来连接温室监控系统的数据库(house),配置连接驱动、URL等设置,连接成功。
(2)使用MyEclipse中的HibernateCapabilities功能,远程服务端采用Struts2、Hibernate、Spring整合开发,因此需要在Spring配置文件配置数据源,定义数据源bean,并使用COP0数据源实现,其配置代码如下:
destroy-method="close">
mysql:
//localhost/house"/>
(3)在MyEclipsedatabaseExplorer窗口连接数据库,通过数据库中的表导出实体类和hbm.xml配置文件。
通过Hibernate对数据进行访问时,必须先获取SessionFactory对象,设计直接以配置文件方式对SessionFactory对象进行管理,因此在Spring容器中也要统一配置SessionFactoryBean,其代码如下所示:
com/house/domain/Auser.hbm.xml
com/house/domain/Crops.hbm.xml
com/house/domain/Envirfo.hbm.xml
……..
5.3.3远程服务端基本功能实现
1.接收数据与存储模块
在本章第一节对监控终端与远程服务端的框架进行了整合,并详细分析其数据传输格式。
接收数据与存储模块主要实现接收监控终端发来的数据,并对数据进行识别和存储。
监控终端首先要登录,其远程服务端响应监控终端的登录请求在Servlet中实现,其关键代码如下:
Stringuser=request.getParameter("user");
Stringpass=request.getParameter("pass");
//获取系统的业务逻辑组件
AuctionManagerauctionManager=(AuctionManager)getCtx().getBean("mgr");
intuserId=auctionManager.validLogin(user,pass);
response.setContentType("text/html;charset=GBK");
if(userId>0)
{request.getSession(true).setAttribute("userId",userId);}
try{JSONObjectjsonObj=newJSONObject().put("userId",userId);
//输出响应
response.getWriter().println(jsonObj.toString());}
catch(JSONExceptionex)
{ex.printStackTrace();}
当监控终端登录成功后,通过HouseParametersServlet请求获取温室监控所需数据。
监控终端上传的数据有温室环境因子信息和温室环境监控修改信息,远程服务端对不同请求分别通过ReceiveDataServlet、AlterDataEquipmentServlet、AlterDataHoueseParaServlet、AlterDataHouseModeServlet四个类来实现,完成数据库的操作。
2.查询模块
系统查询模块实现的主要功能包括设备状态、实时数据、历史数据、温室信息、温室农作物信息、设备/传感器信息等,其查询模块的流程图如图5.16所示。
图5.16查询模块处理流程图
用户请求后,请求先直接转到Spring事务处理层,然后通过调用对应的业务逻辑类,再通过DAO类对数据库进行操作并最终显示到JSP页面上。
(1)温室实时数据查询:
远程服务端的实时数据查询使用了Ajax技术,通过异