Gli accessori USB Android devono rispettare il protocollo Android Open Accessory (AOA), che definisce in che modo un accessorio rileva e configura la comunicazione con un dispositivo Android. Gli accessori devono svolgere i seguenti passaggi:
- Attendi e rileva un dispositivo connesso.
- Determina il supporto della modalità accessorio del dispositivo.
- Prova ad avviare il dispositivo in modalità accessorio (se necessario).
- Se il dispositivo supporta AOA, stabilisci la comunicazione con il dispositivo.
Le sezioni seguenti spiegano come implementare questi passaggi.
Attendi e rileva i dispositivi connessi
Gli accessori dovrebbero controllare continuamente la presenza di dispositivi Android connessi. Quando un dispositivo è connesso, l'accessorio deve determinare se il dispositivo supporta la modalità accessorio.
Determinare il supporto della modalità accessorio
Nota:il debug USB non è necessario per collegare gli accessori, ma ADB potrebbe essere necessario durante lo sviluppo. Per maggiori dettagli, consulta Considerazioni sul debug.
Quando un dispositivo Android si connette, può trovarsi in uno dei tre stati seguenti:
- Supporta la modalità accessorio Android ed è già in questa modalità.
- Supporta la modalità accessorio Android, ma non è in modalità accessorio.
- Non supporta la modalità accessorio Android.
Durante la connessione iniziale, l'accessorio deve controllare la versione, l'ID fornitore e l'ID prodotto del descrittore del dispositivo USB del dispositivo collegato. L'ID fornitore deve corrispondere all'ID di Google (0x18D1
). Se il dispositivo è già in modalità accessorio, l'ID prodotto deve essere 0x2D00
o 0x2D01
e l'accessorio può stabilire una comunicazione con il dispositivo tramite endpoint di trasferimento collettivo utilizzando il proprio protocollo di comunicazione (non è necessario avviare il dispositivo in modalità accessorio).
Nota:0x2D00
è riservato ai dispositivi Android che supportano la modalità accessorio. 0x2D01
è riservato ai dispositivi che supportano la modalità accessorio e il protocollo Android Debug Bridge (ADB), che espone una seconda interfaccia con due endpoint collettivi per ADB. Puoi utilizzare questi endpoint per eseguire il debug dell'applicazione dell'accessorio se simuli l'accessorio su un computer. In generale, non utilizzare questa interface, a meno che l'accessorio non implementi un passaggio a ADB sul dispositivo.
Se la versione, l'ID fornitore o l'ID prodotto nel descrittore del dispositivo USB non corrisponde ai valori previsti, l'accessorio non può determinare se il dispositivo supporta la modalità di accessorio Android. L'accessorio dovrebbe tentare di avviare il dispositivo in modalità accessorio (descritta di seguito) per determinare il supporto del dispositivo.
Punto chiave: un accessorio USB deve inviare un'intestazione al momento del primo handshake. L'intestazione contiene il produttore, il modello e la versione. Anche se la versione è un campo facoltativo, se è installata un'app per Android che corrisponde solo alla versione, ma l'accessorio non ne invia una, i dispositivi Android con Android 10 o versioni precedenti si riavvieranno a causa di un'eccezione generata nel processo di sistema.
Prova ad avviare la modalità accessorio
Se gli ID versione, fornitore e prodotto non corrispondono a un dispositivo Android in modalità accessorio, l'accessorio non può determinare se il dispositivo supporta la modalità accessorio (ma non è in questa modalità) o se non la supporta. Questo accade perché i dispositivi che supportano la modalità accessorio (ma non sono in questa modalità) inizialmente segnalano gli ID prodotto e del fornitore del produttore del dispositivo anziché gli ID prodotto e del fornitore dell'AOA.
L'accessorio deve provare ad avviare il dispositivo in modalità accessorio per determinare se il dispositivo supporta questa modalità:
- Invia una richiesta di controllo 51 ("Get Protocol") per determinare se il dispositivo supporta il protocollo di accessorio Android. Se il dispositivo supporta il protocollo,
restituisce un numero diverso da zero che rappresenta la versione del protocollo supportata.
La richiesta di controllo si trova sull'endpoint 0 con le seguenti caratteristiche:
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)
- Se il dispositivo restituisce una versione del protocollo supportata, invia una richiesta di controllo con le informazioni sulla stringa di identificazione al dispositivo. Queste informazioni consentono al
dispositivo di determinare un'applicazione appropriata per l'accessorio (o di presentare un
URL all'utente se non esiste un'applicazione appropriata). La richiesta di controllo è sull'endpoint 0 (per ogni ID stringa) con le seguenti caratteristiche:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
Sono supportati i seguenti ID stringa, con una dimensione massima di 256 byte per ogni stringa (devono terminare con
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Invia una richiesta di controllo per chiedere al dispositivo di avviarsi in modalità accessorio. La richiesta di controllo è sull'endpoint 0 con le seguenti caratteristiche:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
Dopo aver completato questi passaggi, l'accessorio dovrebbe attendere che il dispositivo USB collegato si presenti di nuovo sul bus in modalità accessorio, quindi enumerare di nuovo i dispositivi connessi. L'algoritmo determina il supporto della modalità accessorio controllando gli ID fornitore e prodotto, che devono essere corretti (ad esempio, corrispondere agli ID fornitore e prodotto di Google anziché agli ID del produttore del dispositivo) se il dispositivo è passato correttamente alla modalità accessorio. Se gli ID e la versione sono corretti, l'accessorio passa a stabilire la comunicazione con il dispositivo.
Nota:al momento AOA non supporta connessioni AOA e MTP simultanee. Per passare da AOA a MTP, l'accessorio deve prima scollegare il dispositivo USB (fisicamente o in modo elettricamente equivalente) e poi ricollegarlo utilizzando MTP.
Se un passaggio non va a buon fine, l'accessorio determina che il dispositivo non supporta la modalità accessorio Android e attende che si connetta il dispositivo successivo.
Stabilire una comunicazione con il dispositivo
Se l'accessorio rileva un dispositivo Android in modalità accessorio, può eseguire query sull'interfaccia e sui descrittori di endpoint del dispositivo per ottenere gli endpoint collettivi per la comunicazione con il dispositivo.
Il numero di interfacce ed endpoint collettivi dipende dall'ID prodotto. Un dispositivo Android con ID prodotto:
0x2D00
ha un'interfaccia con due endpoint collettivi per la comunicazione di input e output.0x2D01
ha due interfacce con due endpoint collettivi ciascuna per la comunicazione di input e output. La prima interfaccia gestisce la comunicazione standard e la seconda interfaccia gestisce la comunicazione ADB. Per utilizzare un'interfaccia, individua i primi endpoint di input e output collettivi, imposta la configurazione del dispositivo su un valore pari a 1 con una richiesta di dispositivoSET_CONFIGURATION
(0x09
) e poi comunica utilizzando gli endpoint.