999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Android的車胎監(jiān)測系統(tǒng)軟件的設計與實現

2019-08-29 08:03:22
計算機測量與控制 2019年8期
關鍵詞:服務

(無錫職業(yè)技術學院 物聯網技術學院,江蘇 無錫 214121)

0 引言

目前車胎監(jiān)測系統(tǒng)實現方案中,車胎內傳感器實時監(jiān)測胎溫胎壓信息,通過無線發(fā)送到無線接收端,無線接收端通常通過CAN總線傳送到儀表盤的專用的液晶顯示屏進行顯示,當超過相應閾值,在液晶顯示屏進行告警提醒并配合聲音告警[1-4]。在目前的車胎監(jiān)測實現方案中存在以下兩點不足:1)車胎告警閾值由硬件設定導致使用過程中不能動態(tài)調整告警閾值;2)液晶顯示屏通常只顯示車胎狀態(tài)異常,并不顯示實際胎溫和胎壓數值,因此告警顯示不夠具體、直觀,不便于駕駛員對車胎異常情況的精確判斷。

由于基于Android的中控大屏由于具有豐富的娛樂功能、方便與手機和網絡互聯的優(yōu)點,已經成為高端新能源客車的流行配置。在配置Android大屏的客車上,司機需要同時關注Android中控大屏和車胎監(jiān)測信息顯示液晶屏,造成操作不方便。此外通過Android大屏進行胎溫胎壓的顯示,可以更直觀顯示精確的胎溫胎壓數值,同時告警閾值為軟件設定值,可以動態(tài)地進行告警閾值調整,使得駕駛員可以根據季節(jié)不同來選擇合適的告警閾值。因此有必要通過設計轉換模塊,并設計和實現相應的Android端應用軟件,將車胎監(jiān)測信息接到Android中控大屏進行顯示,從而省去專用液晶屏,降低系統(tǒng)成本和方便司機操作,且可自行設定報警閾值,車胎監(jiān)測信息展示更直觀便捷。

本文介紹車胎監(jiān)測Android端應用軟件的設計和實現,其綜合利用startService和bindService,實現程序界面前臺運行時,實時接收車胎監(jiān)測報文并顯示胎溫胎壓實時值,若超過告警閾值,則相應位置的車胎顯示異常告警;當程序界面后臺運行時,后臺Service持續(xù)接收車胎監(jiān)測報文,當超過相應閾值,調出程序界面進行顯示和告警,經實際應用滿足了實時車胎監(jiān)測的功能。

1 系統(tǒng)硬件結構及原理

系統(tǒng)硬件結構框圖如圖1所示。上半部分,輪胎模塊和TPMS節(jié)點模塊采用目前市場主流的商用車胎監(jiān)測系統(tǒng)。由于車胎監(jiān)測系統(tǒng)通常接入CAN總線,而Android中控大屏通常使用USB通信接口,因此需要設計相應轉換模塊。考慮到TTL轉USB串口(CH340芯片)的模塊較為通用,因此設計CAN接口轉TTL的模塊和通用的TTL轉USB模塊相連接,完成CAN總線接口和USB接口的轉換。Android中控大屏支持USB OTG接口,其作為USB主設備與USB從設備進行USB串口通信。車胎監(jiān)測系統(tǒng)通過轉換模塊轉成USB接口接到Android系統(tǒng)。

圖1 系統(tǒng)硬件結構圖

系統(tǒng)的運行原理如下:在車輛行駛時,車輪處于轉動狀態(tài),安裝在車輪內的監(jiān)測傳感器將被觸發(fā),并每隔100 ms通過無線方式發(fā)送車胎監(jiān)測數據。TPMS節(jié)點無線接收模塊收到無線上報的監(jiān)測數據,并通過CAN總線接口發(fā)送到CAN總線。利用自行設計的轉換模塊,從CAN總線接收監(jiān)測數據,并轉變USB串口數據向上發(fā)送給Android中控大屏。車胎監(jiān)測系統(tǒng)需要設計Android應用程序,并安裝部署在中控大屏上。該Android應用程序將通過USB串口接收傳感器周期上報的每個車胎的胎溫和胎壓數據報文。每個數據報文固定10個字節(jié),格式如圖2所示。

圖2 胎溫胎壓監(jiān)測報文格式

程序根據報文計算胎溫t和胎壓p,計算公式如下(D[i]表示車胎監(jiān)測報文除去報文頭部分中下標為i的字節(jié)的8位無符號整數值):

t(Kpa)=D[1]*5.5

(1)

p(℃)=(D[3]*256+D[2])*0.03125-273

(2)

系統(tǒng)軟件定義胎溫上限閾值tH、胎壓下限閾值pL和胎壓上限閾值pH。當t>=tH或p<=pL或p>=pH任一條件滿足時,表示車胎狀態(tài)異常,程序產生告警提醒駕駛員。

2 軟件總體模塊設計

Android中控大屏的車胎監(jiān)測應用程序需要持續(xù)接收上報的USB串口數據報文進行胎溫和胎壓的數據展示,當胎溫或胎壓超過指定閾值時,進行相應的告警,同時告警閾值可進行動態(tài)調整。本文設計的車胎監(jiān)測應用程序總體架構如圖3所示。

圖3 胎壓監(jiān)測程序架構

MainActivity 是主操作界面,用來實時展示傳感器上報的車輛所有車胎的胎溫胎壓信息。為了滿足主操作界面后臺運行時亦能持續(xù)接收胎壓監(jiān)測報文,通過TireService后臺服務進行USB-OTG串口數據接收和胎壓監(jiān)測報文解析操作,當超出相應胎溫和胎壓閾值時調出程序主界面進行告警顯示。胎溫和胎壓閾值可手動進行調節(jié),通過點擊設置按鈕彈出對話框SettingDialog進行胎溫和胎壓閾值設置。

AutoStartBroadcastReceiver用于實現當Android開機啟動完成后,自動打開本監(jiān)測程序進行接收胎壓胎溫報文信息。當車胎監(jiān)測硬件斷開連接后,監(jiān)測程序應當結束運行,通過UsbDetachedBroadcastReceiver實現。

3 軟件詳細實現

3.1 程序運行流程

程序運行流程如圖4所示。系統(tǒng)開機和轉換模塊插入Android系統(tǒng)后,跳轉到本程序運行。程序運行后,啟動后臺服務TireService,TireService創(chuàng)建USB串口數據接收線程ReadThread,在接收線程中打開USB串口設備,并循環(huán)接收USB串口車胎監(jiān)測報文,通過Callback回調機制更新到Activity界面。

圖4 程序軟件流程圖

3.2 USB串口通信編程實現

Android系統(tǒng)使用USB Host API與USB接口的轉換設備進行通信。主要用到的API類包括UsbManager類(用來管理USB設備的類)、UsbDevice類(代表一個USB設備的類)、UsbInterface類(表示USB設備的一個接口)、UsbEndpoint類(表示一個接口的某個節(jié)點)以及UsbConnection類(用連接進行發(fā)送和接收數據)[5-6]。

與一般USB設備不同,USB串口設備還需要配置串口傳輸的波特率、數據位、停止位和奇偶校驗位等信息[7-8]。本文設計的轉換模塊采用的TTL和USB轉換芯片為CH340芯片,網絡上可以搜索到該芯片的免驅動Android USB Host模式的參考代碼,在實現USB串口通信代碼編程時,可參照進行剪裁。

3.3 程序啟動退出代碼實現

1)系統(tǒng)開機啟動

AutoStartBroadcastReceiver采用靜態(tài)注冊接收BOOT_COMPLETED,重寫OnReceive()方法,并在該方法中通過startActivity啟動程序[9]。其在AndroidManifest.xml設置為:

AutoStartBroadcastReceiver實現如下:

public class AutoStartBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = "android.intent.action.MAIN";

String category = "android.intent.category.LAUNCHER";

Intent myIntent = new Intent(context, MainActivity.class);

myIntent.setAction(action);

myIntent.addCategory(category); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(myIntent);

}

}

2)設備插入啟動

程序主界面MainActivity采用單例模式singleInstance,并監(jiān)聽轉換模塊插入動作USB_DEVICE_ATTACHED,并對USB插入動作設置過濾條件為對應轉換模塊的PID和VID[5]。主界面在AndroidManifest.xml中設置如下:

android:name=".MainActivity" android:launchMode="singleInstance">

android:resource="@xml/device_filter" />

其中device_filter.xml文件定義了轉換模塊USB設備的product-id和vendor-id。

3)設備拔出退出

當車胎監(jiān)測USB設備從安卓拔出時,監(jiān)測程序程序需要停止程序運行。因此在程序正常啟動后,通過代碼動態(tài)注冊廣播接收器usbDetachedBroadcastReceiver監(jiān)聽USB設備拔出動作USB_DEVICE_DETACHED。

usbDetachedBroadcastReceiver=new UsbDetachedBroadcastReceiver();

intentFilter = new IntentFilter();

intentFilter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED");

registerReceiver(usbDetachedBroadcastReceiver,intentFilter);

usbDetachedBroadcastReceiver在代碼實現時,重寫OnReceive()方法,判斷為轉換模塊拔出,則設置退出標記。

public void onReceive(Context context, Intent intent) {

UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);//獲取當前撥出的USB設備

if (device != null)

{if(device.getProductId()==29987&&device.getVendorId()==6790) {//判斷拔出設備為車胎監(jiān)測轉換模塊,設置退出標記

Intent myIntent = new Intent(context, MainActivity.class);

myIntent.putExtra("IsUsbDetached",true);

context.startActivity(myIntent);

}

}

}

在MainActivity中重寫onNewIntent()方法,判斷退出標志為真,調用finish方法結束程序[10]。

protected void onNewIntent(Intent intent) {

boolean IsUsbDetached=

intent.getBooleanExtra("IsUsbDetached",false);

if(IsUsbDetached)

{

//判斷已設置退出標記,則彈出提示框提示設備斷開,并結束程序運行

}

super.onNewIntent(intent);

}

3.4 后臺服務運行

為了保證程序前臺運行與否,后臺服務均需要持續(xù)接收車胎監(jiān)測報文,采取了下列措施:

1)后臺服務Service有兩種啟動方式startService和bindService。bindService啟動服務后,通過unbindService結束服務,其啟動的服務與Activity是捆綁關系,當Activity退出后,Service也會退出。Activity可與綁定服務通過回調接口的方式,方便快速進行數據交互。

startService啟動服務后,服務與Activity是分離的,當Activity退出后,服務繼續(xù)存在,只有調用stopService,后臺Service才會結束,但startService啟動的服務通常只能通過廣播的方式將數據發(fā)回界面進行顯示。

這2種模式不是完全分離的,可以同時使用。本程序Activity在OnCreate階段,調用startService啟動車胎監(jiān)測服務,在onResume階段通過bindService進行服務綁定;在onPause階段調用unbindService進行服務解綁,在onDestroy階段方調用stopService進行結束服務操作。從而達到程序啟動后,后臺服務便啟動持續(xù)接收USB車胎監(jiān)測報文,當程序在前臺運行時,又可通過綁定服務,簡便實現與Activity的雙向數據交互。

在bindService進行服務綁定時使用服務TireService內定義的到Binder對象,MainActivity通過Binder對象可以將當前設定的告警閾值以及當前是否處于報警暫停狀態(tài)傳遞到服務TireService。

public class Binder extends android.os.Binder{

//界面?zhèn)鬟f報警閾值到Service

public void Sethreshold(float twh,float tpl,float tph)

{

TireService.this.tiretempth=twh;

TireService.this.tirepresstl=tpl;

TireService.this.tirepressth=tph;

}

public void SetShowAlarm(boolean isshowalarm)

{

bshowAlarm=isshowalarm;

}

public TireService getService()

{

return TireService.this;

}

}

在TireService內需要定義回調接口,供服務中接收到USB車胎監(jiān)測報文后,通過回調接口將數據更新發(fā)回界面進行顯示。

private Callback callback=null;

public void setCallback(Callback callback) {

this.callback = callback;

}

public Callback getCallback() {

return callback;

}

public static interface Callback{

void OnSerialData(tireparam data);

}

主界面MainActivity需要實現ServiceConnection接口,實現onServiceConnected和onServiceDisconnected方法。

public void onServiceConnected(ComponentName componentName, IBinder iBinder) {

isBinded=true;

binder= (TireService.Binder) iBinder; binder.Sethreshold(tiretempth,tirepresstl,tirepressth);

binder.getService().setCallback(new TireService.Callback() {

@Override

public void OnSerialData(tireparam data) {

//tvout.setText(data);

Message msg=new Message();

msg.obj=data;

msg.what = IS_PktArr;

handler.sendMessage(msg);

}

});

}

@Override

public void onServiceDisconnected(ComponentName componentName) {

isBinded=false;

}

2)設置Activity為singleInstance模式,并重寫onKeyDown函數對返回按鍵KEYCODE_BACK的處理,通過調用moveTaskToBack方法將Activity移動到后臺運行,避免Activity被銷毀。

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK) {//點擊返回按鍵

if(bIsExit)

{//如果USB設備拔出,則結束Activity和Service

finish();

Intent intent= new Intent(this, TireService.class);

stopService(intent);

return true;

}

moveTaskToBack(true);

return true;

}

return super.onKeyDown(keyCode, event);

}

3)為了避免TireService因為資源不足被系統(tǒng)銷毀或在任務管理器中被用戶強行關閉導致無法持續(xù)接收USB車胎監(jiān)測報文,采用了關閉重啟的策略。在服務的onStartCommand中設置返回START_FLAG_REDELIVERY標記,代表service被kill后重新啟動,并攜帶上次啟動參數輸入參數intent。

public int onStartCommand(Intent intent, int flags, int startId) {

flags =flags| Service.START_FLAG_REDELIVERY;

return super.onStartCommand(intent, flags, startId);

}

4) TireService服務啟動后,啟動讀取線程ReadThread。為了TireService被強行關閉重啟后仍能持續(xù)接收USB串口車胎監(jiān)測數據報文,因此將USB設備打開操作在讀取線程中。

讀取線程ReadThread工作流程如圖5所示,首先枚舉查找USB轉換模塊設備,檢查程序是否被授予操作USB轉換模塊設備的權限,如果未授權該USB設備的操作權限,則通過PendingIntent申請USB操作權限。然后打開USB設備并循環(huán)接收USB車胎監(jiān)測報文,收到報文后獲得車胎位置以及相應胎溫胎壓信息。當程序界面MainActivity處在前臺運行時,通過Callback回調機制發(fā)回程序界面進行顯示,當超過閾值進行相應報警。當程序界面處在后臺運行時,如果胎溫胎壓超過相應閾值,則通過startActivity將程序界面轉到前臺運行。

圖5 ReadThread工作流程

5)告警閾值處理和告警暫停

告警閾值需要通過SettingDialog進行調整,該對話框通過Callback機制將閾值設置數值返回主界面。

當用戶在設置對話框修改了告警閾值時,告警閾值將更新到主界面MainActivity中,并通過綁定服務時返回的Binder對象傳遞到后臺服務TireService中。同時為了程序被強行關閉時,也可獲得正確的告警閾值,在告警閾值更改的同時,將利用SharedPreference保存告警閾值進行持久化存儲。在TireService服務啟動onStartCommand階段,判斷是否為MainActivity正常啟動TireService,還是因此程序被強行關閉而對服務的重啟。當服務啟動為程序被強行關閉而對服務的重啟時,需要在持久化存儲中讀取保存的告警閾值,否則重啟服務時告警閾值為局部變量的默認初始值0。

為了避免持續(xù)收到告警車胎監(jiān)測報文時,持續(xù)調出程序主界面導致無用轉到其他程序執(zhí)行的情況,因此在告警顯示時,將出現告警暫停操作按鈕,點擊該按鈕后,在5分鐘內即使收到胎溫或胎壓超過閾值的車胎監(jiān)測報文,也不會顯示告警情況。當告警暫停定時結束后,程序即又回到接收到異常車胎監(jiān)測報文,便進行正常告警的狀態(tài)。

4 系統(tǒng)結果測試

將車胎監(jiān)測系統(tǒng)安裝在新能源客車上,大客車配備Android顯示屏,通過轉換模塊將車胎監(jiān)測數據接到Android系統(tǒng),并通過本軟件進行展示。由于實際部署在車輛上時,不便連接調試和查看調試信息,因此采用如圖6測試模型,Ginkgo USB-CAN總線適配器連接到PC上作為CAN數據發(fā)送源,PC機通過使用Ginkgo USB-CAN配套軟件按照車胎協(xié)議報文格式按照周期100 ms不間斷發(fā)送車胎監(jiān)測報文。作為CAN數據源的Ginkgo USB-CAN總線適配器,與車胎監(jiān)測轉換模塊連接,從而完成CAN接口報文轉換成USB串口數據包接入到Android系統(tǒng)。

圖6 測試模型連接圖

當Android系統(tǒng)進行上電啟動,系統(tǒng)啟動后自動運行本應用程序主界面MainActivity顯示車胎監(jiān)測胎溫胎壓信息。在測試告警時采用發(fā)送相同的車胎監(jiān)測數據報文,通過閾值設置對話框調節(jié)胎壓告警下限閾值超出該車胎特定監(jiān)測報文的胎壓數值,則進行顯示告警。當點擊返回鍵后,MainActivity退到后臺運行,并通過后臺Service持續(xù)接收并解析USB串口車胎監(jiān)測報文,當胎溫或胎壓超過指定閾值,則將MainActivity調到前臺進行顯示。當從通過任務管理將程序強行關閉時,后臺Service將自動重啟并接收解析USB串口車胎監(jiān)測信息,當胎溫或胎壓超過指定閾值,則調出程序界面MainActivity進行顯示。

5 結束語

本文設計現實了一個利用Android端進行信息展示的車胎監(jiān)測系統(tǒng),系統(tǒng)實時接收USB接口上報的車胎監(jiān)測報文,當超過相應閾值則進行告警顯示。通過利用綜合利用startService和bindService兩種類型的后臺Service、利用moveTaskToBack將程序移到后臺運行、通過服務關閉重啟來確保后臺Service持續(xù)接收USB接口上報的車胎監(jiān)測報文,完成實時監(jiān)測的功能,經過實際部署應用,滿足的實時車胎監(jiān)測的需要。

猜你喜歡
服務
自助取卡服務
服務在身邊 健康每一天
服務在身邊 健康每一天
服務在身邊 健康每一天
服務在身邊 健康每一天
服務在身邊 健康每一天
服務在身邊 健康每一天
服務在身邊 健康每一天
高等教育為誰服務:演變與啟示
招行30年:從“滿意服務”到“感動服務”
商周刊(2017年9期)2017-08-22 02:57:56
主站蜘蛛池模板: 超清无码熟妇人妻AV在线绿巨人| 成人另类稀缺在线观看| 久青草免费在线视频| 国产清纯在线一区二区WWW| 在线观看欧美精品二区| 国产粉嫩粉嫩的18在线播放91| 亚洲日韩精品欧美中文字幕| 久久国产香蕉| 亚洲国产中文精品va在线播放 | 好紧好深好大乳无码中文字幕| 99久久成人国产精品免费| 亚洲一区色| 青青操视频在线| 91视频青青草| 欧美三级不卡在线观看视频| 亚洲91在线精品| 久久 午夜福利 张柏芝| 动漫精品啪啪一区二区三区| 国产视频 第一页| 午夜国产小视频| 欧美精品不卡| 91精品国产91欠久久久久| 免费在线成人网| 欧美一区二区三区香蕉视| 亚国产欧美在线人成| 久操线在视频在线观看| 国内精品自在自线视频香蕉| 欧美午夜在线播放| 亚洲三级影院| 色噜噜狠狠狠综合曰曰曰| 日韩精品成人网页视频在线| 久久久久亚洲Av片无码观看| 热思思久久免费视频| 伊人色在线视频| 婷婷色婷婷| 亚洲人网站| 日韩精品一区二区三区免费| 青青青亚洲精品国产| 久草视频一区| 国产日产欧美精品| 欧美成人综合视频| 国产va在线| 尤物亚洲最大AV无码网站| 国产精品成人免费视频99| 国产无码性爱一区二区三区| 亚洲天堂自拍| 久草视频精品| 青青极品在线| 美女被躁出白浆视频播放| 天天躁狠狠躁| 91麻豆国产精品91久久久| 成人综合久久综合| …亚洲 欧洲 另类 春色| 久久国产乱子| 亚洲成肉网| 黄色网址免费在线| 亚洲精品你懂的| 午夜无码一区二区三区在线app| 欧美另类一区| 伊在人亞洲香蕉精品區| 欧美日本在线观看| 青青青视频蜜桃一区二区| 91娇喘视频| 亚洲色精品国产一区二区三区| 亚洲日韩欧美在线观看| 99热国产这里只有精品无卡顿"| 精品亚洲欧美中文字幕在线看| 日本亚洲最大的色成网站www| 国产成本人片免费a∨短片| 亚洲综合18p| 亚洲品质国产精品无码| 日韩麻豆小视频| a亚洲视频| 欧美三级自拍| 欧美一级夜夜爽| 久热中文字幕在线| 日韩精品无码免费专网站| 亚洲第一视频免费在线| 久久精品国产精品青草app| 欧美专区在线观看| 久久综合五月婷婷| 国产亚洲欧美日韩在线一区|