Android下发送和接收OBD数据

from:

http://marshal.easymorse.com/archives/5025


OBD,On-Board Diagnostics,车载自动诊断系统。你可以把它看做汽车上的电脑。现在的汽车,如果不是出厂年份太早,基本上都带有OBD接口,是国际标准。

连接OBD可以获取到很多汽车状态数据,在驾驶员位置附近,有OBD接口,我的高尔夫6,接口在方向盘左下方位置。可以使用ELM327蓝牙转接口连接OBD接口,这样就可以无线蓝牙连接。我使用的ELM327转接口:

Android有连接ELM327的app,比如Torque,有功能简化的免费版本。

如果想编写Android连接ELM327的程序,需要解决以下几个问题:

  • 如何通过蓝牙连接到ELM327设备
  • 发送和接收数据的格式

好在已经有人编写了开源项目,可实现基本的ELM327通讯的app,链接见:

https://code.google.com/p/android-obd-reader/

该作者编写的代码,依赖maven3,比较麻烦。我改写了他的代码:

  • 不在需要依赖maven3,直接可导入到IDE工具生成项目
  • 增加了手工输入命令和显示原始结果的功能

效果见:

代码共享在这里:

https://github.com/MarshalW/MyObdDemo

因为是开源项目,对容错和自动化处理不够,要按照一定的次序执行,否则会app崩溃:

  1. 启动android蓝牙
  2. 在android蓝牙设置中对ELM327做蓝牙配对
  3. 在app菜单中,选择Settings,在列表中选择Bluetooth Devices,然后在对话框中选择配对的设备(下面有截图)
  4. 在app菜单中,选择Start Live Data,等2秒钟左右,界面将显示发送命令接收到的内容
  5. 这时候,可以在上面的对话框中输入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的应用了。

你可能感兴趣的:(Android下发送和接收OBD数据)