豆宏贤,石 春,秦琳琳,吴 刚
(中国科学技术大学自动化系,合肥 230027)
基于Android平台的电动汽车检测仪
豆宏贤,石 春,秦琳琳,吴 刚
(中国科学技术大学自动化系,合肥 230027)
为便于电动汽车整车调试和故障诊断,研制了一套基于Android平台的检测仪,设计了系统整体架构,移植了Android操作系统和FlexCAN、WiFi驱动程序,编写了FlexCAN中间件。应用程序调用硬件服务接口实现了CAN总线数据的采集、存储和解析,用Protobuf实现数据序列化。终端通过无线网络把序列化后的电动汽车实时运行数据发送到数据服务器,实现了数据的实时显示。系统每隔300ms采集一次电动汽车数据。试验结果表明,该套检测仪具有很好的稳定性与实时性,能满足实际应用的要求。
电动汽车;检测仪;Android;Protobuf
能源危机和环境污染问题使政府大力支持电动汽车的发展,但电动汽车的研发在全球范围内仍处于初级阶段,降低研发成本、提高汽车性能、推动技术改进和创新都需要大量运行数据支持[1];电动汽车架构中电子控制单元众多,而这些控制单元多属于不同厂家,由于产品设计理念和生产方法不够成熟,电子控制单元的协调运作在整车应用中需要经过多次调试和检测;电池的过充、过放也会直接影响电动汽车的行驶安全[2]。
在电动汽车生产研制过程中需要进行多次系统调试和检测,高效的数据分析和处理可提高生产效率,降低研发成本。电动汽车实时运行数据的采集、存储和解析能帮助整车生产厂商了解各个电子控制单元的状况,快速检测出有故障的器件,为车辆的安全生产提供保障;在电动汽车运行过程中,用户可实时了解车辆状况,及时检修带有安全隐患的部件;检修人员通过车辆数据的获取能够很快找到故障原因,高效完成故障修复工作;车辆实时运行数据库的建成,为电动汽车各个部件性能的改善以及动力系统的优化提供了实际指导[3]。
文中开发了基于Android的电动汽车检测仪软硬件架构,重点描述了检测仪的软件实现。系统通过CAN网络采集整车控制器、电机控制器、电池管理系统发送的信息[4]。为解决数据量大导致的界面卡死,每隔300ms采集一次车辆CAN网络数据。
检测系统主要有Android信息娱乐终端、WiFi热点和便携式电脑等部分组成。信息娱乐终端通过CAN总线采集电动汽车实时运行数据并完成了数据的解析、显示和存储。WiFi热点负责提供无线网络,便携式电脑作为数据服务器通过网络接收信息终端发送的电动汽车实时运行数据。检测系统结构如图1所示。
电动汽车运行过程中,电子控制单元如整车控制器、电机控制器和电池管理系统间通过CAN网络进行数据交互[5]。Android信息终端从CAN网络获取车辆实时运行数据,存储于数据库中,经J1939协议解析后在液晶触摸屏上显示车辆状态,当用户选择发送到服务器时,信息终端对车辆数据用Protobuf (protocol buffers)协议序列化后通过WiFi网络传输到便携式电脑。便携式电脑存储获取数据,并编写上位机软件利用Protobuf协议反序列化获得电动汽车运行数据。利用电脑端丰富的资源,对反序列化后的数据进行解析和显示[6]。通过分析显示的数据信息,维修人员可以很快地找到电动汽车故障,快速消除故障[7]。
系统采用飞思卡尔公司推出的用于车载系统的i.MX6Q处理器,它有4颗运行速度达1.2GHz的ARM Cortex-A9内核,集成3D图形单元和1080P编码/解码引擎,在苛刻的汽车环境中工作稳定可靠。
系统硬件包括CAN数据的采集、存储和发送以及供电系统和调试接口等。i.MX6Q具有丰富的片上资源,支持常见的外围设备。外围设备包括音视频采集、显示电路、以太网电路、电源接口、UART、NAND Flash、SD卡、DDR3、USB2.0和I2C等,其外围电路如图2所示。
图2 硬件结构
系统采用的CAN收发器是TI公司的SN65HVD230芯片,完成CAN控制器逻辑电平到CAN总线差分电平的转换。CPU通过集成的Flex-CAN控制器发送逻辑电平信号,经收发器转换为CAN总线传输的差分信号。SN65HVD230芯片抗干扰能力强、可靠性和数据传输速率高,在车载环境中能很好地保证数据的准确性。
软件设计需要移植FlexCAN,RT5370驱动,编写FlexCAN中间件以及上层应用程序。
3.1 FlexCAN驱动
在Android内核源码中已支持FlexCAN设备,但检测仪样机与默认配置中的接口有差异,需在飞思卡尔提供的i.MX6Q处理器端口配置文件中,把i.MX6Q相应端口配置为CAN_TX和CAN_RX功能。然后重新配置内核,将FlexCAN驱动加入内核。
3.2 USB-WiFi驱动
检测仪使用的USB-WiFi芯片RT5370,因在内核中没有对应的驱动文件,故须下载相应的驱动文件进行编译。在驱动的源码目录中对Makefile文件进行修改,使其支持实际应用中的硬件平台和交叉编译环境,编译出驱动模块RT5370sta.ko。重新配置内核,增加内核对802.11协议栈的支持、USB接口对WiFi模块的支持和用户空间对mdev和fireware的支持。在USB-WiFi驱动移植过程中,须将驱动模块和对应的RT5370STA.dat文件拷贝到Android系统相应目录下,以便Android系统启动时能成功打开WiFi模块。
3.3 Android中间件
1916年叶良辅、1928年杨曾威、1936年熊秉信、1938年王竹泉、1963年李星学、1960年北京矿业学院、1961年北京地质学院、1976年北京矿务局等许多地质学家及地质研究单位都曾来此作过研究工作,并最终确立了以本区地名命名的上古生界北京地区代表剖面,适合地质剖面测定、岩性岩相分析及沉积环境分析等基础性教学.
Android系统没有提供FlexCAN中间件,上层应用软件要使用FlexCAN的硬件服务,必须在软件设计过程中,编写对应的Android中间件,使上层应用软件能正常调用硬件模块。FlexCAN中间件主要有FlexCAN Stub模块、FlexCAN本地服务模块和Flex-CAN服务管理模块。
3.3.1 FlexCAN Stub设计与实现
Android为保护硬件厂商的信息,避开Linux的通用性公开许可证GPL(general public license)的束缚,设计了硬件抽象层HAL(hardware abstraction layer)模块,它是Linux内核驱动程序的封装,向上提供接口,屏蔽底层实现细节[8]。在硬件抽象层中,Stub是一种代理人(proxy)概念,它向硬件抽象层提供操作函数,runtime则从硬件抽象层获得特定模块Stub的操作函数,再回调这些操作函数。硬件抽象层与Stub是一种包含关系。
FlexCAN在内核中使用Socket接口和Linux协议栈,因此在FlexCAN Stub设计时使用系统调用socket()、bind()完成套接字的创建和绑定。系统调用sendto()利用套接字发送CAN数据,recvfrom()负责接收数据。
FlexCAN Stub是硬件抽象层中众多模块之一,它是FlexCAN控制的代理,当FlexCAN控制的本地服务需要调用FlexCAN Stub时,会利用hw_get_module()函数向HAL申请FlexCAN Stub模块,hw_get_ module()函数根据Stub对应的ID号找到对应的FlexCAN Stub,获得对应的Stub操作函数[9]。图3为FlexCAN Stub实现过程。
图3 FlexCAN Stub实现过程
3.3.2 硬件控制服务的JNI实现
Java本地接口JNI(Java native interface)模块处在硬件抽象层与Framework层之间,Android应用程序框架层用Java语言编写,而本地库是C/C++实现,为使Android框架层能调用本地库,应用框架层需要使用native方法,而这些native方法需要在Java本地接口层实现。
FlexCAN控制服务的JNI实现见图4,FlexCAN控制服务作为系统服务被添加到系统服务列表中。Android系统启动,FlexCAN控制服务随之被启动。System Server是Android系统启动后运行的第一个Java进程,它通过System.load.library()方法来转载库文件libandroid_server,进而调用库文件里的JNI_ Onload()函数,把FlexCAN的方法表注册到虚拟机,Java本地接口层函数flexcan_native_init()会调用硬件抽象层函数hw_get_module()找到FlexCAN Stub并获得Stub操作函数。flexcan_native_send()函数调用FlexCAN Stub模块的回调函数flexcan_send()向FlexCAN设备发送CAN帧。flexcan_native_receive()函数调用回调函数flexcan_receive()从Flex-CAN设备获取CAN数据。
FlexCAN控制服务随着系统启动而启动,并利用服务管理器的addService()函数把自己注册到服务管理器中。
3.4 Android应用程序
Android应用程序完成数据的采集、存储、解析、显示和WiFi传输。应用程序从服务管理器获取FlexCAN控制服务并完成CAN网络数据采集,利用sqlite3数据库存储CAN帧[10]。
应用程序定义HandlerListener接口,让Activity类以及FlexCANHandler类实现该接口。在Flex-CANHandler类中把获取的电动汽车运行数据向实现了HandlerListener接口的Activity类分发。在Activity类中利用J1939协议对获取的电动汽车运行数据进行解析和显示[11]。
图4 FlexCAN控制服务的Java本地接口层实现
应用程序与PC端采用Socket通信,利用Protobuf协议对CAN帧数据进行序列化[12]。Protobuf协议是Google开源的一种数据交换格式,它独立于语言和平台,能进行多种语言的实现,是一种性能好、效率高的数据交互协议。对于每一种语言实现都带有编译器和相应的库文件[13]。Protobuf使用二进制序列化,可读性比Json和XML差,缺少自描述,但用在电动汽车上一定程度保障了车辆信息安全[14]。为使PC端能正确解析CAN帧数据,在传输数据之前定义一个字节数据长度,使PC端能根据字节长度获知序列化后的CAN帧数据。
Android应用程序的设计流程如图5所示。
图5 Android应用程序设计流程
3.5 数据服务器端程序
数据服务器与Android应用程序采用Socket通信。服务器端创建一个监听特定端口的TcpListener对象server。服务端开启监听服务后,调用server的AcceptTcpClient()方法,该方法的执行使服务端处于等待状态,程序阻塞直到接收一个来自客户端的请求并返回Socket对象TcpClient[15]。服务端使用TcpClient与客户端通信。
服务端接收到客户端数据后,先获取帧的长度,再使用Protobuf协议解析,即可获得原始数据。服务端编写上位机程序实现原始数据的存储、解析和显示。上位机程序的实现为整车调试工程师以及售后维护工程师提供了查看电动汽车故障信息的平台。
在项目实施中,为保证程序的正确性和系统的稳定性,在北京恒天纯电动物流车上进行了测试。把Android影音娱乐平台接入电动物流车的CAN网络,采集其实时运行数据,得到部分测试结果,如图6所示。
图6 电动物流车运行状态信息
在PC端编写上位机软件接收检测终端发送的电动汽车运行数据,用Protobuf协议解析数据,对解析后的数据进行分析处理,得到电动汽车某个时刻的状态,如图7所示。
图7 电动物流车静止时的状态信息
针对电动汽车整车调试和故障诊断,设计并实现了基于Android的电动汽车检测仪,介绍了检测仪各个硬件模块配置,完成了系统软件移植、编写,以及应用软件的开发。应用端利用FlexCAN从CAN网络读取整车控制器、电机和电池等车辆信息,完成了存储、解析与显示。最后通过WiFi网络把车辆数据传输到PC端进行处理和分析。结果表明,该套方案能为电动汽车进一步发展提供数据基础,同时能为维修人员提供检修参考,具有实际的应用意义。
[1] 吴晶晶.纯电动汽车车载信息的采集与远程监测系统的研发[D].南昌:南昌大学,2011.
[2] 杨帆.电动汽车数据采集系统的设计与实现[D].北京:北京邮电大学,2013.
[3] 黄周义,石春,付贤强,等.纯电动客车远程监控系统设计与实现[J].电子测量技术,2013,36(7):23-26.
[4] 吴任飞,李仁发,李龙,等.面向FlexRay-CAN异构网络的帧封装研究[J].小型微型计算机系统,2015,36(4):749-753.
[5] 付贤强,石春,黄周义,等.纯电动客车远程视频监控终端设计与实现[J].电子测量技术,2013,36(8):71-75.
[6] KIM Minyoung,KIM Mi-Jin,JANG Jong-Wook,et al.Design of smart driving information check system using smart phone and wireless personal area network[C].Ubiquitous and Future Networks (ICUFN),4-6July,2012:[7].389-393.
[7] JHOU Jheng-Syu,CHEN Shi-Huang,TSAY Wu-Der,et al.The implementation of OBD-Ⅱvehicle dignosis system integrated with cloud computation technology[C].Robot,Vision and Signal Processing(RVSP),10-12Dec,2013:9-12.
[8] 罗升阳.Android系统源代码情景分析[M].北京:电子工业出版社,2012.
[9] 李宁.Android深度探索(卷1)[M].北京:人民邮电出版社,2013.
[10] WEI Jason.Android数据库程序设计[M].王雪昌,吴骅,林展宏,译.北京:清华大学出版社,2014.
[11] SAE J1939—73.Application layer-diagnostics[S].1998.
[12] 寇阳,吕建新.基于Protocol Buffers的配置下发接口适配与应用[J].电子测试,2014(1):108-109.
[13] 聂晓旭,于凤芹,钦道理.基于Protobuf的数据传输协议[J].计算机系统应用,2015(8):112-116.
[14] GLIGORIC N,DEJANOVIC I,KRCO S.Performance evaluation of compact binary XML representation for constrained devices [C].Distributed Comuting in Sensor Systems and Workshops (DCOSS),27-29June,2011:1-5.
[15] 李神送,温嘉铭,刘学锋.Android手机上传感器信息的实时获取与可视化[J].电子测量技术,2015(6):104-107.
Detector for Electric Vehicle Based on Android Platform
Dou Hongxian,Shi Chun,Qin Linlin&Wu Gang
Department of Automation,University of Science and Technology of China,Hefei230027
To facilitate the debugging and fault diagnosis of electric vehicle,a detector based on Android platform is developed,the overall framework of the system is designed,the Android operating system and the driver programs FlexCAN and WiFi are transplanted,and the middleware FlexCAN is developed.Then the application calls the service interface to fulfill the acquisition,storage and parsing of CAN bus data,and Protobuf is used to conduct data serialization.Finally,the terminal sends the serialized real operation data of electric vehicle to data server via wireless network,realizing real-time data display.The system collects vehicle data every 300 milliseconds.Test results show that the detector developed has good stability and real-time performance,meeting the requirements of practical application.
EV;detector;Android;Protobuf
原稿收到日期为2016年1月15日,修改稿收到日期为2016年2月25日。
吴刚,教授,博士生导师,E-mail:wug@ustc.edu.cn。
10.19562/j.chinasae.qcgc.2017.02.016