Questo documento descrive le modifiche al protocollo Android Open Accessory (AOA) dalla sua release iniziale e integra documentazione di AOA 1.0. AOAv2 aggiunge le seguenti funzionalità:
- Output audio (deprecato in Android 8.0).
- Supporto per l'accessorio che funge da uno o più dispositivi con interfaccia umana (HID) al dispositivo Android.
Le API SDK Android disponibili per gli sviluppatori di app per Android non sono state modificate.
Rilevamento supporto AOAv2
Per determinare se un dispositivo Android connesso supporta gli accessori e il
una versione di protocollo supportata, un accessorio deve inviare un getProtocol()
e controllare il risultato. Dispositivi Android che supportano solo le funzionalità
in AOAv1 deve restituire 1
come versione del protocollo; dispositivi che supportano
le funzionalità aggiuntive in AOAv2 devono restituire 2
come
alla versione del protocollo. AOAv2 è compatibile con le versioni precedenti, quindi gli accessori
progettato per il protocollo originale degli accessori, continuerà a funzionare con le versioni Android più recenti
dispositivi mobili.
Il seguente esempio tratto dall'Accessory Development Kit 2011
codice sorgente
(<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
)
di Cloud Shell dimostra 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 ogni combinazione di interfacce USB disponibile in modalità accessorio:
Versione | ID prodotto | Comunicazione | Descrizione |
---|---|---|---|
AOAv1 | 0x2D00 |
accessorio | Fornisce due endpoint collettivi per la comunicazione con un'app per Android. |
0x2D01 |
accessorio + ADB | A scopo di debug durante lo sviluppo di accessori. Disponibile solo se l'utente ha attivato Debug USB nelle impostazioni del dispositivo Android. | |
AOAv2 | 0x2D02 |
audio | Per lo streaming di audio da un dispositivo Android a un accessorio. |
0x2D03 |
audio + ADB | ||
0x2D04 |
accessorio + audio | ||
0x2D05 |
accessorio + audio + ADB |
ID prodotto utilizzati in AOAv1 (0x2D00
e 0x2D01
)
continuano a essere supportate in AOAv2.
Supporto audio
AOAv2 include il supporto per l'output audio da un dispositivo Android a un accessorio tramite un'interfaccia di classe audio USB standard con capacità di 2 canali e 16 bit Audio PCM con velocità in bit di 44100 Khz (possono essere aggiunte altre modalità audio per il futuro).
Per attivare 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 attivare la modalità accessorio.
Supporto HID
AOAv2 consente agli accessori di registrare una o più interfacce umane USB Dispositivi (HID) con un dispositivo Android. Questo approccio inverte la direzione comunicazione per dispositivi HID USB tipici, come mouse e tastiere USB. Solitamente, il dispositivo HID è una periferica collegata a un host USB (ovvero un personal computer), ma in AOA l'host USB può fungere da uno o più ingressi dispositivi a una periferica USB.
Il supporto HID è un proxy per gli eventi HID standard. il l'implementazione non fa ipotesi sul contenuto o sul tipo di eventi e la passa semplicemente al sistema di input, consentendo all'accessorio AOAv2 di Funzionano come qualsiasi dispositivo HID (mouse, tastiera, controller di gioco e così via). Puoi usare l'HID supporto per fornire funzionalità di base, ad esempio un pulsante di riproduzione/pausa su un contenuto multimediale dock 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 uno o più dispositivi di input HID al dispositivo Android. Viene gestito il supporto HID interamente tramite richieste di controllo sull'endpoint zero, quindi nessuna nuova interfaccia USB necessaria. Le quattro nuove richieste di controllo sono:
- ACCESSORY_REGISTER_HID registra un nuovo dispositivo HID con
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 invia
ACCESSORY_UNREGISTER_HID
per annullare la registrazione dell'HID dispositivo. - 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 report per
un dispositivo HID al dispositivo Android. Questa richiesta viene utilizzata per descrivere
funzionalità del dispositivo HID e devono essere inviate prima di segnalare qualsiasi evento HID
al dispositivo Android. Se il descrittore del report è superiore al valore massimo
dimensione del pacchetto per l'endpoint zero, più
Vengono inviati i comandi
ACCESSORY_SET_HID_REPORT_DESC
per trasferire l'intero descrittore. - ACCESSORY_SEND_HID_EVENT invia eventi di input dal l'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) consente a un'app per Android di comunicare direttamente con una porta USB host (accessorio) tramite USB. AOAv2 continua questo supporto e aggiunge nuove funzionalità per consentire all'accessorio di comunicare con il sistema operativo Android (nello specifico, i sistemi audio e di input). Il design di AOAv2 lo rende possibile realizzare un accessorio che usa il nuovo supporto di audio e HID oltre al set di caratteristiche originali. Ti basta usare le nuove funzionalità insieme le caratteristiche originali.
Connetti AOAv2 senza App per Android
Puoi progettare un accessorio (ad esempio un dock audio) che utilizza audio e HID supportano ma non comunica con un'app sul dispositivo Android. Per accessori, gli utenti non hanno bisogno di ricevere finestre di dialogo per trovare associare l'accessorio appena collegato a un'app Android che può comunicare con questo.
Per eliminare queste finestre di dialogo dopo il collegamento di un accessorio, accessorio può scegliere di non inviare i nomi del produttore e del modello all'app dispositivo. Quando queste stringhe non vengono fornite al dispositivo Android:
- Il sistema non tenta di trovare un'app per comunicare con l'accessorio.
- L'interfaccia USB dell'accessorio non è presente nell'USB del dispositivo Android dopo l'attivazione della modalità accessorio.