Android连接OBDII读取vin

in #steemit7 years ago (edited)

VIN

是英文Vehicle Identification Number(车辆识别码)的缩写。因为SAE标准规定:VIN码由17位字符组成,所以俗称十七位码。它包含了车辆的生产厂家、年代、车型、车身型式及代码、发动机代> 码及组装地点等信息。正确解读VIN码,对于我们正确地识别车型,以致进行正确地诊断和维修都是十分重要的。

OBDII

OBDII(the Second On—Board Diagnostics), ,美国汽车工程师协会(SAE,Society of Automotive Engineers)1988年制定了OBD-II标准。OBDII实行标准的检测程序,并且具有严格的排放针对>》> 性,用于实时监测汽车尾气排放情况。

源码分析用到的开源项目:

android-obd-reader

AutoApp

obd-java-api

工具:obd2开发板一套,这个使用到的开发板
IMG_20170731_142417.jpg
整个硬件连接比较简单,间标准的elm327连接到开发版,打开手机蓝牙配对,密码1234,用调试工具即可在android上和obd设备进行通信

比较郁闷的是连接手机后读取到的vin竟然是乱码!

超级截屏_20170727_155113.png

我想新的开发版,不应该有问题吧,于是,断点进入源码进行调试,发现原始的16进制数据无法正常解析:
image_15011445648281738975251.jpg
进入类库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指令返回的原始数据一样,当然无法被正常解析。

超级截屏_20170728_171135.png
在和厂商沟通后确实可能是开发版的问题,好吧,只有先退货了(待续)

参考:
百度百科
百度文库

Sort:  

只是个串口通信而已,麻烦的是对返回数据的解析,很多厂家都对这个数据加密了,所以很棘手,不可能每种车辆都适配吧,希望能找到提供协议数据解析的开发商提供sdk,否则这成本太大了

历害,这个编程行业我还真没有涉及过

硬件的东西我也不擅长用到就现学了

Coin Marketplace

STEEM 0.24
TRX 0.21
JST 0.037
BTC 98286.08
ETH 3416.39
USDT 1.00
SBD 3.34