Android 開放配件 1.0

Android USB 配件必須遵守 Android 開放配件 (AOA) 協議,該協議定義配件如何檢測 Android 裝置並與其建立通訊。配件應執行以下步驟:

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

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

等待並偵測連接的設備

配件應持續檢查連接的 Android 裝置。當設備連接時,配件應確定該設備是否支援配件模式。

確定配件模式支持

注意:連接配件不需要 USB 偵錯,但開發過程中可能需要 ADB。有關詳細信息,請參閱調試注意事項

當 Android 裝置連接時,它可能處於以下三種狀態之一:

  • 支援Android配件模式,並且已經處於配件模式。
  • 支援Android配件模式,但不是配件模式。
  • 不支援Android配件模式。

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

注意: 0x2D00是為支援配件模式的 Android 裝置保留的。 0x2D01是為支援配件模式以及 Android 偵錯橋接器 (ADB) 協定的裝置保留的,該協定公開帶有兩個 ADB 批次端點的第二個介面。如果您在電腦上模擬附件,則可以使用這些端點來偵錯附件應用程式。一般來說,除非配件在設備上實現了 ADB 直通,否則不要使用此介面。

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

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

嘗試以配件模式啟動

如果版本、供應商和產品 ID 與處於配件模式的 Android 裝置不對應,則配件無法確定裝置是否支援(但不處於)配件模式或裝置是否不支援配件模式。發生這種情況的原因是支援配件模式(但未處於配件模式)的設備最初報告設備製造商供應商和產品 ID,而不是AOA供應商和產品 ID。

配件應嘗試在配件模式下啟動設備以確定設備是否支援該模式:

  1. 發送 51 控制請求(「取得協議」)以確定裝置是否支援 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 來確定配件模式支持,如果設備成功切換到配件模式,則供應商和產品ID 應該是正確的(例如,對應於Google 的供應商和產品ID,而不是設備製造商的ID)。如果 ID 和版本正確,配件將開始與裝置建立通訊

注意: AOA 目前不支援同時進行 AOA 和 MTP 連線。要從 AOA 切換到 MTP,配件必須先斷開 USB 裝置(實體或以等效的電氣方式),然後使用 MTP 重新連接。

如果任何步驟失敗,配件將確定該裝置不支援 Android 配件模式並等待下一個裝置連線。

與設備建立通信

如果配件偵測到處於配件模式的 Android 設備,則配件可以查詢裝置介面和端點描述符,以取得用於與裝置通訊的批次端點。

介面和批量端點的數量取決於產品 ID。 Android 設備,其產品 ID 為:

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