system: [SYSTEM]

user: 2. 系统设计与实现 2.1. 系统总体设计 准确采集和掌握果园中的环境信息和果树的生长信息等是实现果园精细管理的前提。果园中的环境变化，对果树的生长影响很大，及时得到果园中的环境信息，有利于促进果树的健康生长和提高果品的质量 [ 4 ] 。本研究的研究目标是设计一套高效、科学、经济的果园信息采集系统。使用基于Android的无线手持终端PDA(果园信息移动采集系统)采集果树的多种环境信息，然后把数据传给服务器(果园信息远程接收系统)进行处理，同时在PDA上进行可视化展示。具体目标如下： 1) 设计并构建基于移动终端和物联网的果园信息采集系统 PDA通过串口连接到的ZigBee模块来采集ZigBee田间无线传感器网络采集得到的果树信息，使用PDA内置的GPS或者无线网络(基站定位、WIFI定位)获得果树位置信息(经度、纬度)，同时通过PDA自带RFID (无线射频标签)阅读器读取果树的标签信息。获得信息后，PDA通过自定义的通讯协议把数据发向服务器，同时在PDA上更新地图，即更新果园边界信息、果树信息。 2) 设计并开发服务器端果园数据交换接口 服务器端提供与PDA交换数据的接口，提供给PDA所需果园地图和果树信息等数据；接收PDA上传的信息后，按照协议解包并把数据存入服务器端的数据库，同时将结果信息反馈至目标PDA。 为实现上述目标，本文从经济可行性、技术可行性、可维护性三方面进行了设计。本系统开发大量采用开源产品，从而将开发成本降到最低。果园信息远程接收系统采用Visual Studio IDE、C#语言进行开发，数据库采用MySQL，果园信息移动采集系统采用Eclipse IDE、Java语言进行开发。Android采用WebKit浏览器引擎，具备触摸屏、高级图形显示和上网功能，用户能够在手机上查看电子邮件、搜索网址和观看视频信息等，有强大的搜索功能和界面，可以说是一种融入全部Web应用的单一平台 [ 5 ] 。整体架构如图1所示。 图1. 苹果果园信息采集系统整体架构图 2.2. 果园信息移动采集系统设计及其主要功能实现 系统需要采集的信息为果园边界信息、果树信息，其中果园边界信息为边界的经度、纬度、边界点的索引以及采集时间。果树信息包含果树的基本信息(经度、纬度、RFID、采集时间)和属性信息(土壤温度、土壤湿度、空气温度、空气湿度等)。其中RFID通过RFID读取器读取，四个属性信息通过串口连接的ZigBee模块读取ZigBee网络的信息来获得。 2.2.1. 果园边界管理 果园边界管理主要是果园边界的增加、删除最近的一个边界、删除所有边界点等等。果园边界主要保存的信息是经度、纬度和索引值，索引值是指这个边界点为整个边界的第几个点。在绘制边界时，按照前后相连、首尾相连的形式绘制边界，边界点的顺序不能出现混乱。边界类使用百度地图提供的GeoPoint类，所有边界点保存在ArrayList boundary对象中。 边界的删除，只提供删除所有边界点和删除最近的边界点。如果提供删除部分的话，很容易出现边界混乱的情况。提供删除最近的点可以减少因失误而造成的误差，删除最近点可以从尾部删除到头部(类似后退栈)，但是不允许删除所有边界点中的几个点，即从中间删除点。当然，为了避免用户误删除，在重要的删除操作前都提供人性化的确认操作，以防止误操作。通过boundary。add()来添加边界点，通过boundary。remove(boundary。size()-1)来移除最近的边界点，通过boundary。clear()来删除所有的边界点。 2.2.2. 果树信息管理 果树的信息管理包括果树的增加、果树的删除、果树的编辑、果树的属性信息采集等等。果树操作单独封装成一个类，即TreeOperation类。增加果树基本信息时，首先判断该果树是否已存在，如果存在，则提示“该树信息已经存在”。如果不存在，则通过trees。add()函数新建果树信息。通过addTreeCollectInformation方法采集果树信息。updateTreeBase方法实现果树基本信息的更新。调用updateTreeBase方法删除指定的果树及其信息。当全部果树信息采集完成后，统一上传到服务器。 2.2.3. 果园数据管理 果园的数据管理，即数据的下载(数据接收)、数据解析、数据打包、数据上传(数据发送)，也即数据交换协议的实现。协议实现建立在Socket之上。移动端数据上传模块流程如图2所示： 图2. 移动端数据上传模块流程 首先建立Socket连接，使用UTF-8编码获得输入流/输出流并发送数据。在Socket基础上，封装了CommandExector类，进行协议中描述的各种工作。比如，获得果园边界信息，发送果园边界信息。在发送数据前和获得返回数据后要对果园数据进行加工，即数据的打包与解析。以果园边界为例，讲解打包与解析。打包过程如下，首先，读取boundary对象中的GeoPoint对象的经纬度信息，按照“在boundary中的索引，经度，纬度，更新时间@下一条记录”把数据转换为String，然后通过CommandExector发送相应的命令。解析过程基本算它的逆过程，不过没有更新时间而已。从String中按照“@”分离一条记录，然后按照“，”分离一条记录中的经纬度，然后实例化一个GeoPoint对象，并把它添加到边界数组中。代码如下： public class BoundaryParser { /** * 把客户端的边界点转换为String 数据格式为 使用@符号作为不同边界点区分符 索引点，经度，纬度，更新时间@下一条记录 * 1，10。3，12。2，2018-05-21 12:30:43@下一条记录 * */ public static String boundaryToString(ArrayList boundary) { StringBuilder sb = new StringBuilder(); int length = boundary。size(); if (length == 0) { } else { for (int i = 0; i < length; i++) { sb。append(i + );// 第几个边界点 sb。append(boundary。get(i)。getLongitudeE6() * 1。0 / 1。0E6 + );// 经度 sb。append(boundary。get(i)。getLatitudeE6() * 1。0 / 1。0E6 + );// 纬度 SimpleDateFormat sdf = new SimpleDateFormat( yyyy-MM-dd HH:mm:ss); sb。append(sdf。format(new Date()));// updatetime if (i != length - 1) sb。append('@');// 用#分隔每条记录，最后一条记录不加# } } return sb。toString(); } 2.2.4. 可视化管理 可视化管理主要是指地图的初始化、边界以及果树在地图上的可视化、图层的管理、定位管理等等。地图使用的是百度Android地图API，相关使用说明请参考百度地图开发者官网 [ 6 ] 。定位也使用百度定位API，该API支持GPS、无线基站、WIFI基站三种定位方式。图层有4个图层。这里有基本图层，显示基本的坐标信息；定位图层，显示定位的图层信息；树图层，显示当前树位置的图层；边界图层，显示果园边界的图层。百度地图初始化时，设置位置信息更新时间为15s(可人为点击菜单中的定位刷新、该功能不受15s时间限制)，定位方式为GPS优先(其次为基站以及WIFI定位)，交通图以及卫星图不可见，同时注册相应的监听，启动时自动定位到当前位置。为了不阻塞UI线程，定位采用异步定位，获得定位信息后，使用Handler发送更新地图信息，Handler收到消息，从而更新地图。 2.2.5. 硬件管理 硬件管理主要是读取RFID、读取ZigBee网络信息、读取设备IMEI等等。RFID可使用PDA自带的RFID阅读器进行读取，通过JNI调用libtiny-tools。so(即NDK编程)来实现相应的操作 [ 7 ] 。ZigBee网络信息主要包含果园的属性信息，即土壤温湿度、空气温湿度等。RS232 device为ZigBee模块，Converter为RS232串口转换器，Anroid Device为果园信息移动采集系统，果园信息移动采集系统必须工作在主模式，从模式无法接受和发送数据 [ 8 ] 。ZigBee网络信息读取功能主要通过ZigBee硬件部分实现，软件编写时主要是编写与ZigBee相连的串口操作即可 [ 9 ] 。ZigBee模块也采用NDK编程，通过JNI调用libserial_port。so来实现相应的操作 串口每次发送的数据形式如下： $287b，3000，8112，3415，4197 $地址，空气温度，空气湿度，土壤温度，土壤湿度 2.2.6. 其他辅助管理 辅助管理主要包含加载页面的设计、用户登录、设置、帮助、操作日志、关于等等。程序的加载页面除了显示“系统正在加载中，请稍后…”外，还会随机的显示一条励志的句子，使用随机数，同时使用系统当前时间作为种子 [ 10 ] 。用户登录调用数据管理模块CommandExector进行登录以及获得任务编号。登录采用多线程进行登录，避免UI卡死。登录成功后，服务器返回登录凭据，果园信息移动采集系统把凭据存在OrchardCollectionConfig。accessTokenString中，之后每次进行请求时，都把凭据带上 [ 11 ] 。设置主要是进行服务器的IP、端口设置、ZigBee串口设置以及果园信息移动采集系统的退出确认设置。退出确认可防止程序误按而导致程序退出。帮助显示系统使用相关帮助，关于显示系统当前版本号。操作日志，在本地用SQLite数据库记录每次数据的下载上传情况，人为可刷新记录、删除所有记录。 2.3. 果园信息远程接收系统 协议实现建立在Socket之上，实现与果园信息移动采集系统实现基本相同，由于编程语言为C#，与Java稍微有些不同，思想大同小异。果园信息远程接收系统启动后，一直监听来自果园信息移动采集系统的请求，若有请求，则新建一个线程来处理该请求，防止阻塞其他果园信息移动采集系统的请求以及UI线程，同时继续监听其他果园信息移动采集系统的请求 [ 12 ] 。线程处理完请求后，自动结束线程。停止以及关闭窗体后，服务器停止监听。