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