OBD,On-Board Diagnostics,车载自动诊断系统。你可以把它看做汽车上的电脑。现在的汽车,如果不是出厂年份太早,基本上都带有OBD接口,是国际标准。
连接OBD可以获取到很多汽车状态数据,在驾驶员位置附近,有OBD接口,我的高尔夫6,接口在方向盘左下方位置。可以使用ELM327蓝牙转接口连接OBD接口,这样就可以无线蓝牙连接。我使用的ELM327转接口:
Android有连接ELM327的app,比如Torque,有功能简化的免费版本。
如果想编写Android连接ELM327的程序,需要解决以下几个问题:
- 如何通过蓝牙连接到ELM327设备
- 发送和接收数据的格式
好在已经有人编写了开源项目,可实现基本的ELM327通讯的app,链接见:
该作者编写的代码,依赖maven3,比较麻烦。我改写了他的代码:
- 不在需要依赖maven3,直接可导入到IDE工具生成项目
- 增加了手工输入命令和显示原始结果的功能
效果见:
代码共享在这里:
因为是开源项目,对容错和自动化处理不够,要按照一定的次序执行,否则会app崩溃:
- 启动android蓝牙
- 在android蓝牙设置中对ELM327做蓝牙配对
- 在app菜单中,选择Settings,在列表中选择Bluetooth Devices,然后在对话框中选择配对的设备(下面有截图)
- 在app菜单中,选择Start Live Data,等2秒钟左右,界面将显示发送命令接收到的内容
- 这时候,可以在上面的对话框中输入OBD命令,确切的说,应该叫OBD II PID,可参见:http://en.wikipedia.org/wiki/OBD-II_PIDs#Bitwise_encoded_PIDs
该项目主要代码:
- ObdGatewayService,是一个Android Service,可以跑在系统后台,这个Service用来连接蓝牙,并发送接收数据
- ObdCommand,是个类族,用于封装命令和返回的结果,我写了个继承ObdCommand的子类,MyObdCommand,用于手工输入的命令和获得原始返回数据
- MainActivity,我加了个文本框和相关界面组件,用于接收用户输入数据,然后,将数据封装为MyObdCommand,再加入到ObdGatewayService的队列中去执行
如能理解这些,就可以在这个项目代码基础上,编写自己的基于读取ELM327的应用了。