基于Android的移动车辆实时监测系统
2017-06-05毕丽静蒋保臣王小利
毕丽静 蒋保臣 王小利
摘要:随着中国彻底进入移动互联网时代,移动出行以其快捷便利的优势,迅猛发展。但是其后续保障建设的滞后导致了移动出行车辆缺乏统一的监督管理平台,安全事故频发。该文基于Android和百度地图开发平台开发了一套移动出行监测系统,可同时实现1000辆车的信息管理、实时定位与跟踪、历史轨迹查询和卫星图展示等功能。首先,通过GNSS模块接收卫星信号,并利用socket技术发送给服务器,经服务器解析处理存入数据库。然后,Android客户端通过web服务器访问数据库,获取车辆、卫星信息,并在客户端实时显示。该监控系统使用线程池模型改进生产者一消费者模式,解决大容量突发性数据请求造成的严重丢包率;采用动态建表的方式,将数据分时存储在不同数据表中,解决了海量数据查询效率低的问题;使用轻量级数据格式JsON,保证了Android客户端与远程数据库之间的实时通信,并解决了手机流量消耗大的问题。经验证,该系统可高效、稳定、长时间运行。
关键词:移动出行;Android;实时监测;生产者一消费者改进模式;动态建表;JSON
中图分类号:TP311
文献标识码:A
文章编号:1009-3044(2017)10-0043-05
1.背景
近年,移动出行服务,以其快捷便利的优势,迅速发展。乘客可以通过网上预约的方式叫车,不用在路边等待,车主也能最快的获得附近乘客的位置,节约了时间。专车和拼车的出现,不仅减少了乘客花销,也增加了车辆的利用率,减轻道路与环境的压力。据艾瑞咨询(iReseareh)发布的《2016年中国移动端出行服务市场研究报告》显示,截至2015年底,中国移动端出行服务乘客端用户数总计接近4亿。其中网约车、专车与拼车的用户覆盖量最高。然而,《报告》数据还显示,无论是专车还是拼车,皆有高达半成以上的用户对移动出行存在的各类安全问题表示担忧。尤其是最近频发的乘客被车主抢劫、杀害的事件被报道出来,更是让人们对移动出行的安全问题表示担忧。车主只要在一些移动出行的公司进行注册登记,就可以为乘客提供出行服务,缺乏监督管理,存在严重的安全隐患问题。移动出行市场的快速发展与其后续保障建设的滞后已形成鸿沟。所以,对移动出行车辆实行统一化监督管理迫在眉睫。
本文设计了一套基于Android系统的车辆监测系统,对移动出行车辆进行监督与管理。该系统主要是基于Android和百度地图进行的二次开发,实现了对移动出行车辆与驾驶员信息的管理,可以对车辆进行实时定位与跟踪,以及历史轨迹查询,卫星图展示等。
2.系统方案设计
移动车辆监测系统设计主要分为后台服务器设计与An.droid客户端设计。服务器设计主要解决数据采集与存储问题。使用Trimble公司的GNSS模块接收卫星信号,然后利用socket技术将数据发送给服务器,经解析处理存人数据库MySQL。Android客户端的设计主要解决Android客户端的实时显示以及数据的获取。Android客户端需要通过web服务器访问数据库,获取用户、车辆与卫星数据,然后通过JSON实现与Android客户端的实时通信。该监控系统可实现对车辆的信息管理、实时定位与跟踪、历史轨迹查询、卫星图展示等功能。系统整体框架如图1所示。
GNSS接收机与服务器之间利用socket TCP的方式进行通信。首先是socket服务器对端口进行监听,等待客户端TCP连接请求。然后,GNSS接收机作为socket客户端,向socket服务器请求TCP連接,连接成功之后,客户端与服务器之间进行socket通信,接收客户端发送的数据。这些数据经解析处理后再存入数据库MySQL。当用户需要查询、定位时,Android客户端会向Web服务器发起http请求,Web服务器连接数据库,获取数据,将数据封装成JSON格式,再通过http协议回传给An-droid客户端。Android客户端再对JSON进行解析,并进行相关的UI处理。
3.服务器设计
服务器端主要通过socket技术进行数据采集,再经解析处理存人数据库。服务器设计主要包括socket服务器程序设计与数据库设计。Socket服务器程序设计主要解决并发问题,大容量突发性数据请求造成的严重丢包率。本文设计了一种改进的生产者一消费者模式,采用线程池控制机制进行解决。数据库设计需要考虑海量数据造成的查询效率慢的问题,采用动态建表的方式,将数据分时存储在不同的表中。
3.1Socket介绍
Socket是进程之间通信的一种方式。一个socket对应于通信的一端。基本工作流程如下:首先,服务器端启动,调用socketo建立一个套接字,然后调用bindo,将该套接字和本地网络地址连在一起,再调用listeno,做好监听准备,并规定请求队列的长度,然后调用accepto接收连接。客户端在建立套接字后可调用connecto和服务器进行连接。连接建立之后,客户端和服务器就可以通过writeo和reado来发送和接收数据。等待数据发送完毕,用closeo关闭套接字。socket基本工作流程如图2所示。
3.2并发处理一基于改进的生产者一消费者模式
传统的信息的传输一般采用UDP的通信方式,服务器监听端口,接收传感信息,然后进行处理。但是该监控系统要求对1000辆车进行监控,并进行1s-次的数据采集,需要监测的数据量大、并发量高,而且经常面临突发性超容量请求。在这种条件下,如果继续采用传统的socket的通信方式,会造成很大的系统开销,而且丢包率将大大增加。文献提出在Actor框架内构建socket,这样可以将基于线程的编程模型和基于事件的编程模型统一起来,简化并发编程的复杂性。文献提出一种socket外包机制,通过绕过客户端协议栈的数据包,加速访问速度。文献提出包含socket接口的域内通信机制,减小了TCP传输和长距离通信的开销。但是上述几种方案都没有很好的解决突发性超容量请求造成的严重丢包率。本文采用线程池模型,改进生产者消费者模式进行设计,利用缓冲池、线程池建立多线程并发连接,丢包率低,访问速度快。生产者一消费者改进模型如图3所示。
生产者一消费者模式,可以实现读写互斥,一般用在多线程并发的情况下,以防止缓冲区出现读写混乱。GNSS接收机与socket服务器建立连接成功之后开启一个新的线程,负责接收数据,作为生产者,向缓存中写入数据,取出数据的线程作为消费者。在生产者和消费者之间的创建n个公共缓冲区,然后增加一个缓冲池调度管理线程,对缓冲池中的缓冲区进行管理。生产者线程写入数据时,会检测当前缓冲区状态,如果缓冲区未满,则把接收到的信息写入缓冲区;如果缓冲区已满,则通知缓冲池调度管理线程更换新的缓冲区,而生产者可以不停止写入动作来保持数据的最新。消费者线程可以从缓冲区读取实时数据并进行解析,以数据库表相一致的格式,写入二级缓冲区。
生产者与消费者之间采用互斥信号量实现线程对缓冲池的互斥使用。只要缓冲池未满,生产者便可将消息持续送入缓冲池中;只要缓冲池未空,消费者便可从缓冲池中不断取走一定量的消息。缓冲区为空时,阻塞消费者,让生产者“生产”;生产者生产一定量传感信息后,会通知消费者及时“消费”。传统的生产者一消费者模型在缓冲区满时,阻塞生产者,为临界区外等待的消费者放行,当消费结束时,通知生产者“生产”。由于传感信息的实时性,一段时间内数据是不断产生的,阻塞会造成传感信息的丢失。因此采用线程池控制机制,让满的缓冲区进行切换,使得缓冲区中一直持有最新的传感信息,很好的解决了并发丢包问题。
3.3数据库设计一动态建表
该监控系统需要存储的数据,主要有:
1)用户信息。用户注册信息,包括用户账号、密码、驾驶员姓名、手机号、被分配端口号等。
2)车辆信息。包括日期、时间、速度、经纬度、端口号等。
3)卫星信息。包括日期、时间、PRN、SNR等。
4)管理员信息。管理员账号、密码、权限等。
车辆信息与卫星信息是由GNSS接收机发送的NMEA格式的GPS信号解析后所得。由于系统实时性要求高,1s一次数据采集,经测算接收到的一帧数据大小在500B到800B之间,那么一辆车一天的数据量大约有4OM,那么1000辆车,数据量达到了G级别,所以对后续数据的查询造成了极大的障碍,严重影响系统运行的效率。所以针对车辆信息表与卫星表,我们采用动态建表的方式,实现分表存储。每天动态建立十张表,以日期及GNSS接收机对应的服务器分配的端口号尾数来进行分表。如2016年5月1日,端口号为10004的接收机发送的车辆信息数据存储在caaable_2016_05_01_4表中,卫星表类似。数据库我们使用关系型数据库MySQL,MySQL数据表结构图如图4所示。
4.Android客户端设计
Android是一种基于Linux的自由及开放源代码的操作系统,主要应用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导与开发。系统采用分层架构,从下至上依次为Linux核心层(Linux kernel)、应用程序框架层(hardwareabstracting layer)、系统库层(1ibraries)、Android运行时(Androidruntime)、应用程序框架层(application framework)、应用程序层(applications)。Activity是Android平台应用程序的载体,它允许用户在其上构建一个应用界面,并提供用户处理事件的API,如onKeyEvent,onTouchEvent等。一般应用程序由多个Activity组成,Activity之间可以进行相互跳转,通过返回值传递数据。视图组件View是最基本的uI类,Android界面设计中大部分高级uI组件都是继承View类来实现,如TextView、Button、List、EditText、RadioButton、Checkbox等,通过调用setContent-Viewo可以在Activity中显示已构造好的用户视图。
Android客户端设计包括Android界面显示设计与数据库访问设计。Android客户端界面设计主要通过控制和使用activ-ity和view来实现的,多个activiIv通过堆栈来进行管理。由于Android客户端不能直接访问远程数据库,所以需要借助web服务器程序访问数据库。Android客户端与web服务器之间使用轻量级数据格式JSON进行通信,可以保证通信的实时性,减少手机流量的耗费。
4.1 Android客户端与web服务器通信-JSON
目前,Android應用和Web服务器之间有两种主要的数据交换方式:XML(可扩展标记语言)和JSON。XML是用于标记电子文档的语言,以使其结构化。它是一种原始语言,允许用户定义自己的标记语言。JSON是一种用于交换数据的轻量级格式,是JavaScript的一个子集。在企业智能信息平台中,通过使用JSON格式将数据交换性能更优。因为JSON格式简单,易于读写,它被压缩,占用带宽小,可以节省互联网接人成本,并且传输速度快。因此更适合手机应用的实时传输。所以我们采用JSON作为Android与web服务器通信的数据交互方式。基于JSON的数据交互示意图如图5所示。
Android访问远程数据库MySQL,需要先向web服务器发起http请求,web服务器连接数据库,获取数据,将数据封装成JSON格式,再通过http协议回传给Android客户端。Andmid客户端再对JSON进行解析,并进行相关的uI处理。
4.2 Android客户端界面设计
Android客户端实行分级设计,有大管理员、小管理员与普通用户三种级别。用户可根据自身级别选择不同登录按钮。登录界面如图7(a1所示。大管理员具有最高权限,可以查看所有车辆信息,为小管理员分配账号,车辆登记,查看小管理员信息,为小管理员分配管辖车辆,以及修改密码等功能。小管理员具有查看管辖区域内的车辆信息,及密码修改等功能。普通用户具有查看自身信息,注册新用户及密码找回功能。An-droid客户端分级功能图如图6所示。部分界面展示图如图7,图8所示。
5.试验结果
为验证系统的稳定性、可靠性与高效性,本文进行了大量测试实验。现选取一组实验进行说明,如图9实验效果图所示。
图9(a1展示了某辆车的实时定位跟踪功能,其中红色图标为车辆位置,点击红色图标可显示经纬度信息,并能实时跟踪。为测试系统的跟踪功能及系统的稳定性,进行了如下实验:16:52-17:00静止,17:00-17:30从实验室出发在校园内行走。17:00回到实验室,一直运行到次日9:00。测试数据如表1所示,记录各个时间点的经纬度以及查看系统是否运行正常。系统运行稳定,能实时定位跟踪。
图9(b)展示的是卫星图像模式下的定位跟踪图。功能与(a)相同。
图9(c)展示了多辆车的同时定位功能。点击红色图标可与图9(a)一样,显示经纬度信息。
图9(d)展示軌迹查询功能,显示某个时间段内的起点,终点与行驶轨迹。与实际行驶轨迹一致。
图9(e)展示的是卫星信息显示功能。其中上图表示的是GNSS模块能接收到的卫星信号,以及卫星位置。圆环从外向里,表示纬度0度到90度。以圆点为中心的方位角表示经度。图中显示了接收到10个卫星信号。大多分布在北纬30度到60度之间。下图展示的是卫星信号的信噪比(SNR),说明了卫星信号的强弱,条形图越大,卫星信号越强。
系统经过长时间运行,并未出现闪退或显示异常等情况,验证了系统的稳定性。关于系统的高效性,通过查看定位时间与轨迹查询时间进行测试。定位时间指从开启定位,访问数据库,再到地图加载,红色图标显示实际位置,整个过程大约需要几十毫秒。轨迹查询时间与查询时间段长短有关,考虑到查询的效率,采用的是根据时间段长短,分时采样,时间基本控制在2秒以内,查询时间段越短,越精确。
6.结束语
本文设计的移动车辆监控系统可以实现对车辆位置的实时监测。监督管理部门、移动出行服务公司、移动出行车主分别作为三级用户,实现对注册车辆统一化监督管理。经实际测试,可实现对注册车辆的信息管理,实时跟踪定位,查询历史轨迹信息以及显示卫星信息等功能。系统运行稳定,实时性高,操作界面人性化。由于数据量庞大以及运算时间要求苛刻,因此在大规模增加车辆应用时,如何更好地进行数据存储和提高处理速度仍是进一步研究的目标。