Gli accessori USB Android devono aderire al protocollo AOA (Android Open Accessory), che definisce il modo in cui un accessorio rileva e configura la comunicazione con un dispositivo Android. Gli accessori devono eseguire i seguenti passaggi:
- Attendi e rileva 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.
Attendi e rileva i dispositivi collegati
Gli accessori dovrebbero verificare continuamente la presenza di dispositivi Android collegati. Quando un dispositivo è collegato, l'accessorio dovrebbe determinare se il dispositivo supporta la modalità accessorio.
Determina il supporto della modalità accessoria
Quando un dispositivo Android si connette, può trovarsi in uno dei tre stati seguenti:
- Supporta la modalità accessori Android ed è già in modalità accessori.
- Supporta la modalità accessori Android ma non è in modalità accessori.
- Non supporta la modalità accessorio Android.
Durante la connessione iniziale, l'accessorio dovrebbe verificare 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à accessoria, l'ID prodotto deve essere 0x2D00
o 0x2D01
e l'accessorio può stabilire una comunicazione con il dispositivo tramite endpoint di trasferimento di massa utilizzando il proprio protocollo di comunicazione (non è necessario avviare il dispositivo in modalità accessoria).
Nota: 0x2D00
è riservato ai dispositivi Android che supportano la modalità accessoria. 0x2D01
è riservato ai dispositivi che supportano la modalità accessoria, nonché il protocollo Android Debug Bridge (ADB), che espone una seconda interfaccia con due endpoint in blocco per ADB. È possibile utilizzare questi endpoint per il debug dell'applicazione accessoria se si simula l'accessorio su un computer. In generale, non utilizzare questa interfaccia a meno che l'accessorio non implementi un passthrough ad 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 è in grado di 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 alla stretta di mano 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à accessoria
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) la 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) segnalano inizialmente il fornitore del produttore del dispositivo e gli ID prodotto anziché il fornitore AOA e gli ID prodotto.
L'accessorio dovrebbe provare ad avviare il dispositivo in modalità accessoria 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 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, 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 si trova 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 si trova 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 deve attendere che il dispositivo USB collegato si reintroduca sul bus in modalità accessorio, quindi enumera nuovamente i dispositivi collegati. L'algoritmo determina il supporto della modalità accessoria controllando il fornitore e gli ID prodotto, che dovrebbero essere corretti (ad esempio, corrispondono agli ID fornitore e prodotto di Google anziché agli ID del produttore del dispositivo) se il dispositivo è passato correttamente alla modalità accessoria. Se ID e versione sono corretti, l'accessorio si sposta per stabilire la comunicazione con il dispositivo .
Nota: AOA attualmente non supporta le connessioni AOA e MTP simultanee. Per passare da AOA a MTP, l'accessorio deve prima disconnettere il dispositivo USB (sia fisicamente che elettricamente equivalente) e poi ricollegarsi tramite 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 Android in modalità accessorio, l'accessorio può interrogare l'interfaccia del dispositivo e i descrittori degli endpoint per ottenere gli endpoint in blocco per la comunicazione con il dispositivo.
Il numero di interfacce e di endpoint in blocco dipende dall'ID prodotto. Un dispositivo Android con un ID prodotto di:
-
0x2D00
ha un'interfaccia con due endpoint bulk per la comunicazione di input e output. -
0x2D01
dispone di due interfacce con due terminali di massa 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, individuare i primi endpoint di input e output di massa, impostare la configurazione del dispositivo su un valore 1 con una richiesta del dispositivoSET_CONFIGURATION
(0x09
), quindi comunicare utilizzando gli endpoint.