是英文Vehicle Identification Number(車輛識別碼)的縮寫芭届。因為SAE標準規(guī)定:VIN碼由17位字符組成图呢,所以俗稱十七位碼褐桌。它包含了車輛的生產(chǎn)廠家照雁、年代秋泄、車型、車身型式及代碼夭拌、發(fā)動機代> 碼及組裝地點等信息呀洲。正確解讀VIN碼,對于我們正確地識別車型啼止,以致進行正確地診斷和維修都是十分重要的。
OBDII(the Second On—Board Diagnostics), 兵罢,美國汽車工程師協(xié)會(SAE献烦,Society of Automotive Engineers)1988年制定了OBD-II標準。OBDII實行標準的檢測程序卖词,并且具有嚴格的排放針對>》> 性巩那,用于實時監(jiān)測汽車尾氣排放情況。
源碼分析用到的開源項目:
android-obd-reader
AutoApp
obd-java-api
工具:obd2開發(fā)板一套此蜈,這個使用到的開發(fā)板
整個硬件連接比較簡單即横,間標準的elm327連接到開發(fā)版,打開手機藍牙配對裆赵,密碼1234东囚,用調(diào)試工具即可在android上和obd設(shè)備進行通信
比較郁悶的是連接手機后讀取到的vin竟然是亂碼!
我想新的開發(fā)版战授,不應該有問題吧页藻,于是,斷點進入源碼進行調(diào)試植兰,發(fā)現(xiàn)原始的16進制數(shù)據(jù)無法正常解析:
進入類庫obd-java-api的源碼可以看到默認構(gòu)造器調(diào)用了父類的構(gòu)造器份帐,并傳入09 02的字符串,這個是obd2的協(xié)議指令楣导,用于獲取車輛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協(xié)議,按說其返回的字符串應該包含有":",但卻沒有,這不得不讓我懷疑是開發(fā)版的問題噩凹,我又用AutoApp輸入09 02指令返回的原始數(shù)據(jù)一樣巴元,當然無法被正常解析。
在和廠商溝通后確實可能是開發(fā)版的問題栓始,好吧务冕,只有先退貨了
參考:
百度百科
百度文庫