Android Open Accessory 1.0

Android USB 配件必須遵循 Android Open Accessory (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 Debug Bridge (ADB) 通訊協定的裝置保留,可為 ADB 提供含有兩個大量端點的第二個介面。如果您要在電腦上模擬配件,可以使用這些端點來偵錯配件應用程式。一般來說,除非配件在裝置上實作 ADB 的傳遞功能,否則請勿使用這個介面。

如果 USB 裝置描述元中的版本、供應商 ID 或產品 ID 與預期值不符,配件就無法判斷裝置是否支援 Android 配件模式。配件應嘗試在配件模式下啟動裝置 (詳情請見下文),以判斷裝置是否支援。

重點: USB 配件必須在初始握手時傳送標頭。標頭包含製造商、型號和版本。雖然版本是選用欄位,但如果安裝的 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. 如果裝置傳回支援的通訊協定版本,請傳送控制要求,並附上識別字串資訊。裝置可利用這項資訊,判斷配件的適當應用程式 (如果沒有適當的應用程式,則會向使用者顯示網址)。控制項要求位於端點 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,再使用端點進行通訊。