胡正凱
摘 要:隨著我國小型汽車數量的持續增長,隨之而來的是頻發的交通事故,而這其中很大一部分是由于汽車發生故障而無法正常行駛造成。本設計基于C/S架構使用藍牙ELM327作為與OBD通信的協議翻譯器,通過Andorid手機藍牙與ELM 327獲取ECU的故障碼信息顯示給車主,起到早期預警的作用,提醒車主潛在的車輛維修需要,減少了汽車由于故障發生交通事故的危險。
關鍵詞:ELM327;Android;Java;OBD-II;ECU模擬器
中圖分類號:TP206 文獻標識碼:A 文章編號:1006-8937(2016)30-0073-02
1 概 述
2015年我國私家車已達1.24億輛,巨大的汽車數量也帶來了越來越多的交通事故。如果車主能夠自行檢查汽車狀態,消除汽車故障,這將會顯著地降低交通事故發生的可能性。然而隨著現代電子控制技術在汽車工業的發展和應用,自動化程度越來越高,但隨之而來的汽車結構變得越來越復雜,能熟練掌握和維修汽車領域技術的專家和維修人員也越來越少,從而使得汽車維修行業經常無法快速、經濟地解決汽車故障,這就需要用戶能夠自行地排查車輛狀態,及時地去專業維修店清除故障,改善車況。
汽車廠商大量的采用電子控制單元ECU(Electronic Control Unit)來作為控制器,我們可以使用汽車故障診斷系統OBD-II來獲取車輛的故障診斷信息。OBD接口模塊的主要功能是使整個硬件系統通過CAN總線與汽車的OBD接口相連接,使之成為汽車電控系統的一個CAN節點,并通過網關和汽車的其它CAN節點進行通訊,進而可以采集到汽車運行時的各種數據,同時還能作為車載電源與電源模塊的連接通道,整個汽車終端也是通過該接口模塊與汽車實現硬件上的連接[1]。
如今OBD技術受到了廣泛的關注,我國出臺了一系列政策來推廣OBD技術,現如今90﹪的汽車都具備OBD-II接口,以OBD技術為基礎的車聯網系統[2]更是各大科技公司當下的研究熱點。
根據谷歌發布的報告顯示,自2014年5月以來Android操作系統的用戶增加了4億,用戶總數已達14億,平均5部手機中大約4部安裝了安卓系統。
而且Android又是開源操作系統,其靈活性、開放性比其他專有軟件產品具有更大的自由和個性化,同時價格更低廉。Android應用使用Java語言開發,Java語言的開發者又是最多的,這使的Android應用的開發短期大大的縮短、可維護性增強。
OBD技術和Android操作系統的廣泛應用,使我們結合兩者開發的應用、系統能夠被大多數用戶所使用、操作。
2 系統整體設計
2.1 系統原理
該診斷系統主要分成上位機和下位機兩部分,系統框圖,如圖1所示。上位機是客戶端,基于Android系統;下位機即CAN轉藍牙控制器模塊(即藍牙ELM 327),通過OBD接口(CAN 總線)和汽車ECU(電子控制單元)通信,讀取來自ECU的報文信息[3],并轉換成藍牙串行數據格式,發送給上位機。
2.2 硬件選擇
根據我國的法律政策規定,除極個別車型外,所有的汽車必須提供一個可以用于測試設備獲取診斷信息的接口。這個接口上的數據傳輸協議并不能直接與其他設備兼容,這時就需要一個器件能夠把車輛CAN協議轉換成串口通信協議。
埃爾姆公司生產的ELM327芯片加入了CAN、ISO 9141-2、SAE J1850等七種通信協議,可以自動檢測車輛通信協議并設置成與車輛一致的協議。藍牙實現了點對點傳輸,傳輸保密性好,是目前最受歡迎的無線通信技術,許多車載產品都使用藍牙進行通信。
Android在android.bluetooth包封裝了對藍牙通信的功能豐富的類,例如BluetoothAdapter、BluetoothDevice、BluetoothServer
Socket、BluetoothSocket等。
我們不需要外加其他設備,利用Android手機自帶的藍牙API接口,通過APP客戶端,就能實現手機與ELM327的通信。
2.3 軟件設計
2.3.1 命令形式
我們需要在手機端發送指令給ELM 327,然后ELM 327解析命令,把命令傳送給ECU。ELM 327能夠解析兩種命令形式:AT命令和OBD命令。AT命令又叫內部命令以“AT”開頭,因為這是ELM 327內部使用的命令,即不會與ECU進行通信,用于對ELM 327進行設置操作。
凡是沒有以“AT”兩個字開頭的所有命令都會被認為是汽車OBD命令,OBD命令的格式是固定的,第一個字節是請求的數據類型,第二個字節是請求的實際信息,必須使用十六進制數進行表示,見表1。
例如獲取發動機冷卻液溫度,模式是01,PID是05,因此我們的請求指令應該是0105。
2.3.2 代碼解析
我們使用Eclipse結合ADT(Android Developer Tools)進行Android開發,通過BluetoothServerSocket的accept()方法獲取BluetoothSocket對象。
當Android的content中的設備連接正常后,通過BluetoothSocket采用串行數據通信實現與CAN轉藍牙控制器模塊的交互[4]。與ELM327的連接代碼需要執行在線程里面,使用InputStream讀取ELM 327發送過來的數據。
由于ELM 327發送的數據流中,夾雜著回車符,所以我們應該去掉回車符,把真正有意義的數據組合在一起,當ELM 327發送了“>”時,就說明這條回應信息結束,退出循環。
由于InputStream的read方法是阻塞式方法,所以當我們讀取到回應信息的末尾,退出while循環的時候就會一直在read方法這里等待ELM 327發送的新消息。
3 實驗驗證
我們使用ECU模擬器進行程序調試以及故障碼的獲取。在車輛越來越趨于網絡化的趨勢下,ECU模擬器是汽車產品開發、調試、生產必備的工具,能為為開發人員節省大量的時間。
當前車輛上的總線設備越來越多,有的高端車上甚至多到有上百個ECU,而車輛ECU之間通過總線交換數據信息,目前有關車聯網系統的開發越來越多,而車聯網設備獲取車輛信息的接口全部采用的是OBD通用接口,對于產品的調試,都要進行實車的對接測試,但是有時候又找不到各種協議的車輛,或者是每次測試都要啟動車輛,去車輛狹小的空間進行操作,很是不方便,ECU模擬器可以解決這些問題。
ECU模擬器可以模擬車輛OBD接口的大部分協議,由于車輛系統是各個品牌國家獨立,所以協議從最早期有很多不同種類的協議,互相不兼容,主要是幾大類,基于K線的,基于CAN線的,還有一種是J1850(主要是早期的美國部分車輛使用),目前市面上大部分的是基于K線和CAN線的,大約占有90%多的車輛保有量。通過Android手機發送PID為03的請求指令,故障碼信息,如圖2所示。
得到所有的故障碼數據,需要故障碼庫進行比對,得到具體的故障碼含義。
4 結 語
本設計通過藍牙ELM 327獲取OBD-II故障碼,顯示在Android應用上,使車主能夠及時了解汽車的各項數據和故障,減少因汽車故障發生的交通事故。
所有的驗證都是基于KWP 2000 5BPS初始化協議進行的,以后的工作就是完整各個協議的數據獲取,并且把數據發給服務器進行數據的集中儲存,便于用戶及車企在瀏覽器也可以查看數據并進行大數據分析。
參考文獻:
[1] 謝富強,唐耀庚,曹云建.基于單片機的汽車遠程監測車載終端硬件設 計[J].微機與應用,2014,6:22-25.
[2] 李松,王齡.發達國家IVHS研究與發展[J].國外公路,1998(4):19-22.
[3] 羅峰,孫澤昌.汽車CAN總線系統原理、設計與應用[M].北京:電子工業 出版社,2010.
[4] 李寧.Android/Ophone開發完全講義[M].北京:中國水利水電出版社,
2010.