喬美昀
(上汽通用五菱汽車股份有限公司,廣西 柳州545007)
汽車保有量的持續(xù)快速增長,環(huán)境、交通、能源、安全問題日益凸顯,汽車電子化和新興的車聯(lián)網(wǎng)技術(shù)是解決上述問題的重要途徑[1-2];同時(shí),汽車系統(tǒng)也變得復(fù)雜,故障診斷難度增加,對汽車診斷系統(tǒng)要求提高。針對國內(nèi)外汽車診斷系統(tǒng)的研究現(xiàn)狀和發(fā)展趨勢及Android平臺的優(yōu)勢[3],本文提出并設(shè)計(jì)開發(fā)了基于Android平臺的汽車故障診斷系統(tǒng)。
本文設(shè)計(jì)的汽車故障診斷系統(tǒng)要求根據(jù)診斷通信協(xié)議獲取車載總線網(wǎng)絡(luò)各ECU的故障等數(shù)據(jù),并設(shè)計(jì)算法對其進(jìn)行解析,而且能把解析的結(jié)果上傳至服務(wù)器進(jìn)行管理,同時(shí)服務(wù)器對軟件用戶進(jìn)行管理。本系統(tǒng)共由車載總線網(wǎng)絡(luò)系統(tǒng)、VCI(Vehicle Communication Interface)系統(tǒng)、Android終端軟件、售后診斷數(shù)據(jù)管理系統(tǒng)四大部分組成,其架構(gòu)如圖1所示。
圖1 系統(tǒng)架構(gòu)圖
汽車故障診斷系統(tǒng)在工作的過程中,帶有藍(lán)牙功能的VCI通過OBDII接口與車載總線網(wǎng)絡(luò)相連,根據(jù)診斷通信協(xié)議實(shí)現(xiàn)VCI與車載總線網(wǎng)絡(luò)的通信;通過藍(lán)牙方式實(shí)現(xiàn)VCI與Android平臺設(shè)備的數(shù)據(jù)通信;Android設(shè)備通過WiFi/4G網(wǎng)絡(luò)與遠(yuǎn)程服務(wù)器實(shí)現(xiàn)數(shù)據(jù)交互,并通過PAD端數(shù)據(jù)管理系統(tǒng)對服務(wù)器數(shù)據(jù)進(jìn)行管理。通信鏈路建立后,根據(jù)UDS(統(tǒng)一診斷服務(wù)),Android設(shè)備發(fā)送對應(yīng)功能的診斷服務(wù),通過VCI系統(tǒng)的處理,發(fā)送給車載網(wǎng)絡(luò);車載網(wǎng)絡(luò)中接收指令的ECU模塊將反饋數(shù)據(jù)并通過VCI系統(tǒng)發(fā)送給Android設(shè)備,Android設(shè)備利用其強(qiáng)大的處理能力將收到的數(shù)據(jù)根據(jù)協(xié)議進(jìn)行處理,然后通過友好的人機(jī)交互顯示出來以滿足各種功能需求。
車載診斷系統(tǒng)作為車載總線網(wǎng)絡(luò)系統(tǒng)的重要組成部分,通過OBDII接口和網(wǎng)關(guān)掛載在車載網(wǎng)絡(luò),與汽車各ECU組成網(wǎng)絡(luò),實(shí)現(xiàn)信息和數(shù)據(jù)的共享,根據(jù)通信協(xié)議實(shí)現(xiàn)診斷設(shè)備與ECU的通信,完成汽車的故障診斷功能[4]。
通用的Android設(shè)備與其他設(shè)備的通信方式主要是4G、WiFi、藍(lán)牙、USB,無法直接滿足總線通信協(xié)議規(guī)定的物理層、數(shù)據(jù)鏈路層、傳輸層的要求,因此本文需要研究并選擇VCI系統(tǒng)將車載總線網(wǎng)絡(luò)接口信號電平與Android設(shè)備通信接口電平進(jìn)行轉(zhuǎn)換,以實(shí)現(xiàn)車輛與Android設(shè)備的通信。VCI系統(tǒng)硬件實(shí)現(xiàn)通信鏈路物理層上的連接,VCI系統(tǒng)軟件實(shí)現(xiàn)數(shù)據(jù)通信鏈路控制和對硬件系統(tǒng)的管理。其主要的功能有:對VCI系統(tǒng)硬件控制,包括對串口、CAN接口及I/O端口的控制;對車載網(wǎng)絡(luò)ECU的通信鏈路控制與維持;對Android設(shè)備的通信鏈路控制與維持;K線和CAN總線數(shù)據(jù)報(bào)文處理[5]。
同時(shí)Android設(shè)備與服務(wù)器實(shí)現(xiàn)信息的交互完成軟件的在線激活、在線自動更新等功能。
售后診斷數(shù)據(jù)管理系統(tǒng)包含遠(yuǎn)程服務(wù)器和訪問服務(wù)器的PC數(shù)據(jù)管理端,是本文汽車故障診斷系統(tǒng)的數(shù)據(jù)管理中心,是整個(gè)系統(tǒng)的核心組成部分。Android設(shè)備通過4G/WiFi通信方式與遠(yuǎn)程服務(wù)器交互,實(shí)現(xiàn)數(shù)據(jù)的上傳和下載。
本系統(tǒng)通信總體方案如圖2所示。核心通信主要由三部分組成,VCI系統(tǒng)通過CAN模塊與車載CAN網(wǎng)絡(luò)實(shí)現(xiàn)通信;VCI系統(tǒng)的SCI與藍(lán)牙串口模塊相連通過藍(lán)牙方式實(shí)現(xiàn)與Android設(shè)備通信;Android設(shè)備通過4G/WiFi方式接入Internet實(shí)現(xiàn)與服務(wù)器信息的交互。同時(shí),PC管理端通過Internet訪問和管理服務(wù)器的信息;Android應(yīng)用程序在PC上開發(fā),并通過USB進(jìn)行調(diào)試。
圖2 系統(tǒng)通信總體方案
2.2.1 車載網(wǎng)絡(luò)與VCI通信
汽車的ECU具有自診斷模塊,汽車發(fā)生故障時(shí),自診斷模塊把故障數(shù)據(jù)存儲在EPROM,ECU以節(jié)點(diǎn)的形式搭載在車載網(wǎng)絡(luò)上,ECU與外部設(shè)備的通信是根據(jù)診斷協(xié)議來實(shí)現(xiàn)的。
由于VCI系統(tǒng)支持K-Line、CAN總線的多種診斷協(xié)議,適用于多種車型,針對某一標(biāo)識符的ECU建立通信鏈路必須通過上位機(jī)向VCI發(fā)送指令對其進(jìn)行初始化。針對采用UDS的某控制器,VCI的初始化過程如下步驟:對VCI診斷芯片進(jìn)行復(fù)位;選擇模塊對應(yīng)的診斷協(xié)議,設(shè)置CAN通信模式的流控制信息,CAN協(xié)議傳輸層要求發(fā)送首幀后,必須接收一個(gè)流量控制幀;針對要診斷的控制器設(shè)定CAN 11位標(biāo)準(zhǔn)格式ID;設(shè)置VCI系統(tǒng)CAN模塊的屏蔽器和過濾器;完成以上設(shè)置后,發(fā)送“3E00”維持服務(wù),若控制器反饋數(shù)據(jù)包含3E00+ID,則通信鏈路建立成功。
2.2.2 Android設(shè)備與VCI通信
根據(jù)功能需求,要實(shí)現(xiàn)藍(lán)牙通信,VCI必須具有藍(lán)牙功能。VCI系統(tǒng)已具備SCI功能,只需要選擇藍(lán)牙串口模塊即可完成通信功能,本項(xiàng)目選擇HC06藍(lán)牙串口模塊,其最主要的功能是取代了串口線,把串口轉(zhuǎn)換為藍(lán)牙。
Android設(shè)備與VCI的通信就是調(diào)用Android藍(lán)牙API完成配對,實(shí)現(xiàn)通信的過程設(shè)置藍(lán)牙,通過BluetoothAdapter的getDefaultAdapter()方法判斷設(shè)備是否支持藍(lán)牙功能,通過enable()方法打開藍(lán)牙。查找周圍設(shè)備,通過調(diào)用startDiscovery()方法搜索設(shè)備,搜索完成后會在一個(gè)列表頁面顯示所有的藍(lán)牙設(shè)備名稱和MAC地址以便后面的連接操作。連接設(shè)備,獲取一個(gè)代表遠(yuǎn)程BluetoothDevice的對象調(diào)用其 creatRfcommSocketToServiceRecord(UUID)方法獲取一個(gè)BluetoothSocket對象;調(diào)用其connect()方法即可實(shí)現(xiàn)連接。數(shù)據(jù)傳輸,Android設(shè)備從其BluetoothSocket對象中獲取輸出流,其次把字符串?dāng)?shù)據(jù)寫入到輸入流,然后VCI獲取其BluetoothSocket對象的輸入流,最后從其輸入流中把數(shù)據(jù)讀取出來,完成數(shù)據(jù)的傳輸[7]。
由于汽車故障診斷系統(tǒng)所有的數(shù)據(jù)都是通過Android設(shè)備的藍(lán)牙與VCI的藍(lán)牙模塊傳輸?shù)?,對藍(lán)牙通信要求很高。本文從搜索、配對和數(shù)據(jù)傳輸三個(gè)方面進(jìn)行優(yōu)化,解決了通用藍(lán)牙的通信過程中搜索設(shè)備時(shí)間長,無自動配對功能,調(diào)用數(shù)據(jù)接收時(shí)造成程序假死的問題。
2.2.3 Android設(shè)備與服務(wù)器通信
Android設(shè)備與服務(wù)器交互是采用互聯(lián)網(wǎng)上應(yīng)用最廣泛的HTTP網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn),而該協(xié)議的與接入網(wǎng)絡(luò)的方式無關(guān),對Android設(shè)備4G/WiFi方式接網(wǎng)絡(luò)均可,且在編寫程序時(shí)必須聲明Internet的權(quán)限。
因特網(wǎng)上的每一個(gè)資源都具有唯一的標(biāo)識名稱,被稱為URL(統(tǒng)一資源定位符)地址,這種地址通常是因特網(wǎng)上的一個(gè)網(wǎng)址,URLConnection就是URL和應(yīng)用程序之間的形成通信鏈路的橋梁,通過實(shí)例化HttpURLConnection類,并調(diào)用其方法即可實(shí)現(xiàn)對URL指定應(yīng)用資源的讀和寫操作[8]。
本文開發(fā)的軟件的功能是通過維修人員操作Android設(shè)備精確定位和查找汽車的故障。為了符合Android診斷軟件的工作原理和實(shí)現(xiàn)其功能,滿足軟件開發(fā)高內(nèi)聚、低耦合的設(shè)計(jì)概念,本軟件采用代碼可讀性強(qiáng)、結(jié)構(gòu)清晰的分層設(shè)計(jì)方案[9]。本軟件從上到下依次分為用戶界面層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層,詳細(xì)結(jié)構(gòu)如圖3所示。
圖3 汽車診斷軟件架構(gòu)
3.2.1 數(shù)據(jù)訪問層
數(shù)據(jù)訪問層是接收數(shù)據(jù)的載體層,主要訪問本地?cái)?shù)據(jù)庫的數(shù)據(jù),通過網(wǎng)絡(luò)訪問服務(wù)器管理端的遠(yuǎn)程數(shù)據(jù),通過VCI向車輛網(wǎng)絡(luò)中的ECU發(fā)送指令或獲取診斷數(shù)據(jù)。數(shù)據(jù)訪問層獲取的數(shù)據(jù)通過業(yè)務(wù)邏輯層處理,同時(shí)業(yè)務(wù)邏輯層也能向數(shù)據(jù)訪問層發(fā)送數(shù)據(jù)。本軟件數(shù)據(jù)訪問層主要函數(shù)如表1所示。
表1 數(shù)據(jù)訪問層接口函數(shù)
上位機(jī)軟件是通過發(fā)送接收函數(shù)實(shí)現(xiàn)和VCI系統(tǒng)及ECU數(shù)據(jù)交互的,主要由三個(gè)面向VCI驅(qū)動層的函數(shù)組成。SendATCommand函數(shù)封裝了藍(lán)牙通信的寫緩存函數(shù)和讀緩存函數(shù),發(fā)送的指令以“AT”字符串開始,主要是與VCI通信,完成VCI系統(tǒng)上電后的初始化及通信鏈路的建立。SendOBDCommand函數(shù)和DataReceive函數(shù)相對應(yīng),一個(gè)封裝了藍(lán)牙的寫緩存函數(shù),另一個(gè)封裝了藍(lán)牙的讀緩存函數(shù),當(dāng)上位機(jī)發(fā)送業(yè)務(wù)邏輯層生成的OBD診斷指令后,通過接收函數(shù)接收ECU反饋的數(shù)據(jù)供業(yè)務(wù)邏輯層處理。
本診斷系統(tǒng)通過SQlite數(shù)據(jù)庫存儲車型模塊配置信息和故障碼信息,通過Shared Preferences保存唯一的一個(gè)用戶信息(用戶名、密碼、激活碼、MAC、激活日期、有效期)用于激活功能。調(diào)用設(shè)計(jì)的SendJ-sonData和ReceiveJsonData方法實(shí)現(xiàn)用戶信息的發(fā)送和接收,調(diào)用設(shè)計(jì)的DownloadFile和UploadFile方法用于下載服務(wù)器中指定網(wǎng)址的新版本安裝文件和上傳本地診斷記錄等文件至服務(wù)器指定位置。
3.2.2 業(yè)務(wù)邏輯層
Android診斷軟件業(yè)務(wù)邏輯層的主要任務(wù)是完成診斷流程的控制和指令生成及反饋數(shù)據(jù)解析。診斷系統(tǒng)最核心的業(yè)務(wù)就是發(fā)送指令并接收反饋數(shù)據(jù),其工作基本流程如圖4所示。Android設(shè)備生成診斷指令后,調(diào)用發(fā)送函數(shù)發(fā)給VCI系統(tǒng),VCI系統(tǒng)觸發(fā)中斷,接收數(shù)據(jù)并發(fā)送給ECU,根據(jù)診斷協(xié)議ECU接收到數(shù)據(jù)并反饋給VCI,存入VCI的藍(lán)牙緩存中,VCI通過讀緩存方法將接收數(shù)據(jù)傳給Android設(shè)備。
圖4 診斷系統(tǒng)工作基本流程
考慮到VCI系統(tǒng)的發(fā)送和接收數(shù)據(jù)機(jī)制,對接收較多的數(shù)據(jù)必須對其進(jìn)行相對較長的延時(shí),才能保證通信的可靠性和準(zhǔn)確性。對具有N個(gè)數(shù)據(jù)流的數(shù)據(jù)組,采用循環(huán)發(fā)送數(shù)據(jù)流指令和循環(huán)接收反饋數(shù)據(jù)的方式;每發(fā)送一條讀數(shù)據(jù)指令,即接收一幀的數(shù)據(jù)流數(shù)據(jù),數(shù)據(jù)長度較短,VCI藍(lán)牙模塊的接收和發(fā)送也反應(yīng)較快,故只需要很短的延時(shí)即可保證通信的準(zhǔn)確性和可靠性。因此本文的診斷流程控制采用如圖5所示的方案。
圖5 診斷流程控制策略
ECU的診斷協(xié)議中包含很多的診斷服務(wù),與程序功能相關(guān)的服務(wù)都以變量或常量的形式保存在代碼中;而很多診斷服務(wù)又根據(jù)不同的DID(動態(tài)定義的標(biāo)識符)定義了子服務(wù),而要獲取指定DID的反饋數(shù)據(jù),需要生成對應(yīng)子診斷指令步驟如下:根據(jù)功能確定總的服務(wù);根據(jù)要選定的子項(xiàng)目獲取DID;根據(jù)診斷協(xié)議指令的規(guī)定,通過設(shè)計(jì)通用的算法生成對應(yīng)服務(wù)的請求指令。
ECU接收到指令反饋數(shù)據(jù)經(jīng)VCI系統(tǒng)到Android設(shè)備的數(shù)據(jù)是16進(jìn)制報(bào)文的形式;必須通過業(yè)務(wù)邏輯層對接收的數(shù)據(jù)解析才能傳遞給界面顯示層。根據(jù)診斷協(xié)議確定接收數(shù)據(jù)中的有效數(shù)據(jù);根據(jù)協(xié)議對中規(guī)定的參數(shù)定義設(shè)計(jì)通用的算法換算直觀的結(jié)果。
3.2.3 界面顯示層
Android軟件分離了用戶界面顯示的代碼和控制邏輯的Java代碼,不僅便于開發(fā)人員的編寫,也能使程序結(jié)構(gòu)更加清晰。Android應(yīng)用程序由多個(gè)界面組成,為了滿足程序的功能,不同的界面必須能夠?qū)崿F(xiàn)相互切換,Android程序的界面切換通過實(shí)例化Intent來完成。Android程序的任何兩個(gè)活動窗體都可以跳轉(zhuǎn)切換,靈活性很高,方便開發(fā)。
本汽車故障診斷系統(tǒng)由故障診斷、系統(tǒng)設(shè)置兩大功能組成,其方案如圖6所示。由于故障診斷系統(tǒng)的通用性,在實(shí)現(xiàn)子診斷功能之前,需根據(jù)待診斷車型的信息先選擇車型、排量、上市年份,然后選擇單個(gè)模塊進(jìn)入子功能或選擇全車診斷功能。對單個(gè)模塊的診斷分為診斷故障代碼、數(shù)據(jù)實(shí)時(shí)顯示、動作測試、模塊信息識別四大功能。對系統(tǒng)的設(shè)置主要是通過Android設(shè)備與服務(wù)器的交互,實(shí)現(xiàn)在線激活、修改密碼、在線更新三大功能。
圖6 汽車診斷系統(tǒng)功能架構(gòu)方案
本文設(shè)計(jì)的診斷故障代碼功能主要包含讀取故障碼、清除故障碼、讀取凍結(jié)幀功能。根據(jù)UDS協(xié)議中讀故障碼功能為19服務(wù),發(fā)送診斷指令然后接收數(shù)據(jù),根據(jù)ISO15031-6協(xié)議對故障碼解析。
為精確判斷故障的位置,本軟件根據(jù)診斷經(jīng)驗(yàn)將每個(gè)ECU電控系統(tǒng)又分為一些子系統(tǒng)。根據(jù)UDS協(xié)議,22服務(wù)是通過標(biāo)識符讀數(shù)據(jù);此服務(wù)允許診斷儀從一個(gè)或多個(gè)數(shù)據(jù)標(biāo)識符的ECU中請求的數(shù)據(jù)記錄的數(shù)值。針對汽車實(shí)時(shí)運(yùn)行的數(shù)據(jù),選取某項(xiàng)數(shù)據(jù),采用循環(huán)發(fā)送讀單個(gè)數(shù)據(jù)流指令并接收數(shù)據(jù)解析的控制策略,繪制數(shù)據(jù)流的實(shí)時(shí)曲線。
本軟開發(fā)了動作測試功能。其主要是實(shí)現(xiàn)對車輛執(zhí)行器的控制。一方面,通過該功能對車輛實(shí)現(xiàn)短時(shí)的調(diào)整,判斷執(zhí)行器是否發(fā)生故障;另一方面,通過該功能用移動設(shè)備實(shí)現(xiàn)對車輛的遠(yuǎn)程控制。
ECU作為汽車電子供應(yīng)商的一種產(chǎn)品,根據(jù)生產(chǎn)商的相關(guān)規(guī)定,模塊中有包含的零件號、硬件版本號、軟件號、軟件版本號的屬性信息。通過讀取模塊信息可以識別模塊,為車輛模塊的更換和刷寫提供指導(dǎo)和幫助。
全車診斷功能是本診斷系統(tǒng)重要的功能,也是4S店維修技師最常用的功能,通過簡單的操作可以讀取整車的故障碼,方便快捷。全車診斷的實(shí)質(zhì)是讀取故障碼和清除故障碼。
由于本文開發(fā)的軟件具有讀取車輛信息和操控車輛的功能,涉及到車輛的信息安全,必須對軟件用戶進(jìn)行嚴(yán)格的權(quán)限管理。本文開發(fā)了激活功能其策略是:只有在售后診斷軟件PC管理端添加授權(quán)的用戶才能使用該軟件;一個(gè)授權(quán)用戶只能在一臺Android設(shè)備上應(yīng)用。
本文設(shè)計(jì)的汽車故障診斷軟件,隨著車型的添加,功能的不斷完善,性能的優(yōu)化,軟件也需要不斷的更新。更新設(shè)計(jì)流程是軟件啟動時(shí)檢測軟件是否是最新版本,用戶可以根據(jù)需要選擇是否更新。
系統(tǒng)集成測試平臺由本地診斷實(shí)車測試平臺和遠(yuǎn)程測試平臺組成。本地測試平臺由診斷的車輛、帶藍(lán)牙模塊的VCI盒子和Android設(shè)備組成;遠(yuǎn)程功能測試平臺由帶4G或WiFi的Android設(shè)備、開啟的遠(yuǎn)程服務(wù)器和售后診斷軟件數(shù)據(jù)管理系統(tǒng)PC端組成。由測試場景模擬用戶客戶端,調(diào)用動態(tài)庫接口單元測試用例,配置文件設(shè)置連接用戶服務(wù)端,以返回的結(jié)果和測試數(shù)據(jù)為準(zhǔn),分析是否達(dá)到用戶目標(biāo)要求。
針對某一車型的7個(gè)電控模塊對軟件的各個(gè)功能進(jìn)行了反復(fù)的測試,測試結(jié)果的部分截圖如圖7、圖8、圖9、圖 10所示,并對測試結(jié)果進(jìn)行了分析,該軟件各功能設(shè)計(jì)開發(fā)正確,且性能可靠,并逐步在某企業(yè)4S店投入使用。
圖7 系統(tǒng)各功能測試結(jié)果
圖8 系統(tǒng)各功能測試結(jié)果
圖9 系統(tǒng)各功能測試結(jié)果
圖10 發(fā)動機(jī)測試數(shù)據(jù)
本文設(shè)計(jì)了一種基于Android平臺的汽車故障診斷系統(tǒng)的總體方案,實(shí)現(xiàn)了系統(tǒng)的核心通信,開發(fā)診斷系統(tǒng)軟件,并對軟件進(jìn)行了集成測試。該系統(tǒng)通用性好、功能強(qiáng)大、開發(fā)準(zhǔn)確、性能穩(wěn)定可靠,可以滿足售后4S維修技師的需求,且在某公司4S店逐步投入市場。