Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Android Open Accessory Protocol 2.0, Android Open Accessory Protocol 2.0

Tài liệu này mô tả các thay đổi trong giao thức Android Open Accessory (AOA) kể từ lần phát hành đầu tiên và bổ sung tài liệu AOA 1.0 . AOAv2 bổ sung các tính năng sau:

  • Đầu ra âm thanh (không dùng nữa trong Android 8.0).
  • Hỗ trợ phụ kiện hoạt động như một hoặc nhiều thiết bị giao diện người (HID) với thiết bị Android.

Các API Android SDK có sẵn cho các nhà phát triển ứng dụng Android là không thay đổi.

Phát hiện hỗ trợ AOAv2

Để xác định xem thiết bị Android được kết nối có hỗ trợ phụ kiện và phiên bản giao thức được hỗ trợ hay không, phụ kiện phải gửi lệnh getProtocol() và kiểm tra kết quả. Các thiết bị Android chỉ hỗ trợ các feautures trong AOAv1 phải trả về 1 làm phiên bản giao thức; các thiết bị hỗ trợ các feautres bổ sung trong AOAv2 phải trả về 2 làm phiên bản giao thức. AOAv2 tương thích ngược với AOAv1, vì vậy các phụ kiện được thiết kế cho giao thức phụ kiện gốc tiếp tục hoạt động với các thiết bị Android mới hơn.

Ví dụ sau đây từ thư viện mã nguồn Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) minh họa kiểm tra giao thức này:

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 bao gồm các ID sản phẩm USB mới cho mỗi tổ hợp giao diện USB có sẵn trong chế độ phụ kiện:

Phiên bản ID sản phẩm Liên lạc Sự mô tả
AOAv1 0x2D00 phụ kiện Cung cấp hai điểm cuối hàng loạt để giao tiếp với ứng dụng Android.
0x2D01 phụ kiện + adb Với mục đích gỡ lỗi trong quá trình phát triển phụ kiện. Chỉ khả dụng nếu người dùng đã bật USB Debugging trong cài đặt thiết bị Android.
AOAv2 0x2D02 âm thanh Để truyền âm thanh từ thiết bị Android sang phụ kiện.
0x2D03 audio + adb
0x2D04 phụ kiện + âm thanh
0x2D05 phụ kiện + âm thanh + adb

ID sản phẩm được sử dụng trong AOAv1 ( 0x2D000x2D01 ) tiếp tục được hỗ trợ trong AOAv2.

Hỗ trợ âm thanh

AOAv2 bao gồm hỗ trợ đầu ra âm thanh từ thiết bị Android sang phụ kiện thông qua giao diện lớp âm thanh USB tiêu chuẩn có khả năng 2 kênh, âm thanh PCM 16-bit với tốc độ bit 44100 Khz (các chế độ âm thanh bổ sung có thể được thêm vào trong tương lai).

Để bật hỗ trợ âm thanh, phụ kiện phải gửi một yêu cầu điều khiển USB mới:

**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

Lệnh này phải được gửi trước khi gửi lệnh ACCESSORY_START để vào chế độ phụ kiện.

Hỗ trợ HID

AOAv2 cho phép các phụ kiện đăng ký một hoặc nhiều Thiết bị Giao diện Người USB (HID) với thiết bị Android. Cách tiếp cận này đảo ngược hướng giao tiếp cho các thiết bị USB HID điển hình như chuột và bàn phím USB. Thông thường, thiết bị HID là thiết bị ngoại vi được kết nối với máy chủ USB (tức là máy tính cá nhân), nhưng trong AOA, máy chủ USB có thể hoạt động như một hoặc nhiều thiết bị đầu vào với thiết bị ngoại vi USB.

Hỗ trợ HID là một proxy cho các sự kiện HID tiêu chuẩn; việc triển khai không đưa ra giả định nào về nội dung hoặc loại sự kiện và chỉ cần chuyển nó đến hệ thống đầu vào, cho phép phụ kiện AOAv2 hoạt động như bất kỳ thiết bị HID nào (chuột, bàn phím, bộ điều khiển trò chơi, v.v.). Bạn có thể sử dụng hỗ trợ HID để cung cấp chức năng cơ bản, chẳng hạn như nút phát / tạm dừng trên đế đa phương tiện hoặc cho chức năng nâng cao như đế cắm có chuột và bàn phím QWERTY đầy đủ.

AOAv2 thêm các yêu cầu điều khiển USB mới cho phép phụ kiện hoạt động như một hoặc nhiều thiết bị đầu vào HID cho thiết bị Android. Hỗ trợ HID được xử lý hoàn toàn thông qua các yêu cầu điều khiển trên điểm cuối không, vì vậy không cần giao diện USB mới. Bốn yêu cầu kiểm soát mới là:

  • ACCESSORY_REGISTER_HID đăng ký thiết bị HID mới với thiết bị Android. Phụ kiện cung cấp một ID được sử dụng để xác định thiết bị HID cho ba cuộc gọi còn lại. ID này có hiệu lực cho đến khi ngắt kết nối USB hoặc cho đến khi phụ kiện gửi ACCESSORY_UNREGISTER_HID để hủy đăng ký thiết bị HID.
  • ACCESSORY_UNREGISTER_HID hủy đăng ký thiết bị HID đã đăng ký trước đó với ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC gửi bộ mô tả báo cáo cho thiết bị HID tới thiết bị Android. Yêu cầu này được sử dụng để mô tả các khả năng của thiết bị HID và phải được gửi trước khi báo cáo bất kỳ sự kiện HID nào cho thiết bị Android. Nếu bộ mô tả báo cáo lớn hơn kích thước gói tối đa cho điểm cuối bằng không, nhiều lệnh ACCESSORY_SET_HID_REPORT_DESC sẽ được gửi để chuyển toàn bộ bộ mô tả.
  • ACCESSORY_SEND_HID_EVENT gửi các sự kiện đầu vào từ phụ kiện tới thiết bị Android.

Định nghĩa mã cho các yêu cầu kiểm soát mới là:

/* 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

Khả năng tương tác với AOAv1

Giao thức gốc ( AOAv1 ) hỗ trợ ứng dụng Android giao tiếp trực tiếp với máy chủ USB (phụ kiện) qua USB. AOAv2 tiếp tục hỗ trợ này và bổ sung thêm các tính năng mới để cho phép phụ kiện giao tiếp với chính hệ điều hành Android (cụ thể là hệ thống âm thanh và đầu vào). Thiết kế của AOAv2 giúp bạn có thể chế tạo một phụ kiện sử dụng hỗ trợ âm thanh và HID mới ngoài bộ tính năng ban đầu. Chỉ cần sử dụng các tính năng mới cùng với các tính năng ban đầu.

Kết nối AOAv2 mà không cần ứng dụng Android

Bạn có thể thiết kế một phụ kiện (chẳng hạn như đế âm thanh) sử dụng hỗ trợ âm thanh và HID nhưng không giao tiếp với ứng dụng trên thiết bị Android. Đối với những phụ kiện này, người dùng không cần nhận được lời nhắc hộp thoại để tìm và liên kết phụ kiện mới được đính kèm với một ứng dụng Android có thể giao tiếp với nó.

Để tắt các hộp thoại như vậy sau khi phụ kiện kết nối, phụ kiện có thể chọn không gửi tên nhà sản xuất và kiểu máy tới thiết bị Android. Khi các chuỗi này không được cung cấp cho thiết bị Android:

  • Hệ thống không cố gắng tìm ứng dụng để giao tiếp với phụ kiện.
  • Giao diện USB của phụ kiện không có trong cấu hình USB của thiết bị Android sau khi thiết bị vào chế độ phụ kiện.
,

Tài liệu này mô tả các thay đổi trong giao thức Android Open Accessory (AOA) kể từ lần phát hành đầu tiên và bổ sung tài liệu AOA 1.0 . AOAv2 bổ sung các tính năng sau:

  • Đầu ra âm thanh (không dùng nữa trong Android 8.0).
  • Hỗ trợ phụ kiện hoạt động như một hoặc nhiều thiết bị giao diện người (HID) với thiết bị Android.

Các API Android SDK có sẵn cho các nhà phát triển ứng dụng Android là không thay đổi.

Phát hiện hỗ trợ AOAv2

Để xác định xem thiết bị Android được kết nối có hỗ trợ phụ kiện và phiên bản giao thức được hỗ trợ hay không, phụ kiện phải gửi lệnh getProtocol() và kiểm tra kết quả. Các thiết bị Android chỉ hỗ trợ các feautures trong AOAv1 phải trả về 1 làm phiên bản giao thức; các thiết bị hỗ trợ các feautres bổ sung trong AOAv2 phải trả về 2 làm phiên bản giao thức. AOAv2 tương thích ngược với AOAv1, vì vậy các phụ kiện được thiết kế cho giao thức phụ kiện gốc tiếp tục hoạt động với các thiết bị Android mới hơn.

Ví dụ sau đây từ thư viện mã nguồn Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) minh họa kiểm tra giao thức này:

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 bao gồm các ID sản phẩm USB mới cho mỗi tổ hợp giao diện USB có sẵn trong chế độ phụ kiện:

Phiên bản ID sản phẩm Liên lạc Sự mô tả
AOAv1 0x2D00 phụ kiện Cung cấp hai điểm cuối hàng loạt để giao tiếp với ứng dụng Android.
0x2D01 phụ kiện + adb Với mục đích gỡ lỗi trong quá trình phát triển phụ kiện. Chỉ khả dụng nếu người dùng đã bật USB Debugging trong cài đặt thiết bị Android.
AOAv2 0x2D02 âm thanh Để truyền âm thanh từ thiết bị Android sang phụ kiện.
0x2D03 audio + adb
0x2D04 phụ kiện + âm thanh
0x2D05 phụ kiện + âm thanh + adb

ID sản phẩm được sử dụng trong AOAv1 ( 0x2D000x2D01 ) tiếp tục được hỗ trợ trong AOAv2.

Hỗ trợ âm thanh

AOAv2 bao gồm hỗ trợ đầu ra âm thanh từ thiết bị Android sang phụ kiện thông qua giao diện lớp âm thanh USB tiêu chuẩn có khả năng 2 kênh, âm thanh PCM 16-bit với tốc độ bit 44100 Khz (các chế độ âm thanh bổ sung có thể được thêm vào trong tương lai).

Để bật hỗ trợ âm thanh, phụ kiện phải gửi một yêu cầu điều khiển USB mới:

**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

Lệnh này phải được gửi trước khi gửi lệnh ACCESSORY_START để vào chế độ phụ kiện.

Hỗ trợ HID

AOAv2 cho phép các phụ kiện đăng ký một hoặc nhiều Thiết bị Giao diện Người USB (HID) với thiết bị Android. Cách tiếp cận này đảo ngược hướng giao tiếp cho các thiết bị USB HID điển hình như chuột và bàn phím USB. Thông thường, thiết bị HID là thiết bị ngoại vi được kết nối với máy chủ USB (tức là máy tính cá nhân), nhưng trong AOA, máy chủ USB có thể hoạt động như một hoặc nhiều thiết bị đầu vào với thiết bị ngoại vi USB.

Hỗ trợ HID là một proxy cho các sự kiện HID tiêu chuẩn; việc triển khai không đưa ra giả định nào về nội dung hoặc loại sự kiện và chỉ cần chuyển nó đến hệ thống đầu vào, cho phép phụ kiện AOAv2 hoạt động như bất kỳ thiết bị HID nào (chuột, bàn phím, bộ điều khiển trò chơi, v.v.). Bạn có thể sử dụng hỗ trợ HID để cung cấp chức năng cơ bản, chẳng hạn như nút phát / tạm dừng trên đế đa phương tiện hoặc cho chức năng nâng cao như đế cắm có chuột và bàn phím QWERTY đầy đủ.

AOAv2 thêm các yêu cầu điều khiển USB mới cho phép phụ kiện hoạt động như một hoặc nhiều thiết bị đầu vào HID cho thiết bị Android. Hỗ trợ HID được xử lý hoàn toàn thông qua các yêu cầu điều khiển trên điểm cuối không, vì vậy không cần giao diện USB mới. Bốn yêu cầu kiểm soát mới là:

  • ACCESSORY_REGISTER_HID đăng ký thiết bị HID mới với thiết bị Android. Phụ kiện cung cấp một ID được sử dụng để xác định thiết bị HID cho ba cuộc gọi còn lại. ID này có hiệu lực cho đến khi ngắt kết nối USB hoặc cho đến khi phụ kiện gửi ACCESSORY_UNREGISTER_HID để hủy đăng ký thiết bị HID.
  • ACCESSORY_UNREGISTER_HID hủy đăng ký thiết bị HID đã đăng ký trước đó với ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC gửi bộ mô tả báo cáo cho thiết bị HID tới thiết bị Android. Yêu cầu này được sử dụng để mô tả các khả năng của thiết bị HID và phải được gửi trước khi báo cáo bất kỳ sự kiện HID nào cho thiết bị Android. Nếu bộ mô tả báo cáo lớn hơn kích thước gói tối đa cho điểm cuối bằng không, nhiều lệnh ACCESSORY_SET_HID_REPORT_DESC sẽ được gửi để chuyển toàn bộ bộ mô tả.
  • ACCESSORY_SEND_HID_EVENT gửi các sự kiện đầu vào từ phụ kiện tới thiết bị Android.

Định nghĩa mã cho các yêu cầu kiểm soát mới là:

/* 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

Khả năng tương tác với AOAv1

Giao thức gốc ( AOAv1 ) hỗ trợ ứng dụng Android giao tiếp trực tiếp với máy chủ USB (phụ kiện) qua USB. AOAv2 tiếp tục hỗ trợ này và bổ sung thêm các tính năng mới để cho phép phụ kiện giao tiếp với chính hệ điều hành Android (cụ thể là hệ thống âm thanh và đầu vào). Thiết kế của AOAv2 giúp bạn có thể chế tạo một phụ kiện sử dụng hỗ trợ âm thanh và HID mới ngoài bộ tính năng ban đầu. Chỉ cần sử dụng các tính năng mới cùng với các tính năng ban đầu.

Kết nối AOAv2 mà không cần ứng dụng Android

Bạn có thể thiết kế một phụ kiện (chẳng hạn như đế âm thanh) sử dụng hỗ trợ âm thanh và HID nhưng không giao tiếp với ứng dụng trên thiết bị Android. Đối với những phụ kiện này, người dùng không cần nhận được lời nhắc hộp thoại để tìm và liên kết phụ kiện mới được đính kèm với một ứng dụng Android có thể giao tiếp với nó.

Để tắt các hộp thoại như vậy sau khi phụ kiện kết nối, phụ kiện có thể chọn không gửi tên nhà sản xuất và kiểu máy tới thiết bị Android. Khi các chuỗi này không được cung cấp cho thiết bị Android:

  • Hệ thống không cố gắng tìm ứng dụng để giao tiếp với phụ kiện.
  • Giao diện USB của phụ kiện không có trong cấu hình USB của thiết bị Android sau khi thiết bị vào chế độ phụ kiện.