En este documento, se describen los cambios en el protocolo de Android Open Accessory (AOA) desde su lanzamiento inicial y complementa Documentación de AOA 1.0. AOAv2 agrega las siguientes funciones:
- Salida de audio (obsoleta en Android 8.0)
- Compatibilidad con el accesorio que actúa como uno o más dispositivos de interfaz humana (HID) al dispositivo Android.
No se modificaron las APIs del SDK de Android disponibles para desarrolladores de apps para Android.
Compatibilidad de detección de AOAv2
Para determinar si un dispositivo Android conectado admite accesorios y el
versión de protocolo compatible, un accesorio debe enviar un getProtocol()
y verifica el resultado. Dispositivos Android que solo admiten las funciones
en AOAv1 debe mostrar 1
como la versión del protocolo. dispositivos que
admitir funciones adicionales en AOAv2 debe mostrar 2
como el
versión del protocolo. AOAv2 es retrocompatible con AOAv1, así que los accesorios
diseñados para el protocolo de accesorios original siguen funcionando con los dispositivos
dispositivos.
El siguiente ejemplo del kit de desarrollo de accesorios 2011
código fuente
(<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
).
biblioteca demuestra esta verificación de protocolo:
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 incluye nuevos IDs de producto USB para cada combinación de interfaces USB disponibles en el modo de accesorio:
Versión | ID del producto | Comunicación | Descripción |
---|---|---|---|
AOAv1 | 0x2D00 |
accesorio | Proporciona dos extremos masivos para comunicarse con una app para Android. |
0x2D01 |
accesorio + adb | Para depurar durante el desarrollo de accesorios Solo está disponible si se Si el usuario habilitó la Depuración por USB en la configuración del dispositivo Android | |
AOAv2 | 0x2D02 |
Audio | Para transmitir audio de un dispositivo Android a un accesorio. |
0x2D03 |
audio + adb | ||
0x2D04 |
accesorio + audio | ||
0x2D05 |
accesorio + audio + adb |
ID de productos usados en AOAv1 (0x2D00
y 0x2D01
)
seguirán siendo compatibles con AOAv2.
Compatibilidad con audio
AOAv2 admite salida de audio desde un dispositivo Android hacia una mediante una interfaz de clase de audio USB estándar con capacidad de 2 canales, 16 bits Audio PCM con una tasa de bits de 44,100 kHz (se pueden agregar modos de audio adicionales en el futuro).
Para habilitar la compatibilidad con audio, el accesorio debe enviar una nueva solicitud de control por 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
Este comando se debe enviar antes de enviar el
Comando ACCESSORY_START
para ingresar al modo de accesorio.
Compatibilidad con HID
AOAv2 permite que los accesorios registren una o más interfaces humanas USB Dispositivos (HID) con un dispositivo Android. Este enfoque invierte la dirección de para dispositivos USB HID típicos, como mouse y teclados USB. Por lo general, el dispositivo HID es un periférico conectado a un host USB (es decir, un computadora personal), pero, en AOA, el host USB puede actuar como una o más entradas a un periférico USB.
La compatibilidad con HID es un proxy para eventos HID estándar. el implementación no hace suposiciones sobre el contenido o el tipo de eventos y lo pasa al sistema de entrada, lo que permite que un accesorio AOAv2 actuar como cualquier dispositivo HID (mouse, teclado, control de juegos, etc.) Puedes usar HID compatibilidad para proporcionar funcionalidad básica, como un botón de reproducción/pausa en un contenido multimedia, o para funcionalidades avanzadas, como una base de conexión con mouse y teclado QWERTY completo.
AOAv2 agrega nuevas solicitudes de control USB que permiten que el accesorio actúe como uno o más dispositivos de entrada HID al dispositivo Android. Se maneja la compatibilidad con HID completamente a través de solicitudes de control en el endpoint cero, por lo que no se necesita una nueva interfaz según tus necesidades. Las cuatro solicitudes de control nuevas son las siguientes:
- ACCESSORY_REGISTER_HID registra un dispositivo HID nuevo con el
dispositivo Android. El accesorio proporciona un ID que se utiliza para identificar el dispositivo HID para
para las otras tres llamadas. Este ID es válido hasta que se desconecte el USB o hasta que el
el accesorio envía
ACCESSORY_UNREGISTER_HID
para cancelar el registro del HID dispositivo. - ACCESSORY_UNREGISTER_HID cancela el registro de un dispositivo HID
registrada previamente con
ACCESSORY_REGISTER_HID
. - ACCESSORY_SET_HID_REPORT_DESC envía un descriptor de informe para
un dispositivo HID al dispositivo Android. Esta solicitud se usa para describir la
capacidades del dispositivo HID y deben enviarse antes de informar cualquier evento HID
al dispositivo Android. Si el descriptor de informe es mayor que el máximo
tamaño del paquete para el extremo cero, varios
se envían comandos
ACCESSORY_SET_HID_REPORT_DESC
para transferir el descriptor completo. - ACCESSORY_SEND_HID_EVENT envía eventos de entrada desde el accesorio al dispositivo Android.
Las definiciones de código para las nuevas solicitudes de control son las siguientes:
/* 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
Interoperabilidad con AOAv1
El protocolo original (AOAv1) admite que una app para Android se comunique directamente con un dispositivo USB host (accesorio) a través de USB. AOAv2 continúa brindando asistencia y agrega funciones nuevas para permitir que el accesorio se comunique con el propio sistema operativo Android (específicamente, los sistemas de audio y entrada). El diseño de AOAv2 hace que sea Se puede crear un accesorio que use la nueva compatibilidad con audio y HID además del conjunto de atributos original. Simplemente usa las nuevas funciones junto con los atributos originales.
Conecta AOAv2 sin un App para Android
Puedes diseñar un accesorio (como una base de audio) que utilice audio y HID. pero no se comunica con una app en el dispositivo Android. Para estos accesorios, los usuarios no necesitan recibir mensajes de diálogo para encontrar y asociar el accesorio recientemente conectado a una app para Android que pueda comunicarte con ella.
Para suprimir este tipo de diálogos después de que se conecta un accesorio, el el accesorio puede optar por no enviar los nombres del fabricante y del modelo al dispositivo Android dispositivo. Cuando no se proporcionan estas cadenas al dispositivo Android:
- El sistema no intenta encontrar una app para comunicarse con el accesorio.
- La interfaz USB del accesorio no está presente en el USB del dispositivo Android después de que el dispositivo entre en modo de accesorio.