Этот документ описывает изменения в протоколе 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 | аудио + адб | ||
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
для входа в вспомогательный режим.
Скрытая поддержка
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 после перехода устройства в режим аксессуара.
Этот документ описывает изменения в протоколе 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 | аудио + адб | ||
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
для входа в вспомогательный режим.
Скрытая поддержка
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 после перехода устройства в режим аксессуара.