Este documento descreve as alterações no protocolo Android Open Accessory (AOA) desde seu lançamento inicial e complementa a documentação do AOA 1.0 . AOAv2 adiciona os seguintes recursos:
- Saída de áudio (obsoleta no Android 8.0).
- Suporte para o acessório atuando como um ou mais dispositivos de interface humana (HIDs) para o dispositivo Android.
As APIs do Android SDK disponíveis para desenvolvedores de aplicativos Android permanecem inalteradas.
Detectando suporte AOAv2
Para determinar se um dispositivo Android conectado é compatível com acessórios e a versão de protocolo compatível, um acessório deve enviar um comando getProtocol()
e verificar o resultado. Os dispositivos Android que suportam apenas os recursos do AOAv1 devem retornar 1
como a versão do protocolo; os dispositivos que suportam os recursos adicionais no AOAv2 devem retornar 2
como a versão do protocolo. O AOAv2 é compatível com versões anteriores do AOAv1, portanto, os acessórios projetados para o protocolo de acessório original continuam a funcionar com dispositivos Android mais recentes.
O exemplo a seguir do código-fonte do Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) demonstra essa verificação de protocolo:
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; }
O AOAv2 inclui novos IDs de produtos USB para cada combinação de interfaces USB disponíveis no modo acessório:
Versão | ID do produto | Comunicação | Descrição |
---|---|---|---|
AOAv1 | 0x2D00 | acessório | Fornece dois endpoints em massa para comunicação com um aplicativo Android. |
0x2D01 | acessório + adb | Para fins de depuração durante o desenvolvimento de acessórios. Disponível apenas se o usuário tiver ativado a Depuração USB nas configurações do dispositivo Android. | |
AOAv2 | 0x2D02 | áudio | Para streaming de áudio de um dispositivo Android para um acessório. |
0x2D03 | áudio + adb | ||
0x2D04 | acessório + áudio | ||
0x2D05 | acessório + áudio + adb |
Os IDs de produto usados no AOAv1 ( 0x2D00
e 0x2D01
) continuam a ter suporte no AOAv2.
Suporte de áudio
O AOAv2 inclui suporte para saída de áudio de um dispositivo Android para um acessório por meio de uma interface de classe de áudio USB padrão capaz de áudio PCM de 2 canais e 16 bits com uma taxa de bits de 44100 Khz (modos de áudio adicionais podem ser adicionados no futuro).
Para habilitar o suporte de áudio, o acessório deve enviar uma nova solicitação de controle 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
Este comando deve ser enviado antes de enviar o comando ACCESSORY_START
para entrar no modo acessório.
Suporte HID
O AOAv2 permite que os acessórios registrem um ou mais dispositivos de interface humana USB (HID) com um dispositivo Android. Essa abordagem inverte a direção da comunicação para dispositivos USB HID típicos, como mouses e teclados USB. Normalmente, o dispositivo HID é um periférico conectado a um host USB (ou seja, um computador pessoal), mas no AOA o host USB pode atuar como um ou mais dispositivos de entrada para um periférico USB.
O suporte HID é um proxy para eventos HID padrão; a implementação não faz suposições sobre o conteúdo ou tipo de eventos e simplesmente o passa para o sistema de entrada, permitindo que um acessório AOAv2 atue como qualquer dispositivo HID (mouse, teclado, controlador de jogo, etc.). Você pode usar o suporte HID para fornecer funcionalidades básicas, como um botão reproduzir/pausar em um dock de mídia, ou para funcionalidades avançadas, como um dock station com mouse e teclado QWERTY completo.
O AOAv2 adiciona novas solicitações de controle USB que permitem que o acessório atue como um ou mais dispositivos de entrada HID para o dispositivo Android. O suporte HID é tratado inteiramente por meio de solicitações de controle no endpoint zero, portanto, nenhuma nova interface USB é necessária. As quatro novas solicitações de controle são:
- ACCESSORY_REGISTER_HID registra um novo dispositivo HID com o dispositivo Android. O acessório fornece um ID usado para identificar o dispositivo HID para as outras três chamadas. Este ID é válido até que o USB seja desconectado ou até que o acessório envie
ACCESSORY_UNREGISTER_HID
para cancelar o registro do dispositivo HID. - ACCESSORY_UNREGISTER_HID cancela o registro de um dispositivo HID registrado anteriormente com
ACCESSORY_REGISTER_HID
. - ACCESSORY_SET_HID_REPORT_DESC envia um descritor de relatório para um dispositivo HID para o dispositivo Android. Essa solicitação é usada para descrever os recursos do dispositivo HID e deve ser enviada antes de relatar qualquer evento HID ao dispositivo Android. Se o descritor de relatório for maior que o tamanho máximo do pacote para o ponto de extremidade zero, vários comandos
ACCESSORY_SET_HID_REPORT_DESC
serão enviados para transferir todo o descritor. - ACCESSORY_SEND_HID_EVENT envia eventos de entrada do acessório para o dispositivo Android.
As definições de código para as novas solicitações de controle são:
/* 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
Interoperabilidade com AOAv1
O protocolo original ( AOAv1 ) fornece suporte para que um aplicativo Android se comunique diretamente com um host USB (acessório) via USB. O AOAv2 continua esse suporte e adiciona novos recursos para permitir que o acessório se comunique com o próprio sistema operacional Android (especificamente os sistemas de áudio e entrada). O design do AOAv2 possibilita a construção de um acessório que usa o novo suporte de áudio e HID além do conjunto de recursos original. Basta usar os novos recursos junto com os recursos originais.
Conectando o AOAv2 sem um aplicativo Android
Você pode projetar um acessório (como um dock de áudio) que use suporte a áudio e HID, mas não se comunique com um aplicativo no dispositivo Android. Para esses acessórios, os usuários não precisam receber prompts de diálogo para localizar e associar o acessório recém-conectado a um aplicativo Android que possa se comunicar com ele.
Para suprimir essas caixas de diálogo após a conexão de um acessório, o acessório pode optar por não enviar os nomes do fabricante e do modelo ao dispositivo Android. Quando essas strings não são fornecidas ao dispositivo Android:
- O sistema não tenta encontrar um aplicativo para se comunicar com o acessório.
- A interface USB acessória não está presente na configuração USB do dispositivo Android depois que o dispositivo entra no modo acessório.
Este documento descreve as alterações no protocolo Android Open Accessory (AOA) desde seu lançamento inicial e complementa a documentação do AOA 1.0 . AOAv2 adiciona os seguintes recursos:
- Saída de áudio (obsoleta no Android 8.0).
- Suporte para o acessório atuando como um ou mais dispositivos de interface humana (HIDs) para o dispositivo Android.
As APIs do Android SDK disponíveis para desenvolvedores de aplicativos Android permanecem inalteradas.
Detectando suporte AOAv2
Para determinar se um dispositivo Android conectado é compatível com acessórios e a versão de protocolo compatível, um acessório deve enviar um comando getProtocol()
e verificar o resultado. Os dispositivos Android que suportam apenas os recursos do AOAv1 devem retornar 1
como a versão do protocolo; os dispositivos que suportam os recursos adicionais no AOAv2 devem retornar 2
como a versão do protocolo. O AOAv2 é compatível com versões anteriores do AOAv1, portanto, os acessórios projetados para o protocolo de acessório original continuam a funcionar com dispositivos Android mais recentes.
O exemplo a seguir do código-fonte do Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) demonstra essa verificação de protocolo:
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; }
O AOAv2 inclui novos IDs de produtos USB para cada combinação de interfaces USB disponíveis no modo acessório:
Versão | ID do produto | Comunicação | Descrição |
---|---|---|---|
AOAv1 | 0x2D00 | acessório | Fornece dois endpoints em massa para comunicação com um aplicativo Android. |
0x2D01 | acessório + adb | Para fins de depuração durante o desenvolvimento de acessórios. Disponível apenas se o usuário tiver ativado a Depuração USB nas configurações do dispositivo Android. | |
AOAv2 | 0x2D02 | áudio | Para streaming de áudio de um dispositivo Android para um acessório. |
0x2D03 | áudio + adb | ||
0x2D04 | acessório + áudio | ||
0x2D05 | acessório + áudio + adb |
Os IDs de produto usados no AOAv1 ( 0x2D00
e 0x2D01
) continuam a ter suporte no AOAv2.
Suporte de áudio
O AOAv2 inclui suporte para saída de áudio de um dispositivo Android para um acessório por meio de uma interface de classe de áudio USB padrão capaz de áudio PCM de 2 canais e 16 bits com uma taxa de bits de 44100 Khz (modos de áudio adicionais podem ser adicionados no futuro).
Para habilitar o suporte de áudio, o acessório deve enviar uma nova solicitação de controle 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
Este comando deve ser enviado antes de enviar o comando ACCESSORY_START
para entrar no modo acessório.
Suporte HID
O AOAv2 permite que os acessórios registrem um ou mais dispositivos de interface humana USB (HID) com um dispositivo Android. Essa abordagem inverte a direção da comunicação para dispositivos USB HID típicos, como mouses e teclados USB. Normalmente, o dispositivo HID é um periférico conectado a um host USB (ou seja, um computador pessoal), mas no AOA o host USB pode atuar como um ou mais dispositivos de entrada para um periférico USB.
O suporte HID é um proxy para eventos HID padrão; a implementação não faz suposições sobre o conteúdo ou tipo de eventos e simplesmente o passa para o sistema de entrada, permitindo que um acessório AOAv2 atue como qualquer dispositivo HID (mouse, teclado, controlador de jogo, etc.). Você pode usar o suporte HID para fornecer funcionalidades básicas, como um botão reproduzir/pausar em um dock de mídia, ou para funcionalidades avançadas, como um dock station com mouse e teclado QWERTY completo.
O AOAv2 adiciona novas solicitações de controle USB que permitem que o acessório atue como um ou mais dispositivos de entrada HID para o dispositivo Android. O suporte HID é tratado inteiramente por meio de solicitações de controle no endpoint zero, portanto, nenhuma nova interface USB é necessária. As quatro novas solicitações de controle são:
- ACCESSORY_REGISTER_HID registra um novo dispositivo HID com o dispositivo Android. O acessório fornece um ID usado para identificar o dispositivo HID para as outras três chamadas. Este ID é válido até que o USB seja desconectado ou até que o acessório envie
ACCESSORY_UNREGISTER_HID
para cancelar o registro do dispositivo HID. - ACCESSORY_UNREGISTER_HID cancela o registro de um dispositivo HID registrado anteriormente com
ACCESSORY_REGISTER_HID
. - ACCESSORY_SET_HID_REPORT_DESC envia um descritor de relatório para um dispositivo HID para o dispositivo Android. Essa solicitação é usada para descrever os recursos do dispositivo HID e deve ser enviada antes de relatar qualquer evento HID ao dispositivo Android. Se o descritor de relatório for maior que o tamanho máximo do pacote para o ponto de extremidade zero, vários comandos
ACCESSORY_SET_HID_REPORT_DESC
serão enviados para transferir todo o descritor. - ACCESSORY_SEND_HID_EVENT envia eventos de entrada do acessório para o dispositivo Android.
As definições de código para as novas solicitações de controle são:
/* 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
Interoperabilidade com AOAv1
O protocolo original ( AOAv1 ) fornece suporte para que um aplicativo Android se comunique diretamente com um host USB (acessório) via USB. O AOAv2 continua esse suporte e adiciona novos recursos para permitir que o acessório se comunique com o próprio sistema operacional Android (especificamente os sistemas de áudio e entrada). O design do AOAv2 possibilita a construção de um acessório que usa o novo suporte de áudio e HID além do conjunto de recursos original. Basta usar os novos recursos junto com os recursos originais.
Conectando o AOAv2 sem um aplicativo Android
Você pode projetar um acessório (como um dock de áudio) que use suporte a áudio e HID, mas não se comunique com um aplicativo no dispositivo Android. Para esses acessórios, os usuários não precisam receber prompts de diálogo para localizar e associar o acessório recém-conectado a um aplicativo Android que possa se comunicar com ele.
Para suprimir essas caixas de diálogo após a conexão de um acessório, o acessório pode optar por não enviar os nomes do fabricante e do modelo ao dispositivo Android. Quando essas strings não são fornecidas ao dispositivo Android:
- O sistema não tenta encontrar um aplicativo para se comunicar com o acessório.
- A interface USB acessória não está presente na configuração USB do dispositivo Android depois que o dispositivo entra no modo acessório.