胡正凯
摘 要:随着我国小型汽车数量的持续增长,随之而来的是频发的交通事故,而这其中很大一部分是由于汽车发生故障而无法正常行驶造成。本设计基于C/S架构使用蓝牙ELM327作为与OBD通信的协议翻译器,通过Andorid手机蓝牙与ELM 327获取ECU的故障码信息显示给车主,起到早期预警的作用,提醒车主潜在的车辆维修需要,减少了汽车由于故障发生交通事故的危险。
关键词:ELM327;Android;Java;OBD-II;ECU模拟器
中图分类号:TP206 文献标识码:A 文章编号:1006-8937(2016)30-0073-02
1 概 述
2015年我国私家车已达1.24亿辆,巨大的汽车数量也带来了越来越多的交通事故。如果车主能够自行检查汽车状态,消除汽车故障,这将会显著地降低交通事故发生的可能性。然而随着现代电子控制技术在汽车工业的发展和应用,自动化程度越来越高,但随之而来的汽车结构变得越来越复杂,能熟练掌握和维修汽车领域技术的专家和维修人员也越来越少,从而使得汽车维修行业经常无法快速、经济地解决汽车故障,这就需要用户能够自行地排查车辆状态,及时地去专业维修店清除故障,改善车况。
汽车厂商大量的采用电子控制单元ECU(Electronic Control Unit)来作为控制器,我们可以使用汽车故障诊断系统OBD-II来获取车辆的故障诊断信息。OBD接口模块的主要功能是使整个硬件系统通过CAN总线与汽车的OBD接口相连接,使之成为汽车电控系统的一个CAN节点,并通过网关和汽车的其它CAN节点进行通讯,进而可以采集到汽车运行时的各种数据,同时还能作为车载电源与电源模块的连接通道,整个汽车终端也是通过该接口模块与汽车实现硬件上的连接[1]。
如今OBD技术受到了广泛的关注,我国出台了一系列政策来推广OBD技术,现如今90﹪的汽车都具备OBD-II接口,以OBD技术为基础的车联网系统[2]更是各大科技公司当下的研究热点。
根据谷歌发布的报告显示,自2014年5月以来Android操作系统的用户增加了4亿,用户总数已达14亿,平均5部手机中大约4部安装了安卓系统。
而且Android又是开源操作系统,其灵活性、开放性比其他专有软件产品具有更大的自由和个性化,同时价格更低廉。Android应用使用Java语言开发,Java语言的开发者又是最多的,这使的Android应用的开发短期大大的缩短、可维护性增强。
OBD技术和Android操作系统的广泛应用,使我们结合两者开发的应用、系统能够被大多数用户所使用、操作。
2 系统整体设计
2.1 系统原理
该诊断系统主要分成上位机和下位机两部分,系统框图,如图1所示。上位机是客户端,基于Android系统;下位机即CAN转蓝牙控制器模块(即蓝牙ELM 327),通过OBD接口(CAN 总线)和汽车ECU(电子控制单元)通信,读取来自ECU的报文信息[3],并转换成蓝牙串行数据格式,发送给上位机。
2.2 硬件选择
根据我国的法律政策规定,除极个别车型外,所有的汽车必须提供一个可以用于测试设备获取诊断信息的接口。这个接口上的数据传输协议并不能直接与其他设备兼容,这时就需要一个器件能够把车辆CAN协议转换成串口通信协议。
埃尔姆公司生产的ELM327芯片加入了CAN、ISO 9141-2、SAE J1850等七种通信协议,可以自动检测车辆通信协议并设置成与车辆一致的协议。蓝牙实现了点对点传输,传输保密性好,是目前最受欢迎的无线通信技术,许多车载产品都使用蓝牙进行通信。
Android在android.bluetooth包封装了对蓝牙通信的功能丰富的类,例如BluetoothAdapter、BluetoothDevice、BluetoothServer
Socket、BluetoothSocket等。
我们不需要外加其他设备,利用Android手机自带的蓝牙API接口,通过APP客户端,就能实现手机与ELM327的通信。
2.3 软件设计
2.3.1 命令形式
我们需要在手机端发送指令给ELM 327,然后ELM 327解析命令,把命令传送给ECU。ELM 327能够解析两种命令形式:AT命令和OBD命令。AT命令又叫内部命令以“AT”开头,因为这是ELM 327内部使用的命令,即不会与ECU进行通信,用于对ELM 327进行设置操作。
凡是没有以“AT”两个字开头的所有命令都会被认为是汽车OBD命令,OBD命令的格式是固定的,第一个字节是请求的数据类型,第二个字节是请求的实际信息,必须使用十六进制数进行表示,见表1。
例如获取发动机冷却液温度,模式是01,PID是05,因此我们的请求指令应该是0105。
2.3.2 代码解析
我们使用Eclipse结合ADT(Android Developer Tools)进行Android开发,通过BluetoothServerSocket的accept()方法获取BluetoothSocket对象。
当Android的content中的设备连接正常后,通过BluetoothSocket采用串行数据通信实现与CAN转蓝牙控制器模块的交互[4]。与ELM327的连接代码需要执行在线程里面,使用InputStream读取ELM 327发送过来的数据。
由于ELM 327发送的数据流中,夹杂着回车符,所以我们应该去掉回车符,把真正有意义的数据组合在一起,当ELM 327发送了“>”时,就说明这条回应信息结束,退出循环。
由于InputStream的read方法是阻塞式方法,所以当我们读取到回应信息的末尾,退出while循环的时候就会一直在read方法这里等待ELM 327发送的新消息。
3 实验验证
我们使用ECU模拟器进行程序调试以及故障码的获取。在车辆越来越趋于网络化的趋势下,ECU模拟器是汽车产品开发、调试、生产必备的工具,能为为开发人员节省大量的时间。
当前车辆上的总线设备越来越多,有的高端车上甚至多到有上百个ECU,而车辆ECU之间通过总线交换数据信息,目前有关车联网系统的开发越来越多,而车联网设备获取车辆信息的接口全部采用的是OBD通用接口,对于产品的调试,都要进行实车的对接测试,但是有时候又找不到各种协议的车辆,或者是每次测试都要启动车辆,去车辆狭小的空间进行操作,很是不方便,ECU模拟器可以解决这些问题。
ECU模拟器可以模拟车辆OBD接口的大部分协议,由于车辆系统是各个品牌国家独立,所以协议从最早期有很多不同种类的协议,互相不兼容,主要是几大类,基于K线的,基于CAN线的,还有一种是J1850(主要是早期的美国部分车辆使用),目前市面上大部分的是基于K线和CAN线的,大约占有90%多的车辆保有量。通过Android手机发送PID为03的请求指令,故障码信息,如图2所示。
得到所有的故障码数据,需要故障码库进行比对,得到具体的故障码含义。
4 结 语
本设计通过蓝牙ELM 327获取OBD-II故障码,显示在Android应用上,使车主能够及时了解汽车的各项数据和故障,减少因汽车故障发生的交通事故。
所有的验证都是基于KWP 2000 5BPS初始化协议进行的,以后的工作就是完整各个协议的数据获取,并且把数据发给服务器进行数据的集中储存,便于用户及车企在浏览器也可以查看数据并进行大数据分析。
参考文献:
[1] 谢富强,唐耀庚,曹云建.基于单片机的汽车远程监测车载终端硬件设 计[J].微机与应用,2014,6:22-25.
[2] 李松,王龄.发达国家IVHS研究与发展[J].国外公路,1998(4):19-22.
[3] 罗峰,孙泽昌.汽车CAN总线系统原理、设计与应用[M].北京:电子工业 出版社,2010.
[4] 李宁.Android/Ophone开发完全讲义[M].北京:中国水利水电出版社,
2010.