是英文Vehicle Identification Number(车辆识别码)的缩写。因为SAE标准规定:VIN码由17位字符组成,所以俗称十七位码。它包含了车辆的生产厂家、年代、车型、车身型式及代码、发动机代> 码及组装地点等信息。正确解读VIN码,对于我们正确地识别车型,以致进行正确地诊断和维修都是十分重要的。
OBDII(the Second On—Board Diagnostics), ,美国汽车工程师协会(SAE,Society of Automotive Engineers)1988年制定了OBD-II标准。OBDII实行标准的检测程序,并且具有严格的排放针对>》> 性,用于实时监测汽车尾气排放情况。
源码分析用到的开源项目:
android-obd-reader
AutoApp
obd-java-api
工具:obd2开发板一套,这个使用到的开发板
整个硬件连接比较简单,间标准的elm327连接到开发版,打开手机蓝牙配对,密码1234,用调试工具即可在android上和obd设备进行通信
比较郁闷的是连接手机后读取到的vin竟然是乱码!
我想新的开发版,不应该有问题吧,于是,断点进入源码进行调试,发现原始的16进制数据无法正常解析:
进入类库obd-java-api的源码可以看到默认构造器调用了父类的构造器,并传入09 02的字符串,这个是obd2的协议指令,用于获取车辆vin码
public VinCommand() {
super("09 02");
}
VinCommand这个类负责解析vin,具体方法如下
@Override
protected void performCalculations() {
final String result = getResult();
String workingData;
if (result.contains(":")) {//CAN(ISO-15765) protocol.
workingData = result.replaceAll(".:", "").substring(9);//9 is xxx490201, xxx is bytes of information to follow.
Matcher m = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE).matcher(convertHexToString(workingData));
if(m.find()) workingData = result.replaceAll("0:49", "").replaceAll(".:", "");
} else {//ISO9141-2, KWP2000 Fast and KWP2000 5Kbps (ISO15031) protocols.
workingData = result.replaceAll("49020.", "");
}
vin = convertHexToString(workingData).replaceAll("[\u0000-\u001f]", "");
}
我选的是ISO-15765协议,按说其返回的字符串应该包含有":",但却没有,这不得不让我怀疑是开发版的问题,我又用AutoApp输入09 02指令返回的原始数据一样,当然无法被正常解析。
在和厂商沟通后确实可能是开发版的问题,好吧,只有先退货了
参考:
百度百科
百度文库