Este documento descreve as mudanças no protocolo do Android Open Accessory (AOA) desde o lançamento inicial e complementa Documentação do AOA 1.0. AOAv2 adiciona os seguintes recursos:
- Saída de áudio (descontinuada no Android 8.0).
- Suporte para o acessório atuar como um ou mais dispositivos de interface humana (HIDs, na sigla em inglês) ao dispositivo Android.
As APIs do SDK do Android disponíveis para os desenvolvedores de apps Android não foram alteradas.
Detectar suporte a AOAv2
Para determinar se um dispositivo Android conectado é compatível com acessórios e os
versão do protocolo compatível, um acessório precisa enviar uma solicitação getProtocol()
e verifique o resultado. Dispositivos Android compatíveis apenas com os recursos
em AOAv1 precisa retornar 1
como a versão do protocolo. dispositivos que
oferecer suporte aos recursos adicionais na AOAv2 precisa retornar 2
, pois o
e a versão do protocolo. O AOAv2 é compatível com versões anteriores do AOAv1, então os acessórios
projetados para o protocolo de acessório original continuam a funcionar com dispositivos Android
dispositivos.
O exemplo a seguir do Kit de Desenvolvimento de Acessórios 2011
código-fonte
(<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; }
A AOAv2 inclui novos IDs de produtos USB para cada combinação de interfaces USB. disponíveis no modo de acessório:
Versão | ID do produto | Comunicação | Descrição |
---|---|---|---|
AOAv1 | 0x2D00 |
acessórios | Oferece dois endpoints em massa para comunicação com um app Android. |
0x2D01 |
acessório + adb | Para fins de depuração durante o desenvolvimento do acessório. Disponível apenas se o o usuário ativou a Depuração USB nas configurações do dispositivo Android. | |
AOAv2 | 0x2D02 |
vários idiomas | Para fazer streaming de áudio de um dispositivo Android para um acessório. |
0x2D03 |
áudio + adb | ||
0x2D04 |
acessório + áudio | ||
0x2D05 |
acessório + áudio + adb |
IDs do produto usados no AOAv1 (0x2D00
e 0x2D01
)
continuam sendo compatíveis com AOAv2.
Compatibilidade de áudio
A AOAv2 inclui suporte para saída de áudio de um dispositivo Android para um por uma interface de classe de áudio USB padrão com capacidade de 2 canais, 16 bits Áudio PCM com taxa de bits de 44.100 Khz (outros modos de áudio podem ser adicionados ao no futuro).
Para ativar o suporte a áudio, o acessório precisa 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
Esse comando deve ser enviado antes de enviar a
Comando ACCESSORY_START
para entrar no modo de acessório.
Compatibilidade com HID
A AOAv2 permite que os acessórios registrem uma ou mais interfaces humanas USB. Dispositivos (HID) com um dispositivo Android. Essa abordagem inverte a direção de 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 (por exemplo, um computador pessoal), mas, na AOA, o host USB pode atuar como uma ou mais dispositivos a um periférico USB.
O suporte a HID é um proxy para eventos HID padrão. as 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 atuam como qualquer dispositivo HID (mouse, teclado, controle de jogo etc.). Você pode usar um HID para oferecer funcionalidades básicas, como um botão para reproduzir/pausar em uma mídia ou para funcionalidades avançadas, como uma dock station com mouse e teclado QWERTY completo.
A AOAv2 adiciona novas solicitações de controle USB que permitem que o acessório atue como um ou mais dispositivos de entrada HID ao dispositivo Android. Suporte a HID disponível inteiramente através de solicitações de controle no endpoint zero, de modo que nenhuma nova interface USB é necessários. 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
das outras três chamadas. Esse ID é válido até o USB se desconectar ou até que o
o acessório envia
ACCESSORY_UNREGISTER_HID
para cancelar o registro do HID; dispositivo. - 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 ao dispositivo Android. Essa solicitação é usada para descrever
do dispositivo HID e deve ser enviada antes de relatar qualquer evento HID
ao dispositivo Android. Se o descritor do relatório for maior que o máximo
tamanho do pacote para o endpoint zero, vários
Os comandos
ACCESSORY_SET_HID_REPORT_DESC
são enviados para transferir descritor completo. - ACCESSORY_SEND_HID_EVENT envia eventos de entrada do ao 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). oferece suporte para que um app Android se comunique diretamente com uma porta USB (acessório) por USB. A AOAv2 continua com 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 de entrada). O design do AOAv2 facilita possível criar um acessório que use o novo suporte a áudio e HID além do conjunto de atributos original. Basta usar os novos recursos os recursos originais.
Conectar AOAv2 sem uma App Android
Você pode projetar um acessório (como uma base de áudio) que use áudio e HID é compatível, mas não se comunica com um app no dispositivo Android. Para esses acessórios, os usuários não precisam receber solicitações de caixa de diálogo para localizar e associar o acessório recém-anexado a um aplicativo Android que pode 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 para o dispositivo. Quando essas strings não são fornecidas ao dispositivo Android:
- O sistema não tenta encontrar um app para se comunicar com o acessório.
- A interface USB do acessório não está presente no USB do dispositivo Android. configuração depois que o dispositivo entra no modo de acessório.