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