В этом документе описаны изменения в протоколе Android Open Accessory (AOA) с момента его первоначального выпуска и дополняет документацию AOA 1.0 . AOAv2 добавляет следующие функции:
- Аудиовыход (устарел в Android 8.0).
- Поддержка аксессуара, действующего как одно или несколько устройств пользовательского интерфейса (HID) для устройства Android.
API-интерфейсы Android SDK, доступные разработчикам приложений Android, не изменились.
Обнаружение поддержки AOAv2
Чтобы определить, поддерживает ли подключенное устройство Android аксессуары и поддерживаемую версию протокола, аксессуар должен отправить команду getProtocol()
и проверить результат. Устройства Android, поддерживающие только функции AOAv1, должны возвращать 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-интерфейсов, доступных в режиме аксессуаров:
Версия | Идентификатор продукта | Коммуникация | Описание |
---|---|---|---|
АОАв1 | 0x2D00 | аксессуар | Предоставляет две массовые конечные точки для связи с приложением Android. |
0x2D01 | аксессуар + adb | В целях отладки при разработке аксессуаров. Доступно только в том случае, если пользователь включил отладку по USB в настройках устройства Android. | |
АОАв2 | 0x2D02 | аудио | Для потоковой передачи звука с устройства Android на аксессуар. |
0x2D03 | аудио + adb | ||
0x2D04 | аксессуар + аудио | ||
0x2D05 | аксессуар + аудио + adb |
Идентификаторы продуктов, используемые в AOAv1 ( 0x2D00
и 0x2D01
), продолжают поддерживаться в AOAv2.
Аудио поддержка
AOAv2 включает поддержку вывода звука с устройства Android на аксессуар через стандартный интерфейс аудиокласса USB, поддерживающий 2-канальный 16-битный звук PCM с битрейтом 44100 кГц (в будущем могут быть добавлены дополнительные аудиорежимы).
Чтобы включить поддержку звука, аксессуар должен отправить новый запрос управления 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 позволяет аксессуарам регистрировать одно или несколько USB-устройств с интерфейсом пользователя (HID) на устройстве Android. Этот подход меняет направление связи для типичных USB HID-устройств, таких как USB-мыши и клавиатуры. Обычно HID-устройство представляет собой периферийное устройство, подключенное к USB-хосту (т. е. к персональному компьютеру), но в AOA USB-хост может выступать в качестве одного или нескольких устройств ввода для периферийного USB-устройства.
Поддержка HID — это прокси для стандартных событий HID; реализация не делает никаких предположений о содержании или типе событий и просто передает их в систему ввода, позволяя аксессуару AOAv2 действовать как любое HID-устройство (мышь, клавиатура, игровой контроллер и т. д.). Вы можете использовать поддержку HID для предоставления базовых функций, таких как кнопка воспроизведения/паузы на мультимедийной док-станции, или для расширенных функций, таких как док-станция с мышью и полной QWERTY-клавиатурой.
AOAv2 добавляет новые запросы управления USB, которые позволяют аксессуару действовать как одно или несколько устройств ввода HID на устройстве Android. Поддержка HID полностью осуществляется посредством запросов управления на нулевой конечной точке, поэтому новый интерфейс USB не требуется. Четыре новых запроса на управление:
- ACCESSORY_REGISTER_HID регистрирует новое устройство HID на устройстве Android. Аксессуар предоставляет идентификатор, используемый для идентификации устройства HID для трех других вызовов. Этот идентификатор действителен до тех пор, пока USB не отключится или пока аксессуар не отправит
ACCESSORY_UNREGISTER_HID
для отмены регистрации устройства HID. - ACCESSORY_UNREGISTER_HID отменяет регистрацию устройства HID, ранее зарегистрированного с помощью
ACCESSORY_REGISTER_HID
. - ACCESSORY_SET_HID_REPORT_DESC отправляет дескриптор отчета для устройства HID на устройство Android. Этот запрос используется для описания возможностей устройства HID и должен быть отправлен перед отправкой отчета о любых событиях HID на устройство Android. Если дескриптор отчета превышает максимальный размер пакета для нулевой конечной точки, отправляется несколько команд
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 в дополнение к исходному набору функций. Просто используйте новые функции вместе с оригинальными функциями.
Подключите AOAv2 без приложения для Android
Вы можете создать аксессуар (например, аудиодок), который использует поддержку звука и HID, но не взаимодействует с приложением на устройстве Android. Для этих аксессуаров пользователям не нужно получать диалоговые подсказки для поиска и связывания вновь подключенного аксессуара с приложением Android, которое может с ним взаимодействовать.
Чтобы подавить такие диалоговые окна после подключения аксессуара, аксессуар может не отправлять название производителя и модели на устройство Android. Если эти строки не предоставляются устройству Android:
- Система не пытается найти приложение для связи с аксессуаром.
- USB-интерфейс аксессуара отсутствует в конфигурации USB устройства Android после того, как устройство перешло в режим аксессуара.