Android Open Accessory 1.0

Los accesorios USB de Android deben cumplir con el protocolo Android Open Accessory (AOA), que define cómo un accesorio detecta y configura la comunicación con un dispositivo con Android. Los accesorios deben seguir los siguientes pasos:

  1. Espera y detecta un dispositivo conectado.
  2. Determina la compatibilidad del dispositivo con el modo de accesorio.
  3. Intenta iniciar el dispositivo en modo de accesorio (si es necesario).
  4. Si el dispositivo admite AOA, establece la comunicación con él.

En las siguientes secciones, se explica cómo implementar estos pasos.

Espera y detecta dispositivos conectados

Los accesorios deben verificar de forma continua si hay dispositivos con Android conectados. Cuando se conecta un dispositivo, el accesorio debe determinar si este admite el modo de accesorio.

Cómo determinar la compatibilidad con el modo de accesorio

Nota: No se requiere la depuración por USB para conectar accesorios, pero es posible que ADB sea necesario durante el desarrollo. Para obtener más información, consulta Consideraciones de depuración.

Cuando se conecta un dispositivo con Android, puede estar en uno de los siguientes tres estados:

  • Admite el modo de accesorio de Android y ya está en ese modo.
  • Admite el modo de accesorio de Android, pero no está en modo de accesorio.
  • No es compatible con el modo de accesorio de Android.

Durante la conexión inicial, el accesorio debe verificar la versión, el ID del proveedor y el ID del producto del descriptor de dispositivo USB del dispositivo conectado. El ID del proveedor debe coincidir con el ID de Google (0x18D1). Si el dispositivo ya está en modo de accesorio, el ID del producto debe ser 0x2D00 o 0x2D01, y el accesorio puede establecer comunicación con el dispositivo a través de extremos de transferencia masiva con su propio protocolo de comunicación (no es necesario que el dispositivo se inicie en modo de accesorio).

Nota: 0x2D00 está reservado para dispositivos con Android que admiten el modo de accesorio. 0x2D01 se reserva para dispositivos que admiten el modo de accesorio, así como el protocolo Android Debug Bridge (ADB), que expone una segunda interfaz con dos extremos masivos para ADB. Puedes usar estos extremos para depurar la aplicación del accesorio si estás simulando el accesorio en una computadora. En general, no uses esta interfaz, a menos que el accesorio implemente un pase a ADB en el dispositivo.

Si la versión, el ID de proveedor o el ID de producto en el descriptor de dispositivo USB no coinciden con los valores esperados, el accesorio no puede determinar si el dispositivo admite el modo de accesorio para Android. El accesorio debe intentar iniciar el dispositivo en modo de accesorio (se detalla a continuación) para determinar la compatibilidad del dispositivo.

Punto clave: Un accesorio USB debe enviar un encabezado al establecer la conexión inicial. El encabezado contiene el fabricante, el modelo y la versión. Aunque la versión es un campo opcional, si se instala una app para Android que solo coincide en la versión, pero el accesorio no envía una versión, los dispositivos Android que ejecutan Android 10 y versiones anteriores se reiniciarán debido a que se genera una excepción en el proceso del sistema.

Intenta iniciar en el modo de accesorio

Si los IDs de versión, proveedor y producto no corresponden a un dispositivo con Android en modo de accesorio, el accesorio no puede determinar si el dispositivo admite el modo de accesorio (pero no está en él) o si no lo admite. Esto puede ocurrir porque los dispositivos que admiten el modo de accesorio (pero no están en ese modo) informan inicialmente los IDs de producto y proveedor del fabricante del dispositivo en lugar de los IDs de producto y proveedor de la AOA.

El accesorio debe intentar iniciar el dispositivo en modo de accesorio para determinar si es compatible con ese modo:

  1. Envía una solicitud de control 51 ("Get Protocol") para determinar si el dispositivo admite el protocolo de accesorios de Android. Si el dispositivo admite el protocolo, muestra un número distinto de cero que representa la versión del protocolo compatible. La solicitud de control se encuentra en el extremo 0 con las siguientes características:
    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. Si el dispositivo muestra una versión de protocolo compatible, envíale una solicitud de control con información de cadena de identificación. Esta información permite que el dispositivo determine una aplicación adecuada para el accesorio (o presente una URL al usuario si no existe una aplicación adecuada). La solicitud de control se encuentra en el extremo 0 (para cada ID de cadena) con las siguientes características:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    Se admiten los siguientes IDs de cadena, con un tamaño máximo de 256 bytes para cada cadena (debe terminar en cero con \0).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Envía una solicitud de control para pedirle al dispositivo que se inicie en modo de accesorio. La solicitud de control se encuentra en el extremo 0 con las siguientes características:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

Después de completar estos pasos, el accesorio debe esperar a que el dispositivo USB conectado se vuelva a presentar en el bus en modo de accesorio y, luego, volver a enumerar los dispositivos conectados. El algoritmo determina la compatibilidad con el modo de accesorio verificando los IDs de proveedor y producto, que deben ser correctos (por ejemplo, deben corresponder a los IDs de proveedor y producto de Google en lugar de a los IDs del fabricante del dispositivo) si el dispositivo cambió correctamente al modo de accesorio. Si los IDs y la versión son correctos, el accesorio pasa a establecer comunicación con el dispositivo.

Nota: Actualmente, AOA no admite conexiones simultáneas de AOA y MTP. Para cambiar de AOA a MTP, el accesorio primero debe desconectar el dispositivo USB (ya sea físicamente o de una manera eléctricamente equivalente) y, luego, volver a conectarlo con MTP.

Si falla algún paso, el accesorio determina que el dispositivo no es compatible con el modo de accesorio para Android y espera a que se conecte el siguiente dispositivo.

Establece la comunicación con el dispositivo

Si el accesorio detecta un dispositivo con Android en modo de accesorio, puede consultar la interfaz del dispositivo y los descriptores de extremos para obtener los extremos masivos que se usarán para comunicarse con el dispositivo.

La cantidad de interfaces y extremos masivos depende del ID del producto. Un dispositivo con Android que tenga uno de los siguientes IDs de producto:

  • 0x2D00 tiene una interfaz con dos extremos masivos para la comunicación de entrada y salida.
  • 0x2D01 tiene dos interfaces con dos extremos masivos cada una para la comunicación de entrada y salida. La primera interfaz controla la comunicación estándar y la segunda controla la comunicación de ADB. Para usar una interfaz, busca los primeros extremos de entrada y salida masivos, establece la configuración del dispositivo en un valor de 1 con una solicitud de dispositivo SET_CONFIGURATION (0x09) y, luego, comunícate con los extremos.