Questo documento descrive le modifiche al protocollo AOA (Android Open Accessory) dalla sua versione iniziale e integra la documentazione AOA 1.0 . AOAv2 aggiunge le seguenti funzionalità:
- Uscita audio (obsoleta in Android 8.0).
- Supporto per l'accessorio che funge da uno o più dispositivi di interfaccia umana (HID) al dispositivo Android.
Le API dell'SDK Android disponibili per gli sviluppatori di applicazioni Android non sono cambiate.
Rilevamento del supporto AOAv2
Per determinare se un dispositivo Android connesso supporta gli accessori e la versione del protocollo supportata, un accessorio deve inviare un comando getProtocol()
e verificare il risultato. I dispositivi Android che supportano solo le funzionalità in AOAv1 devono restituire 1
come versione del protocollo; i dispositivi che supportano le funzionalità aggiuntive in AOAv2 devono restituire 2
come versione del protocollo. AOAv2 è retrocompatibile con AOAv1, quindi gli accessori progettati per il protocollo accessorio originale continuano a funzionare con i dispositivi Android più recenti.
L'esempio seguente dalla libreria del codice sorgente Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) mostra questo controllo del protocollo:
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 include nuovi ID prodotto USB per ciascuna combinazione di interfacce USB disponibili in modalità accessori:
Versione | numero identificativo del prodotto | Comunicazione | Descrizione |
---|---|---|---|
AOAv1 | 0x2D00 | accessorio | Fornisce due endpoint in blocco per la comunicazione con un'applicazione Android. |
0x2D01 | accessorio + adb | A scopo di debug durante lo sviluppo degli accessori. Disponibile solo se l'utente ha abilitato il debug USB nelle impostazioni del dispositivo Android. | |
AOAv2 | 0x2D02 | Audio | Per lo streaming audio da un dispositivo Android a un accessorio. |
0x2D03 | audio + adb | ||
0x2D04 | accessorio + audio | ||
0x2D05 | accessorio + audio + adb |
Gli ID prodotto utilizzati in AOAv1 ( 0x2D00
e 0x2D01
) continuano a essere supportati in AOAv2.
Supporto audio
AOAv2 include il supporto per l'uscita audio da un dispositivo Android a un accessorio tramite un'interfaccia di classe audio USB standard in grado di riprodurre audio PCM a 2 canali e 16 bit con un bit rate di 44100 Khz (in futuro potrebbero essere aggiunte modalità audio aggiuntive).
Per abilitare il supporto audio, l'accessorio deve inviare una nuova richiesta di controllo 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
Questo comando deve essere inviato prima di inviare il comando ACCESSORY_START
per entrare in modalità accessorio.
Supporto NASCOSTO
AOAv2 consente agli accessori di registrare uno o più dispositivi di interfaccia umana USB (HID) con un dispositivo Android. Questo approccio inverte la direzione della comunicazione per i tipici dispositivi USB HID come mouse e tastiere USB. Normalmente, il dispositivo HID è una periferica collegata a un host USB (cioè un personal computer), ma in AOA l'host USB può fungere da uno o più dispositivi di input a una periferica USB.
Il supporto HID è un proxy per gli eventi HID standard; l'implementazione non fa ipotesi sul contenuto o sul tipo di eventi e lo passa semplicemente attraverso il sistema di input, consentendo a un accessorio AOAv2 di agire come qualsiasi dispositivo HID (mouse, tastiera, controller di gioco, ecc.). È possibile utilizzare il supporto HID per fornire funzionalità di base, come un pulsante di riproduzione/pausa su un dock multimediale, o per funzionalità avanzate come una docking station con mouse e tastiera QWERTY completa.
AOAv2 aggiunge nuove richieste di controllo USB che consentono all'accessorio di agire come uno o più dispositivi di input HID sul dispositivo Android. Il supporto HID viene gestito interamente tramite richieste di controllo sull'endpoint zero, quindi non è necessaria una nuova interfaccia USB. Le quattro nuove richieste di controllo sono:
- ACCESSORY_REGISTER_HID registra un nuovo dispositivo HID con il dispositivo Android. L'accessorio fornisce un ID utilizzato per identificare il dispositivo HID per le altre tre chiamate. Questo ID è valido fino alla disconnessione dell'USB o fino a quando l'accessorio non invia
ACCESSORY_UNREGISTER_HID
per annullare la registrazione del dispositivo HID. - ACCESSORY_UNREGISTER_HID annulla la registrazione di un dispositivo HID precedentemente registrato con
ACCESSORY_REGISTER_HID
. - ACCESSORY_SET_HID_REPORT_DESC invia un descrittore di rapporto per un dispositivo HID al dispositivo Android. Questa richiesta viene utilizzata per descrivere le capacità del dispositivo HID e deve essere inviata prima di segnalare qualsiasi evento HID al dispositivo Android. Se il descrittore di report è maggiore della dimensione massima del pacchetto per l'endpoint zero, vengono inviati più comandi
ACCESSORY_SET_HID_REPORT_DESC
per trasferire l'intero descrittore. - ACCESSORY_SEND_HID_EVENT invia eventi di input dall'accessorio al dispositivo Android.
Le definizioni del codice per le nuove richieste di controllo sono:
/* 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
Interoperabilità con AOAv1
Il protocollo originale ( AOAv1 ) fornisce il supporto per un'applicazione Android per comunicare direttamente con un host USB (accessorio) tramite USB. AOAv2 continua questo supporto e aggiunge nuove funzionalità per consentire all'accessorio di comunicare con il sistema operativo Android stesso (nello specifico i sistemi audio e di input). Il design di AOAv2 consente di costruire un accessorio che utilizza il nuovo supporto audio e HID oltre al set di funzionalità originale. Usa semplicemente le nuove funzionalità insieme alle funzionalità originali.
Collegamento di AOAv2 senza un'app Android
Puoi progettare un accessorio (come un dock audio) che utilizza l'audio e il supporto HID ma non comunica con un'applicazione sul dispositivo Android. Per questi accessori, gli utenti non devono ricevere richieste di dialogo per trovare e associare l'accessorio appena collegato a un'applicazione Android in grado di comunicare con esso.
Per eliminare tali finestre di dialogo dopo la connessione di un accessorio, l'accessorio può scegliere di non inviare i nomi del produttore e del modello al dispositivo Android. Quando queste stringhe non vengono fornite al dispositivo Android:
- Il sistema non tenta di trovare un'applicazione per comunicare con l'accessorio.
- L'interfaccia USB accessoria non è presente nella configurazione USB del dispositivo Android dopo che il dispositivo è entrato in modalità accessorio.
Questo documento descrive le modifiche al protocollo AOA (Android Open Accessory) dalla sua versione iniziale e integra la documentazione AOA 1.0 . AOAv2 aggiunge le seguenti funzionalità:
- Uscita audio (obsoleta in Android 8.0).
- Supporto per l'accessorio che funge da uno o più dispositivi di interfaccia umana (HID) al dispositivo Android.
Le API dell'SDK Android disponibili per gli sviluppatori di applicazioni Android non sono cambiate.
Rilevamento del supporto AOAv2
Per determinare se un dispositivo Android connesso supporta gli accessori e la versione del protocollo supportata, un accessorio deve inviare un comando getProtocol()
e verificare il risultato. I dispositivi Android che supportano solo le funzionalità in AOAv1 devono restituire 1
come versione del protocollo; i dispositivi che supportano le funzionalità aggiuntive in AOAv2 devono restituire 2
come versione del protocollo. AOAv2 è retrocompatibile con AOAv1, quindi gli accessori progettati per il protocollo accessorio originale continuano a funzionare con i dispositivi Android più recenti.
L'esempio seguente dalla libreria del codice sorgente Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) mostra questo controllo del protocollo:
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 include nuovi ID prodotto USB per ciascuna combinazione di interfacce USB disponibili in modalità accessori:
Versione | numero identificativo del prodotto | Comunicazione | Descrizione |
---|---|---|---|
AOAv1 | 0x2D00 | accessorio | Fornisce due endpoint in blocco per la comunicazione con un'applicazione Android. |
0x2D01 | accessorio + adb | A scopo di debug durante lo sviluppo degli accessori. Disponibile solo se l'utente ha abilitato il debug USB nelle impostazioni del dispositivo Android. | |
AOAv2 | 0x2D02 | Audio | Per lo streaming audio da un dispositivo Android a un accessorio. |
0x2D03 | audio + adb | ||
0x2D04 | accessorio + audio | ||
0x2D05 | accessorio + audio + adb |
Gli ID prodotto utilizzati in AOAv1 ( 0x2D00
e 0x2D01
) continuano a essere supportati in AOAv2.
Supporto audio
AOAv2 include il supporto per l'uscita audio da un dispositivo Android a un accessorio tramite un'interfaccia di classe audio USB standard in grado di riprodurre audio PCM a 2 canali e 16 bit con un bit rate di 44100 Khz (in futuro potrebbero essere aggiunte modalità audio aggiuntive).
Per abilitare il supporto audio, l'accessorio deve inviare una nuova richiesta di controllo 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
Questo comando deve essere inviato prima di inviare il comando ACCESSORY_START
per entrare in modalità accessorio.
Supporto NASCOSTO
AOAv2 consente agli accessori di registrare uno o più dispositivi di interfaccia umana USB (HID) con un dispositivo Android. Questo approccio inverte la direzione della comunicazione per i tipici dispositivi USB HID come mouse e tastiere USB. Normalmente, il dispositivo HID è una periferica collegata a un host USB (cioè un personal computer), ma in AOA l'host USB può fungere da uno o più dispositivi di input a una periferica USB.
Il supporto HID è un proxy per gli eventi HID standard; l'implementazione non fa ipotesi sul contenuto o sul tipo di eventi e lo passa semplicemente attraverso il sistema di input, consentendo a un accessorio AOAv2 di agire come qualsiasi dispositivo HID (mouse, tastiera, controller di gioco, ecc.). È possibile utilizzare il supporto HID per fornire funzionalità di base, come un pulsante di riproduzione/pausa su un dock multimediale, o per funzionalità avanzate come una docking station con mouse e tastiera QWERTY completa.
AOAv2 aggiunge nuove richieste di controllo USB che consentono all'accessorio di agire come uno o più dispositivi di input HID sul dispositivo Android. Il supporto HID viene gestito interamente tramite richieste di controllo sull'endpoint zero, quindi non è necessaria una nuova interfaccia USB. Le quattro nuove richieste di controllo sono:
- ACCESSORY_REGISTER_HID registra un nuovo dispositivo HID con il dispositivo Android. L'accessorio fornisce un ID utilizzato per identificare il dispositivo HID per le altre tre chiamate. Questo ID è valido fino alla disconnessione dell'USB o fino a quando l'accessorio non invia
ACCESSORY_UNREGISTER_HID
per annullare la registrazione del dispositivo HID. - ACCESSORY_UNREGISTER_HID annulla la registrazione di un dispositivo HID precedentemente registrato con
ACCESSORY_REGISTER_HID
. - ACCESSORY_SET_HID_REPORT_DESC invia un descrittore di rapporto per un dispositivo HID al dispositivo Android. Questa richiesta viene utilizzata per descrivere le capacità del dispositivo HID e deve essere inviata prima di segnalare qualsiasi evento HID al dispositivo Android. Se il descrittore di report è maggiore della dimensione massima del pacchetto per l'endpoint zero, vengono inviati più comandi
ACCESSORY_SET_HID_REPORT_DESC
per trasferire l'intero descrittore. - ACCESSORY_SEND_HID_EVENT invia eventi di input dall'accessorio al dispositivo Android.
Le definizioni del codice per le nuove richieste di controllo sono:
/* 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
Interoperabilità con AOAv1
Il protocollo originale ( AOAv1 ) fornisce il supporto per un'applicazione Android per comunicare direttamente con un host USB (accessorio) tramite USB. AOAv2 continua questo supporto e aggiunge nuove funzionalità per consentire all'accessorio di comunicare con il sistema operativo Android stesso (nello specifico i sistemi audio e di input). Il design di AOAv2 consente di costruire un accessorio che utilizza il nuovo supporto audio e HID oltre al set di funzionalità originale. Usa semplicemente le nuove funzionalità insieme alle funzionalità originali.
Collegamento di AOAv2 senza un'app Android
Puoi progettare un accessorio (come un dock audio) che utilizza l'audio e il supporto HID ma non comunica con un'applicazione sul dispositivo Android. Per questi accessori, gli utenti non devono ricevere richieste di dialogo per trovare e associare l'accessorio appena collegato a un'applicazione Android in grado di comunicare con esso.
Per eliminare tali finestre di dialogo dopo la connessione di un accessorio, l'accessorio può scegliere di non inviare i nomi del produttore e del modello al dispositivo Android. Quando queste stringhe non vengono fornite al dispositivo Android:
- Il sistema non tenta di trovare un'applicazione per comunicare con l'accessorio.
- L'interfaccia USB accessoria non è presente nella configurazione USB del dispositivo Android dopo che il dispositivo è entrato in modalità accessorio.