Accessorio aperto Android 1.0

Gli accessori USB Android devono aderire al protocollo Android Open Accessorio (AOA), che definisce il modo in cui un accessorio rileva e imposta la comunicazione con un dispositivo basato su Android. Gli accessori dovrebbero eseguire i seguenti passaggi:

  1. Attendi e rileva un dispositivo connesso.
  2. Determinare il supporto della modalità accessoria del dispositivo.
  3. Tentare di avviare il dispositivo in modalità accessori (se necessario).
  4. 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 è connesso, l'accessorio dovrebbe determinare se il dispositivo supporta la modalità accessorio.

Determinare il supporto della modalità accessoria

Nota: il debug USB non è richiesto per il collegamento degli 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:

  • Supporta la modalità accessorio Android ed è già in modalità accessorio.
  • 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 del fornitore e l'ID del 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 la comunicazione con il dispositivo tramite endpoint di trasferimento di massa utilizzando il proprio protocollo di comunicazione (non è necessario che il dispositivo sia avviato in modalità accessoria).

Nota: 0x2D00 è riservato ai dispositivi basati su 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 eseguire il debug dell'applicazione dell'accessorio se si sta simulando l'accessorio su un computer. In generale, non utilizzare questa interfaccia a meno che l'accessorio non implementi un passthrough 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 al momento dell'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.

Tentare di avviare in modalità accessori

Se la versione, il fornitore e gli ID prodotto non corrispondono a un dispositivo Android in modalità accessorio, l'accessorio non può determinare se il dispositivo supporta (ma non è in) modalità accessorio o se il dispositivo non supporta la modalità accessorio. Ciò può verificarsi perché i dispositivi che supportano la modalità accessoria (ma non sono in modalità accessoria) inizialmente segnalano il fornitore del dispositivo e gli ID prodotto invece del fornitore AOA e gli ID prodotto.

L'accessorio dovrebbe provare ad avviare il dispositivo in modalità accessorio per determinare se il dispositivo supporta tale modalità:

  1. Invia una richiesta di controllo 51 ("Ottieni protocollo") per determinare se il dispositivo supporta il protocollo dell'accessorio Android. Se il dispositivo supporta il protocollo, restituisce un numero diverso da zero che rappresenta la versione del protocollo supportato. 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)
    
  2. 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 di 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
    
  3. 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à accessoria controllando il fornitore e gli ID prodotto, che dovrebbero essere corretti (ad esempio, corrispondere al fornitore e agli ID prodotto di Google anziché agli ID del produttore del dispositivo) se il dispositivo è passato correttamente alla modalità accessoria. Se gli ID e la versione sono corretti, l'accessorio si muove 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 disconnettere il dispositivo USB (fisicamente o in modo elettricamente equivalente) e poi 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ò eseguire query sull'interfaccia del dispositivo e sui descrittori dell'endpoint per ottenere gli endpoint in blocco per comunicare con il dispositivo.

Il numero di interfacce ed endpoint in blocco dipende dall'ID prodotto. Un dispositivo Android con un ID prodotto pari a:

  • 0x2D00 ha un'interfaccia con due endpoint in blocco per la comunicazione di input e output.
  • 0x2D01 ha due interfacce con due endpoint bulk 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 in blocco, impostare la configurazione del dispositivo su un valore pari a 1 con una richiesta del dispositivo SET_CONFIGURATION ( 0x09 ), quindi comunicare utilizzando gli endpoint.