Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

Android開放附件協議2.0

本文檔介紹了自其初始發布以來Android Open Accessory(AOA)協議中的更改,並補充了AOA 1.0文檔 。 AOAv2添加了以下功能:

  • 音頻輸出(Android 8.0中已棄用)。
  • 支持作為Android設備的一個或多個人機接口設備(HID)的附件。

Android應用程序開發人員可以使用的Android SDK API保持不變。

檢測AOAv2支持

要確定所連接的Android設備是否支持附件和受支持的協議版本,附件必鬚髮送getProtocol()命令並檢查結果。僅支持AOAv1功能的Android設備必須返回1作為協議版本;在AOAv2中支持其他功能的設備必須返回2作為協議版本。 AOAv2與AOAv1向後兼容,因此為原始附件協議設計的附件仍可與較新的Android設備一起使用。

Accessory Development Kit 2011 源代碼<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp )庫中的以下示例演示了此協議檢查:

bool AndroidAccessory::switchDevice(byte addr)
{
    int protocol = getProtocol(addr);
    if (protocol >= 1) {
        Serial.print("device supports protocol 1 or higher\n");
    } else {
        Serial.print("could not read device protocol version\n");
        return false;
    }

    sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
    sendString(addr, ACCESSORY_STRING_MODEL, model);
    sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
    sendString(addr, ACCESSORY_STRING_VERSION, version);
    sendString(addr, ACCESSORY_STRING_URI, uri);
    sendString(addr, ACCESSORY_STRING_SERIAL, serial);

    usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR |
                USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL);
    return true;
}

AOAv2為附件模式下可用的每種USB接口組合包括新的USB產品ID:

產品編號通訊描述
AOAv1 0x2D00 附件提供兩個批量端點,用於與Android應用程序進行通信。
0x2D01 附件+ ADB 用於附件開發期間的調試。僅當用戶已在Android設備設置中啟用USB調試時可用。
AOAv2 0x2D02 音訊用於將音頻從Android設備流式傳輸到附件。
0x2D03 音頻+ ADB
0x2D04 配件+音頻
0x2D05 配件+音頻+ ADB

0x2D01繼續支持AOAv1中使用的產品ID( 0x2D000x2D01 )。

音頻支持

AOAv2支持通過標準USB音頻類接口從Android設備到附件的音頻輸出,該接口具有2通道,比特率為44100 Khz的16位PCM音頻(將來可能會添加其他音頻模式)。

要啟用音頻支持,附件必鬚髮送新的USB控制請求:

**SET_AUDIO_MODE**
requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        58
value:          0 for no audio (default),
                1 for 2 channel, 16-bit PCM at 44100 KHz
index:          0
data            none

必須先發送此命令, 然後再發送ACCESSORY_START命令進入附件模式。

HID支持

AOAv2允許配件向Android設備註冊一個或多個USB人機接口設備(HID)。這種方法顛倒了典型的USB HID設備(如USB鼠標和鍵盤)的通信方向。通常,HID設備是連接到USB主機(即個人計算機)的外圍設備,但是在AOA中,USB主機可以充當USB外圍設備的一個或多個輸入設備。

HID支持是標準HID事件的代理;該實現無需對事件的內容或類型進行任何假設,只需將其傳遞到輸入系統,即可使AOAv2附件充當任何HID設備(鼠標,鍵盤,遊戲控制器等)。您可以使用HID支持來提供基本功能,例如媒體基座上的播放/暫停按鈕,或使用高級功能,例如具有鼠標和完整QWERTY鍵盤的擴展塢。

AOAv2添加了新的USB控制請求,允許附件充當Android設備的一個或多個HID輸入設備。 HID支持完全通過零端點上的控制請求來處理,因此不需要新的USB接口。四個新的控制請求是:

  • ACCESSORY_REGISTER_HID向Android設備註冊新的HID設備。附件提供用於識別其他三個呼叫的HID設備的ID。該ID一直有效,直到USB斷開連接或附件發送ACCESSORY_UNREGISTER_HID以註銷HID設備為止。
  • ACCESSORY_UNREGISTER_HID註銷先前註冊的HID設備ACCESSORY_REGISTER_HID
  • ACCESSORY_SET_HID_REPORT_DESC將HID設備的報告描述符發送到Android設備。此請求用於描述HID設備的功能,必須在向Android設備報告任何HID事件之前發送此請求。如果報告描述符大於端點零的最大數據包大小,則發送多個ACCESSORY_SET_HID_REPORT_DESC命令以傳輸整個描述符。
  • ACCESSORY_SEND_HID_EVENT將輸入事件從附件發送到Android設備。

新控制請求的代碼定義為:

/* Control request for registering a HID device.
 * Upon registering, a unique ID is sent by the accessory in the
 * value parameter. This ID will be used for future commands for
 * the device
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID_DEVICE
 *  value:          Accessory assigned ID for the HID device
 *  index:          total length of the HID report descriptor
 *  data            none
 */
#define ACCESSORY_REGISTER_HID         54

/* Control request for unregistering a HID device.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            none
 */
#define ACCESSORY_UNREGISTER_HID         55

/* Control request for sending the HID report descriptor.
 * If the HID descriptor is longer than the endpoint zero max packet size,
 * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
 * commands. The data for the descriptor must be sent sequentially
 * if multiple packets are needed.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SET_HID_REPORT_DESC
 *  value:          Accessory assigned ID for the HID device
 *  index:          offset of data in descriptor
 *                      (needed when HID descriptor is too big for one packet)
 *  data            the HID report descriptor
 */
#define ACCESSORY_SET_HID_REPORT_DESC         56

/* Control request for sending HID events.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SEND_HID_EVENT
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            the HID report for the event
 */
#define ACCESSORY_SEND_HID_EVENT         57

與AOAv1的互操作性

原始協議( AOAv1 )支持Android應用程序通過USB直接與USB主機(附件)通信。 AOAv2繼續提供此支持並添加了新功能,以允許配件與Android操作系統本身(特別是音頻和輸入系統)進行通信。通過AOAv2的設計,可以構建一個附件,該附件除了原始功能集外還使用新的音頻和HID支持。只需將新功能與原始功能一起使用即可。

在沒有Android應用的情況下連接AOAv2

您可以設計使用音頻和HID支持但不與Android設備上的應用程序通信的配件(例如音頻底座)。對於這些配件,用戶無需接收對話框提示即可找到新連接的配件並將其與可以與其通信的Android應用程序相關聯。

要在附件連接後取消顯示此類對話框,附件可以選擇不將製造商名稱和型號名稱發送到Android設備。如果未將這些字符串提供給Android設備:

  • 系統不會嘗試查找與附件通信的應用程序。
  • 設備進入附件模式後,附件USB接口在Android設備USB配置中不存在。