Android Open Accessory 協議分析與開發

1. 背景介紹

 2011年Google推出Android開放配件協議AOA(Android Open Accessory Protocol)及配件開發工具包ADK(Accessory Development Kit)。當時開源硬件和硬件創業都比較熱,其中以Arduino平臺爲代表。Google想借着這個硬件平臺開拓智能傢俱的市場,藉此推出了AOA協議和對應的開發平臺,以便打通Android手機和周邊硬件的連接通道,從而擴大Android的生態鏈。2012年Google推出了2.0版本的協議,增加了音頻相關的支持,隨後沒有進一步的更新。從目前的狀況看,這個協議並沒有被廣泛的認可和使用。最近的消息是2014年Google發佈的Android Auto基於該協議構建了Android Auto Porotocol,Google未來可能會將其作爲Android系統與周邊硬件進行USB連接的基礎協議。
 更多背景資料請參考Google 2011 I/O大會視頻, 其中36分後開始介紹AOA。下面主要針對AOA協議及其開發進行分析和介紹。

2. 協議分析

2.1 Android 系統與配件的連接方式

連接方式

Android系統官方定義了兩種連接配件的方式:藍牙和USB,未來可能提供WiFi的連接方式。

藍牙連接

 Android系統定義的連接配件協議是SSP/A2DP,這些都是很成熟的協議,其優點很明顯——開發資源豐富,協議穩定,並且藍牙本身是無線連接,使用方便,儘管覆蓋距離沒有手機信號覆蓋範圍大,但已能夠滿足日常所需。缺點主要是傳輸帶寬有限,特別是給配件傳輸高保真音頻基本是不可能的。另外一個問題是耗電,不過隨着低功耗藍牙協議的推出這個問題已經得到解決。

USB連接

 相較藍牙連接,USB連接本身具有傳輸穩定、帶寬高、持續供電的優點,不過其缺點也比較突出,通訊距離比較短,有線連接對於遙控設備不是很方便。至於連接協議,Google並沒有借用現有的USB協議,而是另起爐竈定義了自己的協議—— AOA(Android Open Accessory Protocol),其中的緣由已經不得而知。說句題外話,Android Auto正是看到USB連接的優點比較適合手機與車機連接的,在第一版的Android Auto中選擇了這種連接方式。

WiFi連接

 這種連接方式可以解決藍牙帶寬不足的問題,又可以提供較好的覆蓋範圍,不過Google目前還沒有公開支持。只是從Android Auto的發佈會視頻中得知未來可能會使用WiFi-Direct協議,車內互聯是現在可以看得到的應用場景。

2.2 USB通訊模式

 這裏主要討論的USB通訊模式包括:USB Slave模式,USB Host模式(例如OTG),USB 配件模式(例如AOA)

USB Slave模式

USB Slave

 這種模式通常應用於PC與Android手機連接,PC端作爲服務的提供方,主要完成設備枚舉,搜索相關驅動並完成安裝,建立數據通路等工作。該模式下PC對Android手機供電。

USB Host模式

USB OTG

 這種模式通常應用於Android手機以OTG連接的方式連接外設,比如:鍵盤,鼠標等。Android手機端是簡化版的USB host端 ———— USB Embedded Host。它通過內置的外圍設備列表TPL(Target Peripheral List)完成設備枚舉和驅動加載,不具有加載未知設備驅動的能力。該模式下Android手機對外設供電。

USB 配件模式

USB AOA

 這種模式是Android定義的一種新的通訊模式,它將配件作爲協議交互的主要角色,配件內置USB Embedded Host端,可以爲Android手機供電,並且識別Android手機,建立數據通道。使得配件成爲一個簡化版的PC Host端,方便市面上Android手機拓展其功能。官方宣稱Android 2.3.4增加lib庫即可支持,Android 3.1以上系統直接支持。

2.3 AOA協議工作過程

 協議整體交互圖:

協議交互

  1. 配件端等待手機連接
  2. 手機接入配件
  3. 配件通過USB驅動的控制通道(0通道)獲取手機的vendor ID與product ID
  4. 配件分析獲取的vendor ID是否爲0x2D01, 0x2D02, 0x2D03或0x2D04,以及product ID是否爲0x18D1。如果均符合,則說件現在手機已經是配件模式,可以按照配件模式的要求直接重新配置USB端點和接口。否則啓動嘗試進入配件模式流程。
  5. 確定手機已經進入配件模式,重新枚舉USB設備,手機重新進行USB協商。
  6. 按照配件模式重新配置USB端點和接口,建立配件模式的數據通道。

 嘗試啓動配件模式交互流程:

協議探測

  1. 配件發送序號51的USB請求報文,手機收到後查詢自己的AOA協議版本,發送響應報文給配件。
  2. 配件校驗協議版本號,目前爲1或2,其他的均爲不支持。
  3. 配件發送序號52的USB請求報文,通過Index字段攜帶配件自身信息,包括製造商,型號,版本,設備描述,序列號,URI等。手機根據這些信息啓動響應的APP。
  4. 配件發送序號53的USB請求報文,切換USB模式,主要是根據切換vendor ID和product ID。
  5. 重新枚舉USB設備,準備建立AOA數據通道。

3. 軟件開發

 Android 提供了ADK(Accessory Development Kit)幫助開發者進行配件開發。ADK是一套完整的開發環境,基於Arduino 開源硬件平臺,主要包括:

  • USB主控板(Arduino Mega2560)及對應的firmware
  • USB Host Shield 及相應的library
  • Android Accessory protocol library
  • 一些Sensor和接口library
  • Android 手機控制APK

 ADK開發平臺結構如下圖:

平臺結構

 從上圖可以看出,Arduino平臺幫助開發者實現了AOA協議和Host驅動,從而搭建出一套Android手機與配件直接通訊的數據通道。整個結構有些像路由器的轉發,Arduino平臺將手機的控制命令轉發給硬件控制器,使得手機可以控制硬件。

 Android ADK開發主要包括三個方面:Arduino硬件開發環境搭建、Android手機軟件開發、配件硬件開發。

Arduino硬件開發環境搭建

 具體參見官網詳細流程。這裏簡單說一下做的事情,Arduino開發板是一個嵌入式系統,首先需要在PC機上搭建對應的開發環境,主要是lib庫,編譯環境,而後爲嵌入式系統燒入對應的固件,保證可以和PC機正常通訊,而且能夠正確工作即可。

Android手機軟件開發

 相關接口和文檔參見官網。Androd系統的framework和kernel已經處理的AOA協議大部分工作,APP開發者只需響應對應的通知事件即可。Android將Accessory的大部分實現均封裝在UsbAccessory類中,主要流程是:

  1. 接收連接建立通知
  2. 枚舉可用設備
  3. 獲取訪問權限
  4. 建立通訊通道
  5. 發送控制命令,接收控制響應

配件硬件開發

 主要是指配件的硬件設計及相應的驅動開發,每個硬件都不相同,這裏不做進一步討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章