基于Android的網絡車輛診斷與數據采集系統(tǒng)設計
作者 / 黃贊1 莫長江2 黃梓華1 1.嶺南師范學院 機電工程學院(廣東 湛江 524048)2.嶺南師范學院 信息工程學院(廣東 湛江 524048)
本文引用地址:http://www.ex-cimer.com/article/201811/395035.htm*基金項目:廣東省科技計劃項目(NO.2017A010102022);嶺南師范學院校級科研項目(NO.LY1806);2017年大學生創(chuàng)新創(chuàng)業(yè)訓練計劃項目
黃贊(1971-),男,廣東湛江人,漢族,高級實驗師/博士研究生,研究方向為精密測量與計算機視覺。
摘要:本文針對實現(xiàn)網絡化的車輛診斷與數據采集系統(tǒng),提出了一種基于Android線性鏈表的車輛信息采集并網絡存儲的設計方法。方案以藍牙OBDII(2nd On Board Diagnostics)硬件與Android程序為核心,通過高效的線性鏈表方式讀取車輛行車數據,在Android上以儀表盤等方式顯示,同時使用Android移動信號上傳到服務器,并搭建網站實現(xiàn)查詢、報表輸出等功能。系統(tǒng)程序使用DELPHI開發(fā),通過車輛實測,方案高效,性價比高,達到了車輛數據網絡化的目的。
行車安全是車輛設計與行駛的第一要素,而利用OBDII接口取得車輛的各項運行參數,可為車輛必備的ECU(Electronic Control Unit)的設計提供數據支撐,同樣也可使得最終用戶對于車輛的車況能有更全面的了解。車輛裝配企業(yè)進行車輛測試時,需要大量的汽車數據,這種數據并不單純是顯示在儀表中,或者是單機設備文件中,更需要把診斷終端在各臺車輛設備的數據通過網絡保存到服務器中,進行后期的查詢、分析工作。
普通市面上與文獻上的OBDII設備并不能滿足其多終端車輛數據采集的功能[1,2],如參考文獻1與2,有的沒有實現(xiàn)網絡化數據采集的功能;有的雖然使用了GPRS模塊實現(xiàn)采集,但并沒有使用Android智能終端程序且只對故障碼與GPS位置進行了采集,沒有本地故障碼清除、行車儀表數據顯示等功能,硬件成本較高,不能滿足本地ECU制造企業(yè)的需求。因此根據企業(yè)實際要求,設計并開發(fā)了一種在Android智能終端上使用線性鏈表實現(xiàn)數據儀表顯示、本機車輛故障碼清除、行車數據采集的網絡系統(tǒng)方案。
1 系統(tǒng)整體設計
1.1 需求分析
根據相關調查機構的數據統(tǒng)計[3], Android在2017年度中國智能手機市場,“安卓繼續(xù)同比增長,如今占據智能手機銷量的87.2%”,意味著在中國十部智能手機中,幾乎有九部都搭載的是Android操作系統(tǒng)。本系統(tǒng)設計使用Android做為診斷終端介質,可達到較好的性價比與用戶接受度。
車輛數據采集在底層依賴藍牙OBDII與ECU的通訊,可以讀取ECU掌握車輛的各個參數,如進氣壓力、節(jié)氣門相對位置、發(fā)動機轉速、缸壁溫度、點火提前角、速度、車輛故障碼等數值。而車輛數值需通過Android手機進行各數值的實時顯示、網絡集中上傳到服務器提供查詢與報表輸出功能,同時Android App能對車輛故障碼進行查詢與清除工作。
1.2 整體設計
通過需求分析,可劃分工程模塊,實現(xiàn)車輛參數顯示、故障診斷、網絡傳輸的多功能的車輛數據系統(tǒng)設計。
(1)設計藍牙OBDII接口的電路,使得接口電路能讀取車輛參數,并由藍牙接口與Android軟件進行交互。
(2)設計Android軟件,并研究OBDII協(xié)議,藍牙接口,實現(xiàn)藍牙通訊、網絡通訊、數值顯示、故障診斷與清除等功能。
(3)設計網絡通訊服務器接收程序,用于接收智能終端的數據上傳;設計服務器網站系統(tǒng),用于查詢終端上傳的數據等等。
而在開發(fā)環(huán)境上,統(tǒng)一使用DELPHI語言開發(fā)(2)(3)的功能程序,可提高系統(tǒng)的兼容性與開發(fā)效率?;镜南到y(tǒng)框圖如圖1所示。
2 硬件設計
硬件電路包含了兩大部分:
(1)OBDII專用芯片。芯片采用ELM327芯片[4],通過它提供的各種接口(K line、CAN等)與車輛ECU連接,可獲取車輛診斷信息,多用于故障碼讀取、清除、各參數讀取等應用。
(2)藍牙接口模塊。藍牙模塊采用HC-08[5],本模塊為串口藍牙模塊,使用它的TTL串口與ELM327芯片的串口交叉相連,可把OBDII的串口轉成藍牙串口,這樣,就形成了與Android系統(tǒng)的藍牙進行通訊的鏈路。
另外,包括了汽車電瓶12 V電源輸出轉5 V的電源部分電路與車輛的物理16針的診斷接口等,得到硬件電路圖2。
3 軟件設計
3.1 Android端軟件框架
Android軟件使用Embarcadero公司的DELPHI Seattle[6]版本開發(fā),基于面向對象PASCAL語言,突出優(yōu)勢在于跨平臺的編譯系統(tǒng),可實現(xiàn)一次編碼,多次編譯,即同一套代碼可編譯出在Windows、Android、IOS不同系統(tǒng)上運行的不同的目標程序,提高了工作效率。
利用市場占有率高的Android系統(tǒng)作為開發(fā)目標系統(tǒng),綜合使用多窗體技術、SQLite數據庫技術、內置藍牙控件與GPS控件、TeeChart儀表與圖表顯示[7]第三方控件,實現(xiàn)系統(tǒng)的設置、通信、顯示、本地記錄、繪制數據時間-數值曲線圖、數據上傳與車輛信息獲取等OBDII功能。
3.2 基于線性鏈表的藍牙通訊模塊
3.2.1 OBDII協(xié)議命令與故障診斷
ELM327支持OBDII通訊協(xié)議,并分成兩大類,通過串口通訊,發(fā)送ASCII碼,其中一類為AT命令,包含如“AT BRT”等諸如波特率的配置命令,如果不是以“AT”開頭的,ELM327芯片則認為是對車輛的OBDII命令,通常有9個模式,如表1所示。
每個模式下面都可能有若干個子命令,則發(fā)送對應命令時,第一個字節(jié)發(fā)送模式序號字節(jié),第2、3個字節(jié)則發(fā)送該模式下的子命令字節(jié),這些字節(jié)值稱為PID(parameter identification)。比如,發(fā)送:01 0C,表示顯示引擎rpm轉速,可能得到的回復是:41 0C 1A F8。回復的一個字節(jié)為對應01+40=41,第二個是對應的PID值0C,而第三、四個1A、F8則是需要的rpm值,通過協(xié)議的公式轉化,轉速根據公式(1)得到:
(1)
具體每個PID的含義與回復協(xié)議,可參看SAE J1979或者ISO 15031-5標準。除了獲得PID參數,根據表1,發(fā)送03命令,并解釋返回,可得到車輛對應的故障碼。故障碼返回如果不為“P0000”,則表示存在車輛故障,可根據返回的具體代碼查表獲得故障信息,而Android App獲得具體代碼后,可自動查表,顯示中文故障信息,比傳統(tǒng)的故障診斷儀更具優(yōu)勢。而發(fā)送04命令,可清除車輛故障碼?;谝陨蟽蓷l命令,可實現(xiàn)車輛故障診斷儀的功能。
3.2.2 Android藍牙的實現(xiàn)
本系統(tǒng)的Android藍牙[8]利用Delphi Seattle內建System.Bluetooth.pas單元的藍牙功能,包含了若干的藍牙類:TBluetoothManager、TBluetoothDeviceList、TBluetoothAdapter、TBluetoothDevice、TBluetoothService、TBluetoothServiceList、TBluetoothSocket。而特別對于串口藍牙而言,TBluetoothService指遠端藍牙設備服務,包括服務名和UUID兩個參數,并分別規(guī)定為 'SerialPort Service'和'{00001101-0000-1000-8000-00805F9B34FB}'。
根據以上藍牙類,調用對應的函數,具體實現(xiàn)步驟為:獲得藍牙配對設備列表、選定一個已配對藍牙進行配對操作、獲取已配對設備服務列表、判斷如果含有串口服務,則可為藍牙讀寫線程建立socket連接與初始化工作。
設置Fsocket為藍牙socket全局變量,則Android寫藍牙函數為socket.sendData(ToSend),其中ToSend為發(fā)送字節(jié)數組類型system.sysutils.Tarray,要發(fā)送的數值可放入可變長度的字節(jié)型數組統(tǒng)一發(fā)送;Android讀藍牙函數為Fdata:=Fsocket.readData,F(xiàn)data為返回值,與ToSend數據類型一致,讀取返回值后訪問該變長字節(jié)數組,根據OBDII命令通信協(xié)議,可解釋每個字節(jié)的含義,得到對應的參數值。該讀藍牙函數為阻塞型函數,必須放入子線程執(zhí)行。
3.2.3 頭尾插入式線性鏈表算法應用于藍牙通訊
線性鏈表是指有鏈接存儲結構的線性表,它用一組地址動態(tài)分配的單元存放線性表中的數據元素,一般用結點描述:結點(表示數據元素) =數據域(數據元素的映象) + 指針域(指示后繼元素存儲位置)。線性鏈表大概可分為單向線性鏈表、雙向線性鏈表,循環(huán)線性鏈表[9]。
鑒于OBDII協(xié)議命令的發(fā)送規(guī)律,算法上采用雙向線性鏈表,循環(huán)線性鏈表都不太合適,因此采用頭尾插入式單向線性鏈表。
一般的單向線性鏈表都在頭部讀取元素,尾部插入元素的FIFO(Fisrt In First Out)處理算法,而系統(tǒng)采用頭尾插入式單向線性鏈表算法,把優(yōu)先級高的命令元素立刻插入頭部,否則還是按照原算法插入鏈表尾部。在系統(tǒng)實現(xiàn)中,當用戶界面并不急切顯示其命令返回結果時,依次進行順序發(fā)送,使用鏈表尾插入方式增加鏈表節(jié)點;反之,當其命令的執(zhí)行效果需要馬上在軟件界面體現(xiàn),則使用鏈表頭插入方式增加鏈表節(jié)點,使得需要盡快執(zhí)行的OBDII命令插隊到第一執(zhí)行,例如用戶界面切換到用戶查詢與消除故障碼時,需要馬上得到系統(tǒng)響應,就要使用在鏈表頭插入節(jié)點命令的方法去避免用戶長時間的等待。實踐證明,當出現(xiàn)用戶車輛故障碼查找與消除界面時,命令插入連表頭,可馬上得到響應,快速實現(xiàn)車輛故障碼顯示及清除故障碼的動作。鏈表的插入與讀取(刪除)如圖4所示。
本單向線性鏈表數據域為myData,數據類型為字節(jié)數組,可存儲OBDII命令字節(jié),指針域為next,指向下一個元素存儲位置。另外,基于面向對象的編程思維,把頭尾插入式單向線性鏈表的操作實現(xiàn)封裝成了TsingleQueue類,類包含頭尾指針定義、初始化鏈表方法、增加節(jié)點方法、刪除節(jié)點方法與清空鏈表方法等。
其中,類方法中增加節(jié)點addQueue方法為實現(xiàn)頭尾插入式單向線性鏈表的核心方法,參照圖4中在鏈表頭插入節(jié)點p與在鏈表尾插入節(jié)點p的原理,具體實現(xiàn)如下:
function TsingleQueue.addQueue(ele:dataArr;headOrRear:boolean):boolean;
var
p:sQueue;
begin
new(p); //動態(tài)分配內存節(jié)點
p^.myData:=ele;//節(jié)點中的數據域賦值
if (headOrRear=true) or (head=rear) then
//如果是在鏈表尾部或者空鏈表插入節(jié)點
begin
P^.next:=nil;
rear^.next:=p;
rear:=p;
end
else //如果是在鏈表頭部插入節(jié)點
begin
p^.next:=head^.next;
head^.next:=p;
end;
result:=true;
isEmpty:=false; //非空鏈表標記
end;
在主程序中,使用sq:=TsingleQueue.create生成鏈表,sq.initQueue方法初始化鏈表后,為了增強用戶體驗,數據處理不能放在用戶界面主線程,以免程序響應時間過長,照成用戶界面假死,需使用多線程[10]后臺操作該線性鏈表類,并注意多線程的臨界區(qū)操作,定義cs:TcriticalSection,避免出現(xiàn)多線程調用時,造成因非線程安全引起的鏈表數據錯誤,線程核心代碼如下:
while not Terminated do
begin
cs.Enter;//進入臨界區(qū)
tmp:=sq.delQueue;
//讀取并刪除線性鏈表的首個OBDII命令
cs.Leave;//離開臨界區(qū)
setLength(toSend,5);//分配命令數組
for i:= Low(tosend) to High(tosend) do
toSend[i]:=tmp[i];//OBDII命令數組賦值
if toSend[0]<>0 then
begin
mainform.FSocket.SendData(ToSend);//使用藍牙端口發(fā)送OBDII命令
receivedBT;//讀藍牙返回值并解釋存儲
end;
end;
3.3 服務器模塊
為實現(xiàn)多終端數據網絡采集功能的特殊需求,需設計服務器數據庫,系統(tǒng)采用了MSSQLSERVER關系型數據庫,設計有車輛信息表、用戶表、設置表與車輛數據表以及對應的數據庫存儲過程、觸發(fā)器程序等。
而系統(tǒng)中間件DataSnap[11]中間件在服務器中實現(xiàn)接收終端數據,并存入數據庫的功能,采用的DataSnap核心基于JSON與HTTP REST的跨平臺標準。程序主要使用了FIREDAC數據庫組件進行對數據庫的讀寫控制,WebModuleUnit實現(xiàn)HTTP接口,ServerMethodUnit實現(xiàn)數據庫連接、數據表讀寫與存儲過程控制。
而服務器的另一個功能是網站發(fā)布。使用DELPHI+uniGUI的模式進行網站開發(fā),編程設計網站讀取用戶手機終端上傳到數據庫的各項PID數據、經緯度數據等信息并顯示在瀏覽器上,可實現(xiàn)查詢數據、報表輸出的功能。
4 工程實測與結論
Android手機為小米Note電信增強版,版本4.4.4KTU84P,MIUI5,車輛選用北京現(xiàn)代瑞納VERNA做為實測車輛。硬件接入車輛的OBDII接口后,打開本系統(tǒng)設計的Android軟件,并運行服務器的DataSnap中間件服務器接收參數,IIS網站服務器發(fā)布編寫好的網站。
經測試,本系統(tǒng)能查詢并消除車輛故障碼的功能,正常讀取車輛的各項核心數據,并成功上傳至服務器存儲,通過網頁訪問,可得到多終端各個車輛的數據,達到了預期的設計要求,并通過了企業(yè)的驗收。終端讀取車輛實時數據如圖5所示。(1)為車輛怠速時的儀表顯示頁面;(2)為車輛正常行駛時的儀表顯示頁面;(3)(4)為車輛正常行駛時的部分PID數據。
而圖6為瀏覽器中顯示是服務器網站的頁面之一:網絡采集的部分車輛PID信息網絡頁面,該網站頁面由uniGUI技術編程生成,可通過數據生成日期進行查詢,亦可通過車輛識別碼進行聯(lián)合查詢(車輛識別碼由企業(yè)自主生成),而查詢結果可生成打印報表輸出,企業(yè)用戶可利用報表數據,分析ECU對車輛在各個狀態(tài)時的控制效果,調整與匹配車輛的各項參數,實現(xiàn)了既定功能。
通過線性鏈表與多線程等關鍵技術在藍牙通訊中的工程應用,一方面提高了通訊可靠性,另一方面,程序運行界面無停滯死機,提升了用戶體驗,而利用了Android移動互聯(lián)網、 OBDII協(xié)議的網絡車輛數據采集系統(tǒng)具有性價比高、用戶交互性強等特性,可直接應用于車輛的診斷、實時數據網絡監(jiān)測、GPS定位等項目需求。
參考文獻:
[1]潘益斌,張海峰.基于OBD的汽車數據采集及捕獲系統(tǒng)設計[J].杭州電子科技大學學報(自然科學版),2015:45-48.
[2]楊彬,周建武.基于OBDII和GPRS遠程汽車故障診斷系統(tǒng)設計和實現(xiàn)[J].計算機應用與軟件,2012(09):209-212.
[3]Kantar:2017年中國智能手機市場Android份額高達87%[EB/OL].(2018-9-20) [2017-5-12] http://tech.sina.com.cn/roll/2017-05-13/doc-ifyfecvz1148686.shtml
[4]Elm Electronics.ELM327 OBD to Rs232 Interpreter[EB/OL].(2016-05-13) [2016-09-13]http://wenku.baidu.com/link?url=7QV1b8sAtvp90L82s94895SajqTE_5FYdohhlbmX0wUFxW9MetB5t27wfhyXu2YDA-6zqn983vr86p-u8nZK2ybTUii3Xm7TqB_xa_wF3I7
[5]匯承信息科技.HC-08藍牙串口通信模塊用戶手冊V2.4 [EB/OL].(2016-07-26) [2016-09-28]http://www.wavesen.com/mysys/db_picture/news3/2016726165447101.pdf
[6] 黃春香,楊奕.基于Delphi的PC機與AVR單片機的串行通訊[J].儀表技術與傳感器,2012(06):112-114.
[7] 蔡黎,代妮娜,鄧明.基于OBD協(xié)議的Android平臺汽車虛擬儀表設計[J].電子技術應用,2011,37(12):91-94.
[8] Thomas Soderholm.簡化低功耗藍牙醫(yī)療設備的設計[J].電子產品世界,2018,25(05):63-64+70.
[9]楊澤林,李先發(fā). 基于雙指針環(huán)形緩沖區(qū)的數據采集系統(tǒng)設計[J].儀表技術與傳感器,2016,11:67-69.
[10]許健,于鴻洋.一種Linux多線程應用下內存池的設計與實現(xiàn)[J].電子技術應用,2012,38(11):146-149.
[11]劉磊.基于Datasnap技術的信貸管理系統(tǒng)的設計與實現(xiàn)[J].科學技術與工程,2006,6(17):2766-2768.
本文來源于《電子產品世界》2018年第12期第39頁,歡迎您寫論文時引用,并注明出處。
評論