安卓開放附件協議 1.0

Android USB 配件必須遵守 Android Open Accessory (AOA) 協議,該協議定義了配件如何檢測並設置與 Android 設備的通信。配件應執行以下步驟:

  1. 等待並檢測連接的設備。
  2. 確定設備的配件模式支持。
  3. 嘗試以附件模式啟動設備(如果需要)。
  4. 如果設備支持AOA,則與設備建立通信。

以下部分說明瞭如何實施這些步驟。

等待並檢測連接的設備

配件應不斷檢查連接的 Android 設備。連接設備時,附件應確定設備是否支持附件模式。

確定附件模式支持

當 Android 設備連接時,它可以處於以下三種狀態之一:

  • 支持安卓配件模式,已經處於配件模式。
  • 支持安卓配件模式,但不處於配件模式。
  • 不支持安卓配件模式。

在初始連接期間,配件應檢查連接設備的 USB 設備描述符的版本、供應商 ID 和產品 ID。供應商 ID 應與 Google 的 ID ( 0x18D1 ) 匹配。如果設備已經處於附件模式,則產品 ID 應為0x2D000x2D01 ,並且附件可以使用自己的通信協議通過批量傳輸端點與設備建立通信(設備不需要在附件模式下啟動)。

注意: 0x2D00是為支持附件模式的 Android 設備保留的。 0x2D01是為支持附件模式以及 Android 調試橋 (ADB) 協議的設備保留的,該協議為 ADB 公開了帶有兩個批量端點的第二個接口。如果您在計算機上模擬附件,則可以使用這些端點來調試附件應用程序。通常,除非配件在設備上實現對 ADB 的直通,否則不要使用此接口。

如果 USB 設備描述符中的版本、供應商 ID 或產品 ID 與預期值不匹配,則配件無法確定設備是否支持 Android 配件模式。配件應嘗試以配件模式啟動設備(詳見下文)以確定設備支持。

關鍵點: USB 附件必須在初始握手時發送標頭。標題包含製造商、型號和版本。雖然 version 是可選字段,但如果安裝了僅匹配版本的 Android 應用,但配件不發送版本,則運行在 Android 10 及以下的 Android 設備將由於系統進程中拋出異常而重新啟動。

嘗試以附件模式啟動

如果版本、供應商和產品 ID 與處於附件模式的 Android 設備不對應,則附件無法確定該設備是否支持(但不處於)附件模式,或者該設備是否不支持附件模式。這可能是因為支持附件模式(但不處於附件模式)的設備最初報告的是設備製造商供應商和產品 ID,而不是AOA供應商和產品 ID。

配件應嘗試以配件模式啟動設備,以確定設備是否支持該模式:

  1. 發送 51 控制請求(“Get Protocol”),判斷設備是否支持 Android 附件協議。如果設備支持該協議,它會返回一個非零數字,表示支持的協議版本。控制請求位於端點 0 上,具有以下特徵:
    requestType:    USB_DIR_IN | USB_TYPE_VENDOR
    request:        51
    value:          0
    index:          0
    data:           protocol version number (16 bits little endian sent from the
                    device to the accessory)
    
  2. 如果設備返回支持的協議版本,則向設備發送帶有標識字符串信息的控制請求。此信息允許設備確定附件的適當應用程序(或如果適當的應用程序不存在,則向用戶提供 URL)。控制請求位於端點 0(對於每個字符串 ID),具有以下特徵:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    支持以下字符串 ID,每個字符串的最大大小為 256 個字節(必須以\0以零結尾)。

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. 發送控制請求以要求設備以附件模式啟動。控制請求位於端點 0 上,具有以下特徵:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

完成這些步驟後,附件應等待連接的 USB 設備以附件模式在總線上重新自我介紹,然後重新枚舉連接的設備。該算法通過檢查供應商和產品 ID 來確定配件模式支持,如果設備成功切換到配件模式,則它們應該是正確的(例如,對應於 Google 的供應商和產品 ID,而不是設備製造商的 ID)。如果 ID 和版本正確,則附件移動以與設備建立通信

注意: AOA 目前不支持同時 AOA 和 MTP 連接。要從 AOA 切換到 MTP,配件必須首先斷開 USB 設備(物理上或以等效方式),然後使用 MTP 重新連接。

如果任一步驟失敗,則配件確定該設備不支持 Android 配件模式並等待下一個設備連接。

與設備建立通信

如果配件檢測到處於配件模式的 Android 設備,則配件可以查詢設備接口和端點描述符以獲取與設備通信的批量端點。

接口和批量端點的數量取決於產品 ID。具有以下產品 ID 的 Android 設備:

  • 0x2D00有一個接口,帶有兩個用於輸入和輸出通信的批量端點。
  • 0x2D01有兩個接口,每個接口都有兩個批量端點,用於輸入和輸出通信。第一個接口處理標准通信,第二個接口處理 ADB 通信。要使用接口,請找到第一個批量輸入和輸出端點,使用SET_CONFIGURATION ( 0x09 ) 設備請求將設備配置設置為值 1,然後使用端點進行通信。