1. 引言
血吸虫病是由血吸虫寄生于人和多种哺乳动物而引起的一种地方性人畜共患的寄生虫病。钉螺是血吸虫病主要的中间宿主,连续两年以上查不到感染性钉螺是实现血吸虫病传播控制目标的一个关键指标 [1] 。在工程现场进行查螺和灭螺工作是检测和治理血吸虫病的重要途径。在移动终端技术高速发展的今天,具有GPS定位功能的移动设备迅速普及,基于位置的服务(LBS)将成为互联网的重要发展趋势。Android系统的发展和4G网络的普及为此提供了技术支持。本文主要使用了Baidu Maps API,实现了准确查找任务区域,减小了现场查灭螺的误差,从而实现了血吸虫病数字化的检测和治理工作。
2. 整体方案设计
2.1. 软件总体设计
血吸虫病防治系统主要由两部分组成:基于WebGis和MIS的Web端负责管理和发布任务,并对结果进行分析显示;基于Android的手机客户端领手机地图服务完成Web端指派的任务,并将工程现场的数据更新至数据库。两者通过数据库进行交互。整个系统结构如图1所示。
2.2. 手机软件功能
手机软件主要由前台用户界面和后台服务组成。用户界面UI设计主要使用的是Google的Materail Design实现的。Material Design 是专为设计适用于多个平台和设备的视觉、运动与互动效果而制定的综合指南。主要包括登录注册、查看定位状态、任务显示、新建任务、查螺任务、灭螺任务等几部分组成的。后台服务包括GPS功能的开启,获取当前的经纬度信息,使用HTTP与服务器通信,存储相关的现场信息、校验API Key和当前的网络状态并发送广播、百度地图SDK对应的服务。后台服务获取和处理数据,将相应的数据呈现给用户。图2为软件的功能图。
3. 软件设计详细
3.1. 登录模块
由于管理端发布的任务都是与用户相关联的,如果未登录的话,就无法领取相关联的任务,这也体现了这个系统的完整性和封闭性。为了方便用户的使用和操作,这里实现了自动登录和保持登录的功能,避免了用户在退出后需要重复登录的问题。
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置参数,它是采用xml文件存放数据的,文件存放在/data/data
/shared_prefs目录下。本课题中,将用户名和密码保存在一个单例中,每次进入APP,将这些信息保存在Application中,程序每次运行时,会创建一个Application类的对象,用来存储相关的全局变量,实现自动登录。要切换用户的时候,点击退出登录,清除SharedPreferences中的数据。
3.2. 任务显示
任务显示使用的是SortableTableView。它是一个可排序的表格控件,主要包括了一个简单的TableView以及更高级的SortableTableView。使用该控件可将任务按照任务编号、时间和紧急程度信息显示给用户,方便用户领取任务。在显示过程中,需要填写任务信息,需要自定义实现TableDataAdapter,将对应的数据写入table cell中。设置Header视图的数据跟设置table cell一样,同样是继承TableHeaderAdapter来实现对应方法。通过设置comparater,SortableTableView将自动在列的header旁边显示一个可以排序的指示图标。点击这个header,table将按照给定的Comparator升序排列,如果header再次被点击将按照降序排列。
3.3. 地图服务的应用
3.3.1. 百度地图
本课题选用的是百度地图提供地图服务。从信息含量上看,百度地图的城市地理信息更详细,资料较新。同时,百度地图对于开发者很友好,接口全面针对手机开发的应用场景提供了两套解决方案。一种是原生的内嵌SDK形式,还有html5轻量级的解决方案(JavaScript API极速版)。坐标数据管理提供了LBS云,技术支持非常不错,功能比较全面,可以满足本课题的需求。
百度地图API是一套为开发者免费提供的基于百度地图的应用程序接口,包括JavaScript、iOS、Andriod等多种版本,提供基本地图、位置搜索、路线规划等数据服务 [2] 。百度地图为开发者提供了com.baidu.mapapi.map地图包,主要负责控制地图的显示,下面是本系统开发中用到几个主要的类 [3] :
MapView:显示地图的View,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图。它和Button等控件定义类似,通过findViewById方法获取,建立类文件时继承Activity即可。
MapController:地图控制器,用于控制地图的移动,放大,缩小等功能。MapView调用函数MapView.getController()获取MapController实例。
Overlay:覆盖物,即在百度地图上进行二次开发时添加的图层类,可以设置在地图上显示图标,文字等信息,通过在底层地图上添加图层来满足我们的应用需求。Overlay是一个基类,它表示可以显示在地图上方的覆盖物。
3.3.2. 定位功能的实现
手机地图定位是获取用户当前位置信息,并将手机或移动端用户位置信息在手机上标识出来的技术和服务,是一种基于位置的服务(Location Based Server)。它利用移动网络的基站群、手机终端以及手机自带的定位设备,获取手机用户当前的位置信息(经纬度、坐标等),并将这些信息提供给用户。本功能的实现依赖百度地图的定位SDK,包括Location (定位SDK核心类)、LocationClientOption (用于设置定位SDK的各个配置参数)、BDLocation (封装定位SDK的定位结果)、BDLocationListener (定位请求回调接口)等。关键步骤如下:
① 初始化LocationClient类。该类必须在主线程中声明,需要Context类型的参数;
② 配置定位SDK的参数。设置定位啊参数包括:定位模式(高精度定位模式、低功耗定位模式、仅设备定位模式),返回坐标类型,是否开启GPS,是否返回地址信息等。主要通过setLocationMode方法、setCoorType方法、setIsNeedAddress方法和setOpenGPS方法实现的。
③ 实现BDLocationListener接口。在BDLocationListener接口中,OnReceiveLocation方法需要实现,它接收异步返回的定位结果,参数类型是BDLocation类型参数。
④ 通过LocationClient实例的start方法开启定位 [4] 。
3.3.3. 围栏的建立与地理位置验证
地理围栏服务提供的是基于位置的提醒服务,相对于SDK原来踢动的位置提醒功能,地理围栏服务通过SDK本身的内部逻辑,大幅度降低了位置提醒服务的功耗情况,GeofenceClient是地理围栏的核心类。但是现阶段的百度地图提供的围栏服务只支持圆形且半径在500 m以内的围栏。本课题需要查灭螺的区域大部分都是不规则的,因此我们需要自己去定制实现围栏功能。
目前百度地图SDK支持多种类型的覆盖物,可以满足用户的各种需求。用户可根据自己的实际需求自由添加各种类型的覆盖物,且不会产生冲突。从API中可以看到,baiduMap类有一个抽象类Overlay,我们可以通过实例化它的子类CircleOptions (圆形覆盖物选型类)、PolygonOptions (多边形选型类)来实现圆形围栏和多边形的围栏。
在新建的围栏的基础之上,通过BDLocationListener中返回的当前点的坐标,判断是否进入围栏,来实现位置的校验。由于地图自带的围栏是有判断是否进入围栏的接口,在这里,我们模拟地图提供的围栏的功能,在知道围栏坐标和当前位置的情况下,判断点是否在多边形内,来判断当前位置,从而实现了位置预警功能。
3.4. 数据存储
Android 提供了四种数据存储方式:SharedPreferences、File、Content-Provider、SQLite。由于SQLite 不像Oracle、MySQL那样需要安装,启动,它只是一个文件,并且支持绝大多数的SQL语句,通过execSQL (String sql)方法就可以执行SQL语句。在本次应用开发中,选择SQLite来存储数据 [5] 。
SQLite 数据库SQLite数据库是一个嵌入式关系型数据库,具有小型、开放的特点,由Android提供,主要用于结构化的数据存取,支持SQL语句。目前他的应用非常广泛,不仅支持Windows/Unix/Linux等主流的操作系统,还支持PHP,JAVA多种程序语言。SQLite占用资源少,并发处理线程,非常适合在手机上使用。
在该课题中,SQLIte用来存储任务数据,防止反复向服务器请求数据,消耗流量。
3.5. HTTP通信
移动客户端所推送或获取的内容主要分为两种:文本和文件。但无论是文本还是文件就,都必须按照HTTP的规范进行编码,即HTTP实体。在HTTP客户端通信方面,Android平台引入了Apache HttpClient包,并在其基础上进行了扩展。手机移动客户端通信要做的内容可以归纳为三步:第一步,将推送内容或请求参数按照适用的HTTP实体进行编码;第二步,执行HTTP Client的方法将HTTP实体内容传送给服务端;第三步,从服务端返回的实体中获取执行结果 [6] 。图3为http协议的业务流程。
3.6. 基于JSON的数据通信过程
JSON是一种轻量级的数据交换格式,是基于EcmaScript的一个子集。JSON采用完全独立于语言的文本格式 [7] 。JSON采用两种结构:
(1) “名称/值”对的集合,“名称/值”可以表示对象的属性,对象其实就是属性的集合,所以这个结构可以用来表示对象。
(2) 值得有序列表,可以表示对象的集合,因此JSON能够描述一个复杂的对象的集合,同时JSON易于阅读和编写,也易于机器的解析和生成。
在Android中已经内置了JSON格式处理的相关的类,这也大大简化了JSON在它们之间的数据通信程序设计。JSON是XML的子集,较之更小、更快,更易解析。
Android要访问远程MySQL数据库,先要利用HTTP协议发送Request请求给后台Java服务器,Java服务器端根据请求访问MySQL数据库,并把读取的数据库内容或对客户端的响应封装成JSON格式,通过HTTP协议回传给Android端,Android端再对JSON解析,并进行相关的UI处理。图4即信息获取和推送交互示意图。
4. 软件测试结果
本软件在Android 5.1.1的版本上运行良好,与服务器以及数据库的交互良好,并且地理位置验证和新建围栏功能运行正确,可以系统的完成血吸虫病防治过程中的查螺和灭螺的任务。
图5为软件的功能界面,图6为任务显示界面,显示该用户所有尚未完成的任务,图7为领取任务后跳转的界面,由于尚未完成验证,所以无法进行相应任务,图8位验证完成后的界面,验证完成后就可以执行任务,图9为验证完成后需要填写的表格。
5. 结束语
本课题成功搭建了基于Android平台的血吸虫病的预防和治理系统,系统可以完整的实现从领取任
Figure 3. Http protocol for business processes
图3. Http协议的业务流程
Figure 4. Information acquisition and interaction diagram
图4. 信息获取和交互示意图
务、新建任务、查螺任务、灭螺任务等一系列流程,改进了传统的现场查螺需要手动填表,并且进行抄录的缺点,并且将获得的数据存储到数据库,通过手机地图服务的电子围栏来进行地理位置验证并且来辅助完成现场任务,从而高效、准确地帮助现场人员完成查螺、灭螺的工作,对于血吸虫病的预防和治理有很重要的指导意义。