Открытый протокол аксессуаров Android 1.0

USB-аксессуары Android должны соответствовать протоколу Android Open Accessory (AOA), который определяет, как аксессуар обнаруживает и устанавливает связь с устройством на базе Android. Аксессуары должны выполнять следующие действия:

  1. Дождитесь и обнаружите подключенное устройство.
  2. Определите поддержку вспомогательного режима устройства.
  3. Попытайтесь запустить устройство в вспомогательном режиме (при необходимости).
  4. Если устройство поддерживает AOA, установите связь с устройством.

В следующих разделах объясняется, как реализовать эти шаги.

Дождитесь и обнаружьте подключенные устройства

Аксессуары должны постоянно проверять наличие подключенных устройств на базе Android. Когда устройство подключено, аксессуар должен определить, поддерживает ли устройство режим аксессуара.

Определить поддержку вспомогательного режима

Когда устройство на базе 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 и идентификаторы продукта.

Аксессуар должен попытаться запустить устройство в режиме аксессуара, чтобы определить, поддерживает ли устройство этот режим:

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