Os acessórios USB para Android precisam aderir ao protocolo Android Open Accessory (AOA), que define como um acessório detecta e configura a comunicação com um dispositivo com tecnologia Android. Os acessórios precisam seguir estas etapas:
- Aguardar e detectar um dispositivo conectado.
- Determine o suporte ao modo de acessório do dispositivo.
- Tente iniciar o dispositivo no modo acessório (se necessário).
- Se o dispositivo for compatível com AOA, estabeleça a comunicação com ele.
As seções a seguir explicam como implementar essas etapas.
Aguardar e detectar dispositivos conectados
Os acessórios precisam verificar continuamente se há dispositivos Android conectados. Quando um dispositivo é conectado, o acessório precisa determinar se ele oferece suporte ao modo de acessório.
Determinar a compatibilidade com o modo de acessório
Observação:a depuração USB não é necessária para conectar acessórios, mas o ADB pode ser necessário durante o desenvolvimento. Para mais detalhes, consulte Considerações sobre depuração.
Quando um dispositivo Android se conecta, ele pode estar em um destes três estados:
- Oferece suporte ao modo de acessório do Android e já está nesse modo.
- Oferece suporte ao modo acessório do Android, mas não está nesse modo.
- Não oferece suporte ao modo de acessório do Android.
Durante a conexão inicial, o acessório precisa verificar a versão, o ID do fornecedor
e o ID do produto do descritor do dispositivo USB do dispositivo conectado. O ID do fornecedor
precisa corresponder ao ID do Google (0x18D1
). Se o dispositivo já estiver no
modo acessório, o ID do produto precisa ser 0x2D00
ou
0x2D01
, e o acessório pode
estabelecer comunicação com
o dispositivo por endpoints de transferência em massa usando o próprio protocolo
de comunicação (o dispositivo não precisa ser iniciado no modo acessório).
Observação:0x2D00
é reservado para
dispositivos Android que oferecem suporte ao modo acessório. 0x2D01
é
reservado para dispositivos que oferecem suporte ao modo de acessório e ao protocolo Android Debug
Bridge (ADB, na sigla em inglês), que expõe uma segunda interface com dois endpoints em massa
para o ADB. É possível usar esses endpoints para depurar o aplicativo do acessório se
você estiver simulando o acessório em um computador. Em geral, não use essa
interface, a menos que o acessório implemente um encaminhamento para o adb no dispositivo.
Se a versão, o ID do fornecedor ou o ID do produto no descritor do dispositivo USB não corresponder aos valores esperados, o acessório não poderá determinar se o dispositivo oferece suporte ao modo de acessório Android. O acessório precisa tentar iniciar o dispositivo no modo acessório (detalhado abaixo) para determinar o suporte ao dispositivo.
Importante : um acessório USB precisa enviar um cabeçalho após o handshake inicial. O cabeçalho contém o fabricante, o modelo e a versão. Embora a versão seja um campo opcional, se um app Android for instalado que corresponda à versão, mas o acessório não enviar uma versão, os dispositivos Android com o Android 10 e versões anteriores serão reiniciados devido a uma exceção gerada no processo do sistema.
Tentar iniciar no modo de acessório
Se os IDs de versão, fornecedor e produto não corresponderem a um dispositivo Android no modo acessório, o acessório não poderá determinar se o dispositivo oferece suporte ao modo acessório (mas não está nele) ou se ele não oferece suporte. Isso pode ocorrer porque os dispositivos que oferecem suporte ao modo acessório, mas não estão nesse modo, informam inicialmente os IDs de produto e do fabricante do dispositivo em vez dos IDs de produto e do fabricante do AOA.
O acessório precisa tentar iniciar o dispositivo no modo acessório para determinar se o dispositivo oferece suporte a esse modo:
- Envie uma solicitação de controle 51 ("Get Protocol") para determinar se o dispositivo
oferece suporte ao protocolo de acessório do Android. Se o dispositivo for compatível com o protocolo,
ele vai retornar um número diferente de zero que representa a versão do protocolo compatível.
A solicitação de controle está no endpoint 0 com as seguintes características:
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 o dispositivo retornar uma versão de protocolo com suporte, envie uma solicitação de controle
com informações de identificação da string para o dispositivo. Essas informações permitem que o
dispositivo determine um aplicativo adequado para o acessório ou apresente um
URL ao usuário se um aplicativo adequado não existir. A solicitação de
controle está no endpoint 0 (para cada ID de string) com as seguintes
características:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
Os IDs de string a seguir são aceitos, com um tamanho máximo de 256 bytes para cada string (precisa ser terminada em zero com
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Envie uma solicitação de controle para pedir que o dispositivo seja iniciado no modo acessório. A
solicitação de controle está no endpoint 0 com as seguintes características:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
Depois de concluir essas etapas, o acessório precisa esperar que o dispositivo USB conectado se reintroduza no barramento no modo de acessório e, em seguida, enumerar novamente os dispositivos conectados. O algoritmo determina o suporte ao modo acessório verificando os IDs do fornecedor e do produto, que precisam estar corretos (por exemplo, precisam corresponder aos IDs do fornecedor e do produto do Google, e não aos IDs do fabricante do dispositivo) se o dispositivo tiver sido alternado para o modo acessório. Se os IDs e a versão estiverem corretos, o acessório vai estabelecer a comunicação com o dispositivo.
Observação:no momento, a AOA não oferece suporte a conexões simultâneas de AOA e MTP. Para alternar de AOA para MTP, o acessório precisa primeiro desconectar o dispositivo USB (de forma física ou elétrica equivalente) e, em seguida, se reconectar usando o MTP.
Se alguma etapa falhar, o acessório vai determinar que o dispositivo não oferece suporte ao modo de acessório Android e aguardar a conexão do próximo dispositivo.
Estabeleça a comunicação com o dispositivo
Se o acessório detectar um dispositivo Android no modo acessório, ele poderá consultar a interface do dispositivo e os descritores de endpoint para receber os endpoints em massa para se comunicar com o dispositivo.
O número de interfaces e endpoints em massa depende do ID do produto. Um dispositivo Android com um ID de produto de:
- O
0x2D00
tem uma interface com dois endpoints em massa para comunicação de entrada e saída. - O
0x2D01
tem duas interfaces com dois endpoints em massa para comunicação de entrada e saída. A primeira interface processa a comunicação padrão, e a segunda interface processa a comunicação ADB. Para usar uma interface, localize os primeiros endpoints de entrada e saída em massa, defina a configuração do dispositivo como um valor de 1 com uma solicitação de dispositivoSET_CONFIGURATION
(0x09
) e comunique-se usando os endpoints.