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) - Если устройство возвращает поддерживаемую версию протокола, отправьте на него запрос управления (0x0A) со строкой идентификации. Эта информация позволяет устройству определить подходящее приложение для аксессуара (или показать пользователю 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), а затем установите связь с помощью конечных точек.