Este documento describe los cambios en el protocolo Android Open Accesorio (AOA) desde su lanzamiento inicial y complementa la documentación de AOA 1.0 . AOAv2 agrega las siguientes características:
- Salida de audio (obsoleta en Android 8.0).
- Soporte para el accesorio que actúa como uno o más dispositivos de interfaz humana (HID) para el dispositivo Android.
Las API del SDK de Android disponibles para los desarrolladores de aplicaciones de Android no se modifican.
Detectar compatibilidad con AOAv2
Para determinar si un dispositivo Android conectado admite accesorios y la versión del protocolo compatible, un accesorio debe enviar un comando getProtocol()
y verificar el resultado. Los dispositivos Android que solo admiten las funciones de AOAv1 deben devolver 1
como versión del protocolo; Los dispositivos que admiten funciones adicionales en AOAv2 deben devolver 2
como versión del protocolo. AOAv2 es compatible con versiones anteriores de AOAv1, por lo que los accesorios diseñados para el protocolo de accesorios original continúan funcionando con dispositivos Android más nuevos.
El siguiente ejemplo del código fuente del Kit de desarrollo de accesorios 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) 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 nuevas ID de productos USB para cada combinación de interfaces USB disponibles en el modo accesorio:
Versión | ID del Producto | Comunicación | Descripción |
---|---|---|---|
AOAv1 | 0x2D00 | accesorio | Proporciona dos puntos finales masivos para comunicarse con una aplicación de Android. |
0x2D01 | accesorio + adb | Para fines de depuración durante el desarrollo de accesorios. Disponible solo si el usuario ha habilitado la depuración USB en la configuración del dispositivo Android. | |
AOAv2 | 0x2D02 | audio | Para transmitir audio desde un dispositivo Android a un accesorio. |
0x2D03 | audio + adb | ||
0x2D04 | accesorio + audio | ||
0x2D05 | accesorio + audio + adb |
Los ID de producto utilizados en AOAv1 ( 0x2D00
y 0x2D01
) siguen siendo compatibles con AOAv2.
Soporte de audio
AOAv2 incluye soporte para salida de audio desde un dispositivo Android a un accesorio a través de una interfaz de clase de audio USB estándar con capacidad de audio PCM de 16 bits y 2 canales con una velocidad de bits de 44100 Khz (es posible que se agreguen modos de audio adicionales en el futuro).
Para habilitar la compatibilidad con audio, el accesorio debe enviar una nueva solicitud de control 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 debe enviarse antes de enviar el comando ACCESSORY_START
para ingresar al modo accesorio.
soporte oculto
AOAv2 permite que los accesorios registren uno o más dispositivos de interfaz humana (HID) USB con un dispositivo Android. Este enfoque invierte la dirección de la comunicación para los dispositivos USB HID típicos, como ratones y teclados USB. Normalmente, el dispositivo HID es un periférico conectado a un host USB (es decir, una computadora personal), pero en AOA el host USB puede actuar como uno o más dispositivos de entrada a un periférico USB.
El soporte HID es un proxy para eventos HID estándar; la implementación no hace suposiciones sobre el contenido o el tipo de eventos y simplemente los pasa al sistema de entrada, lo que permite que un accesorio AOAv2 actúe como cualquier dispositivo HID (ratón, teclado, controlador de juego, etc.). Puede utilizar la compatibilidad con HID para proporcionar funciones básicas, como un botón de reproducción/pausa en una base multimedia, o para funciones avanzadas, como una estación de acoplamiento 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. La compatibilidad con HID se gestiona completamente a través de solicitudes de control en el punto final cero, por lo que no se necesita una nueva interfaz USB. Las cuatro nuevas solicitudes de control son:
- ACCESSORY_REGISTER_HID registra un nuevo dispositivo HID con el dispositivo Android. El accesorio proporciona una identificación que se utiliza para identificar el dispositivo HID para las otras tres llamadas. Esta identificación es válida hasta que el USB se desconecte o hasta que el accesorio envíe
ACCESSORY_UNREGISTER_HID
para cancelar el registro del dispositivo HID. - ACCESSORY_UNREGISTER_HID cancela el registro de un dispositivo HID previamente registrado 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 utiliza para describir las capacidades del dispositivo HID y debe enviarse antes de informar cualquier evento HID al dispositivo Android. Si el descriptor del informe es mayor que el tamaño máximo de paquete para el punto final cero, se envían varios 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:
/* 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 ) brinda soporte para que una aplicación de Android se comunique directamente con un host USB (accesorio) a través de USB. AOAv2 continúa con este soporte y agrega nuevas funciones para permitir que el accesorio se comunique con el propio sistema operativo Android (específicamente los sistemas de entrada y audio). El diseño de AOAv2 permite crear un accesorio que utiliza el nuevo audio y compatibilidad con HID además del conjunto de funciones originales. Simplemente utilice las nuevas funciones junto con las funciones originales.
Conecte AOAv2 sin una aplicación de Android
Puede diseñar un accesorio (como una base de audio) que utilice audio y compatibilidad con HID pero que no se comunique con una aplicación en el dispositivo Android. Para estos accesorios, los usuarios no necesitan recibir mensajes de diálogo para buscar y asociar el accesorio recién conectado con una aplicación de Android que pueda comunicarse con él.
Para suprimir dichos cuadros de diálogo después de que se conecta un accesorio, el accesorio puede optar por no enviar los nombres del fabricante y del modelo al dispositivo Android. Cuando estas cadenas no se proporcionan al dispositivo Android:
- El sistema no intenta encontrar una aplicación para comunicarse con el accesorio.
- La interfaz USB accesoria no está presente en la configuración USB del dispositivo Android después de que el dispositivo ingresa al modo accesorio.