Gli accessori USB Android devono rispettare il protocollo Android Open Accessory (AOA), che definisce il modo in cui un accessorio rileva e imposta la comunicazione con un dispositivo Android. Gli accessori dovrebbero eseguire i seguenti passaggi:
- Attendere e rilevare un dispositivo connesso.
- Determina il supporto della modalità accessoria del dispositivo.
- Tentare di avviare il dispositivo in modalità accessoria (se necessario).
- Se il dispositivo supporta AOA, stabilire la comunicazione con il dispositivo.
Le sezioni seguenti spiegano come implementare questi passaggi.
Attendere e rilevare i dispositivi collegati
Gli accessori dovrebbero verificare continuamente la presenza di dispositivi Android connessi. Quando un dispositivo è connesso, l'accessorio dovrebbe determinare se il dispositivo supporta la modalità accessorio.
Determina il supporto della modalità accessorio
Nota: il debug USB non è necessario per collegare gli accessori, ma ADB potrebbe essere necessario durante lo sviluppo. Per i dettagli, vedere Considerazioni sul debug .
Quando un dispositivo Android si connette, può trovarsi in uno dei seguenti tre stati:
- Supporta la modalità accessorio Android ed è già in modalità accessorio.
- Supporta la modalità accessorio Android ma non è in modalità accessorio.
- Non supporta la modalità accessorio Android.
Durante la connessione iniziale, l'accessorio dovrebbe controllare la versione, l'ID fornitore e l'ID prodotto del descrittore del dispositivo USB del dispositivo connesso. L'ID del 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 la comunicazione con il dispositivo tramite endpoint di trasferimento di massa utilizzando il proprio protocollo di comunicazione (non è necessario avviare il dispositivo in modalità accessorio).
Nota: 0x2D00
è riservato ai dispositivi Android che supportano la modalità accessori. 0x2D01
è riservato ai dispositivi che supportano la modalità accessorio e il protocollo Android Debug Bridge (ADB), che espone una seconda interfaccia con due endpoint di massa per ADB. Puoi utilizzare questi endpoint per eseguire il debug dell'applicazione accessoria se stai simulando l'accessorio su un computer. In generale, non utilizzare questa interfaccia a meno che l'accessorio non implementi un passthrough per ADB sul dispositivo.
Se la versione, l'ID fornitore o l'ID prodotto nel descrittore del dispositivo USB non corrispondono ai valori previsti, l'accessorio non può determinare se il dispositivo supporta la modalità accessorio Android. L'accessorio dovrebbe tentare di avviare il dispositivo in modalità accessorio (dettagliata di seguito) per determinare il supporto del dispositivo.
Punto chiave: un accessorio USB deve inviare un'intestazione all'handshake iniziale. L'intestazione contiene il produttore, il modello e la versione. Sebbene la versione sia un campo facoltativo, se è installata un'app Android che corrisponde solo alla versione, ma l'accessorio non invia una versione, i dispositivi Android con Android 10 e versioni precedenti si riavvieranno a causa di un'eccezione generata nel processo di sistema.
Tentativo di avvio in modalità accessori
Se la versione, il fornitore e gli ID prodotto non corrispondono a un dispositivo Android in modalità accessoria, l'accessorio non può determinare se il dispositivo supporta (ma non è in) modalità accessoria o se il dispositivo non supporta la modalità accessoria. Ciò può verificarsi perché i dispositivi che supportano la modalità accessoria (ma non sono in modalità accessoria) riportano inizialmente il fornitore del produttore del dispositivo e gli ID prodotto anziché il fornitore AOA e gli ID prodotto.
L'accessorio dovrebbe tentare di avviare il dispositivo in modalità accessorio per determinare se il dispositivo supporta tale modalità:
- Invia una richiesta di controllo 51 ("Ottieni protocollo") per determinare se il dispositivo supporta il protocollo 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 è 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, inviare una richiesta di controllo con 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 (deve terminare con zero 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à accessoria. 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 connesso si reintroduca sul bus in modalità accessorio, quindi enumerare nuovamente i dispositivi collegati. L'algoritmo determina il supporto della modalità accessorio controllando gli ID del fornitore e del prodotto, che dovrebbero essere corretti (ad esempio, corrispondere agli ID del fornitore e del prodotto di Google anziché agli ID del produttore del dispositivo) se il dispositivo è passato correttamente alla modalità dell'accessorio. Se ID e versione sono corretti, l'accessorio si sposta per stabilire la comunicazione con il dispositivo .
Nota: AOA attualmente 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 quindi riconnettersi utilizzando MTP.
Se un passaggio non riesce, l'accessorio determina che il dispositivo non supporta la modalità accessorio Android e attende la connessione del dispositivo successivo.
Stabilire la comunicazione con il dispositivo
Se l'accessorio rileva un dispositivo basato su Android in modalità accessorio, l'accessorio può interrogare l'interfaccia del dispositivo e i descrittori dell'endpoint per ottenere gli endpoint di massa per comunicare con il dispositivo.
Il numero di interfacce e di endpoint di massa dipende dall'ID prodotto. Un dispositivo Android con un ID prodotto di:
-
0x2D00
ha un'interfaccia con due endpoint di massa per la comunicazione di input e output. -
0x2D01
ha due interfacce con due endpoint di massa ciascuno 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, individuare i primi endpoint di input e output di massa, impostare la configurazione del dispositivo su un valore pari a 1 con una richiesta del dispositivoSET_CONFIGURATION
(0x09
), quindi comunicare utilizzando gli endpoint.