USB-аксессуары Android должны соответствовать протоколу Android Open Accessory (AOA), который определяет, как аксессуар обнаруживает и устанавливает связь с устройством под управлением Android. Аксессуары должны выполнять следующие действия:
- Подождите и обнаружите подключенное устройство.
- Определите поддержку режима аксессуаров устройства.
- Попытайтесь запустить устройство в режиме аксессуара (при необходимости).
- Если устройство поддерживает AOA, установите связь с устройством.
В следующих разделах объясняется, как реализовать эти шаги.
Ожидание и обнаружение подключенных устройств
Аксессуары должны постоянно проверять наличие подключенных устройств под управлением Android. Когда устройство подключено, аксессуар должен определить, поддерживает ли устройство режим аксессуара.
Определить поддержку режима аксессуаров
Примечание. Отладка по USB не требуется для подключения аксессуаров, но ADB может потребоваться во время разработки. Подробности см. в разделе Рекомендации по отладке .
Когда устройство под управлением Android подключается, оно может находиться в одном из трех состояний:
- Поддерживает режим аксессуаров Android и уже находится в режиме аксессуаров.
- Поддерживает режим аксессуаров Android, но не в режиме аксессуаров.
- Не поддерживает режим аксессуаров Android.
Во время первоначального подключения аксессуар должен проверить версию, идентификатор поставщика и идентификатор продукта дескриптора USB-устройства подключенного устройства. Идентификатор поставщика должен совпадать с идентификатором Google ( 0x18D1
). Если устройство уже находится в режиме аксессуара, идентификатор продукта должен быть 0x2D00
или 0x2D01
, и аксессуар может устанавливать связь с устройством через конечные точки массовой передачи, используя собственный протокол связи (устройство не требуется запускать в режиме аксессуара).
Примечание. 0x2D00
зарезервирован для устройств под управлением Android, поддерживающих режим аксессуаров. 0x2D01
зарезервирован для устройств, поддерживающих режим аксессуаров, а также протокол Android Debug Bridge (ADB), который предоставляет второй интерфейс с двумя массовыми конечными точками для ADB. Вы можете использовать эти конечные точки для отладки приложения аксессуара, если вы моделируете аксессуар на компьютере. В общем, не используйте этот интерфейс, если аксессуар не реализует сквозной доступ к ADB на устройстве.
Если версия, идентификатор поставщика или идентификатор продукта в дескрипторе USB-устройства не соответствуют ожидаемым значениям, аксессуар не сможет определить, поддерживает ли устройство режим аксессуара Android. Аксессуар должен попытаться запустить устройство в режиме аксессуара (подробно описано ниже), чтобы определить поддержку устройства.
Ключевой момент: USB-аксессуар должен отправлять заголовок при первом установлении связи. В шапке указан производитель, модель и версия. Хотя версия является необязательным полем, если установлено приложение Android, которое соответствует только версии, но аксессуар не отправляет версию, устройства Android, работающие под управлением Android 10 и ниже, перезагрузятся из-за исключения, возникающего в системном процессе.
Попытка запуска в режиме аксессуара
Если версия, поставщик и идентификаторы продукта не соответствуют устройству под управлением Android в режиме аксессуара, аксессуар не сможет определить, поддерживает ли устройство режим аксессуара (но не находится в нем) или устройство не поддерживает режим аксессуара. Это может произойти потому, что устройства, которые поддерживают режим аксессуаров (но не находятся в режиме аксессуаров), изначально сообщают производителя устройства , поставщика и идентификаторы продуктов, а не поставщика AOA и идентификаторы продуктов.
Аксессуар должен попытаться запустить устройство в режиме аксессуара, чтобы определить, поддерживает ли устройство этот режим:
- Отправьте запрос управления 51 («Получить протокол»), чтобы определить, поддерживает ли устройство протокол аксессуара 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)
- Если устройство возвращает поддерживаемую версию протокола, отправьте на устройство запрос управления с идентифицирующей строковой информацией. Эта информация позволяет устройству определить подходящее приложение для аксессуара (или предоставить пользователю URL-адрес, если подходящее приложение не существует). Запрос управления находится в конечной точке 0 (для каждого идентификатора строки) со следующими характеристиками:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
Поддерживаются следующие идентификаторы строк с максимальным размером 256 байт для каждой строки (должны заканчиваться нулем с помощью
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Отправьте запрос управления, чтобы попросить устройство запуститься в режиме аксессуара. Запрос управления находится на конечной точке 0 со следующими характеристиками:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
После выполнения этих действий аксессуар должен дождаться, пока подключенное USB-устройство снова появится на шине в режиме аксессуара, а затем повторно выполнить нумерацию подключенных устройств. Алгоритм определяет поддержку режима аксессуаров, проверяя идентификаторы поставщика и продукта, которые должны быть правильными (например, соответствовать идентификаторам поставщика и продукта Google, а не идентификаторам производителя устройства), если устройство успешно перешло в режим аксессуаров. Если идентификаторы и версия верны, аксессуар переходит к установлению связи с устройством .
Примечание. AOA в настоящее время не поддерживает одновременные соединения AOA и MTP. Чтобы переключиться с AOA на MTP, аксессуар должен сначала отключить USB-устройство (физически или электрически эквивалентным способом), а затем повторно подключиться с помощью MTP.
Если какой-либо шаг завершается неудачно, аксессуар определяет, что устройство не поддерживает режим аксессуара Android, и ожидает подключения следующего устройства.
Установить связь с устройством
Если аксессуар обнаруживает устройство под управлением Android в режиме аксессуара, аксессуар может запросить интерфейс устройства и дескрипторы конечных точек, чтобы получить групповые конечные точки для связи с устройством.
Количество интерфейсов и групповых конечных точек зависит от идентификатора продукта. Устройство на платформе Android с идентификатором продукта:
-
0x2D00
имеет один интерфейс с двумя конечными точками для ввода и вывода. -
0x2D01
имеет два интерфейса с двумя конечными точками для ввода и вывода данных. Первый интерфейс обрабатывает стандартную связь, а второй интерфейс обрабатывает связь ADB. Чтобы использовать интерфейс, найдите первые конечные точки массового ввода и вывода, установите для конфигурации устройства значение 1 с помощью запроса устройстваSET_CONFIGURATION
(0x09
), а затем установите связь, используя конечные точки.