1. 程式人生 > >研究carlife車機端整合及開發

研究carlife車機端整合及開發

-- CarLife開發總結- https://blog.csdn.net/zjfengdou30/article/details/81808551
百度CarLife是百度推出的車聯網解決方案之一,目前分為前裝整合與後裝安裝兩種方式提供:
前裝專案申請:http://carlife.baidu.com/carlife/caroem/myproj 
前裝專案申請完成後,得到一個百度渠道號與整合資料 
後裝原始碼地址:https://github.com/ApolloAuto/apollo-DuerOS/tree/master/CarLife-Android-Vehicle
 
CarLife的開發完成,主要有以下幾個工作點: 
 1. CarLife lib庫的整合:lib庫主要的功能就是提供CarLife服務資料通道的建立,資料報文的封裝與解析,我們需要使用Android.mk檔案將其加入Android系統的交叉編譯環境中。 
 2. Usb通訊: CarLife的握手與通訊主要是通過Android的AOA方式來進行,具體通訊方式已經單獨作為介紹: USB開發——android AOA開發 
 3. CarLife視訊顯示: CarLife主要是採集手機端的視訊流,然後通過USB以H.264的方式傳送到車機端,車機端針對H.264進行硬解碼播放,播放主要用MediaCodec, 具體使用方式已經單獨作為介紹 android使用MediaCodec實現非同步視訊編解碼 
 4. CarLife音訊播放: CarLife的音訊資料是以PCM流的形式傳送到車機端,因此車機端只需要使用AudioTrack建立對應的配置來播放即可,注意音訊流資料的位元組序大小端是以小端的方式存在的。

-- 研究carlife車機端整合- https://blog.csdn.net/weixin_38148680/article/details/80586255
/**
* 思路:
* 1.連線方式AOA(Android Open Accessory)
* 2.車機端獲取USB操作許可權
* 3.檢測Android 裝置是否支援AOA協議
* 4.啟動Android 裝置的USB配件模式。
* 5.與Android 裝置建立USB通訊通道。
*/
  百度CarLife是一款手機車機互聯方案,通過CarLife使用者可以將移動裝置(Mobile Device,簡稱MD)上符合駕駛安全的應用通過多屏互動技術分享到車機(Head Unit,簡稱HU)上顯示,並通過車上的觸控式螢幕、硬按鍵、旋鈕操控和麥克風來控制CarLife,此方案能充分利用手機和車機的各自優勢,為駕駛員提供安全、豐富的資訊娛樂體驗。

  Carlife 協議規定了五種資料流控制流(cmd),視訊流(video),音訊流(Audio),語音流(VR)以及發控流(Touch),其中將音訊流分為Media和導航TTS兩種型別。協議定義了以下六個TCP socket通道用於傳輸這些資料流。
  控制流(Cmd):1個tcp socket通道,主要在車機和移動裝置之間傳輸相關控制訊息,比如車載資料、藍芽自動配對訊息、視訊初始化訊息等。
  視訊流(Video):1個tcp socket通道,主要用於移動裝置向車機傳輸視訊編碼資料。
  音訊流(Audio):2個tcp socket通道,一個用於傳輸Media音訊流,另一個用於傳輸導航TTS(Text to Sound)音訊流,分別用於移動裝置向車機傳輸音樂和導航語音播報的PCM流。
  語音流(VR):1個tcp socket通道,主要用於車機向移動裝置傳輸車機mic錄製的使用者語音資料。
  反控流(Touch):1個tcp socket通道,主要用於傳輸車機觸控事件或者按鍵事件到移動裝置端。

  針對Android5.0系統以及以上版本的移動裝置,可以使用AOA(Android Open Accessory)進行連線。AOA是Google為Android系統提供的一種外設通訊機制。該機制可以通過藍芽或者USB介面和外設通訊,無需Android系統特殊系統許可權,包括root和adb debug,對於CarLife而言,移動裝置端不需要獲取root許可權和開啟adb 更高的平臺中直接支援,作為一個附加庫也被Android 2.3.4(API level 10)支援。AOA2.0在Android4.1(API level 16)及更高的平臺中直接支援。在Android移動裝置上,Android系統提供標準的Accessory API用於訪問外設。採用USB通訊時,外部裝置的USB角色為Host,Android移動裝置為Device。
  基於當前5.0以上的手機佔比居高,ADB與AOA連線建議預設使用AOA連線,或者優先使用AOA連線,連線成功後首先檢測手機系統的版本號,如果手機系統版本低於5.0則主動切換到ADB模式。
 
-- 百度CarLife Android車機端黑屏問題
  發現與視訊頭幀sps和pps有關。在ShowFragment裡獲取了視訊的頭幀sps和pps,在介面內退出時,銷燬了介面,也刪除了頭幀資訊,後面雖然有資料繼續傳輸到車機端,但是缺少了sps和pps就解不了碼,因此黑屏。
  那為什麼手機USB線斷開後,再次連線就連得上呢?因為手機USB斷開之後,車機端將重新開啟ADB,並反初始化各引數,而手機端則停止了視訊傳輸,當再一次連線時,會重發頭幀sps和pps,自然可以解碼成功。
  記下sps和pps資料,但是不能在Activity中記,因為退出時會被銷燬,這裡在AppManager這個管理Activity的類裡記,然後在顯示的ShowFragment裡需要視訊頭幀的時候取出,車機視訊就不在黑屏。

CarLife安卓車機端- https://github.com/ApolloAuto/apollo-DuerOS/tree/master/CarLife-Android-Vehicle

https://img-blog.csdnimg.cn/2018122020425390.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXJlVXM=,size_16,color_FFFFFF,t_70

https://img-blog.csdnimg.cn/20181220204355850.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXJlVXM=,size_16,color_FFFFFF,t_70