Os acessórios USB Android devem aderir ao protocolo Android Open Acessório (AOA), que define como um acessório detecta e configura a comunicação com um dispositivo Android. Os acessórios devem realizar os seguintes passos:
- Aguarde e detecte um dispositivo conectado.
- Determine o suporte ao modo acessório do dispositivo.
- Tente iniciar o dispositivo no modo acessório (se necessário).
- Se o dispositivo suportar AOA, estabeleça comunicação com o dispositivo.
As seções a seguir explicam como implementar essas etapas.
Aguarde e detecte dispositivos conectados
Os acessórios devem verificar continuamente se há dispositivos com Android conectados. Quando um dispositivo é conectado, o acessório deve determinar se o dispositivo suporta o modo acessório.
Determinar o suporte ao modo acessório
Nota: A depuração USB não é necessária para conectar acessórios, mas o ADB pode ser necessário durante o desenvolvimento. Para obter detalhes, consulte Considerações sobre depuração .
Quando um dispositivo com Android se conecta, ele pode estar em um dos três estados:
- Suporta modo acessório Android e já está no modo acessório.
- Suporta o modo acessório Android, mas não está no modo acessório.
- Não suporta o modo acessório Android.
Durante a conexão inicial, o acessório deve verificar a versão, o ID do fornecedor e o ID do produto do descritor de dispositivo USB do dispositivo conectado. O ID do fornecedor deve corresponder ao ID do Google ( 0x18D1
). Se o dispositivo já estiver no modo acessório, o ID do produto deverá ser 0x2D00
ou 0x2D01
e o acessório poderá estabelecer comunicação com o dispositivo através de pontos de extremidade de transferência em massa usando seu próprio protocolo de comunicação (o dispositivo não precisa ser iniciado no modo acessório).
Nota: 0x2D00
está reservado para dispositivos com Android que suportam o modo acessório. 0x2D01
é reservado para dispositivos que suportam o modo acessório, bem como o protocolo Android Debug Bridge (ADB), que expõe uma segunda interface com dois endpoints em massa para ADB. Você pode usar esses pontos de extremidade para depurar o aplicativo acessório se estiver simulando o acessório em um computador. Em geral, não use esta interface a menos que o acessório implemente uma passagem para ADB no dispositivo.
Se a versão, o ID do fornecedor ou o ID do produto no descritor do dispositivo USB não corresponderem aos valores esperados, o acessório não poderá determinar se o dispositivo oferece suporte ao modo acessório Android. O acessório deve tentar iniciar o dispositivo no modo acessório (detalhado abaixo) para determinar o suporte do dispositivo.
Ponto principal: um acessório USB deve enviar um cabeçalho no handshake inicial. O cabeçalho contém o fabricante, modelo e versão. Embora a versão seja um campo opcional, se for instalado um aplicativo Android que corresponda apenas à versão, mas o acessório não enviar uma versão, os dispositivos Android executados no Android 10 e anteriores serão reinicializados devido a uma exceção lançada no processo do sistema.
Tente iniciar no modo acessório
Se a versão, o fornecedor e os IDs do produto não corresponderem a um dispositivo com Android no modo acessório, o acessório não poderá determinar se o dispositivo suporta (mas não está) no modo acessório ou se o dispositivo não suporta o modo acessório. Isso pode ocorrer porque os dispositivos que suportam o modo acessório (mas não estão no modo acessório) inicialmente relatam o fornecedor do fabricante do dispositivo e os IDs do produto em vez dos IDs do fornecedor e do produto AOA .
O acessório deve tentar iniciar o dispositivo no modo acessório para determinar se o dispositivo suporta esse modo:
- Envie uma solicitação de controle 51 ("Get Protocol") para determinar se o dispositivo suporta o protocolo de acessórios Android. Se o dispositivo suportar o protocolo, ele 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 compatível, envie uma solicitação de controle com informações de string de identificação para o dispositivo. Essas informações permitem que o dispositivo determine um aplicativo apropriado para o acessório (ou apresente uma URL ao usuário se não existir um aplicativo apropriado). 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 seguintes IDs de string são suportados, com um tamanho máximo de 256 bytes para cada string (devem terminar 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 solicitar 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 deverá aguardar que o dispositivo USB conectado se reintroduza no barramento no modo 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 devem estar corretos (por exemplo, corresponder aos IDs do fornecedor e do produto do Google em vez dos IDs do fabricante do dispositivo) se o dispositivo tiver mudado com êxito para o modo acessório. Se os IDs e a versão estiverem corretos, o acessório se move para estabelecer comunicação com o dispositivo .
Nota: AOA atualmente não suporta conexões simultâneas AOA e MTP. Para mudar de AOA para MTP, o acessório deve primeiro desconectar o dispositivo USB (fisicamente ou de forma eletricamente equivalente) e depois reconectar usando MTP.
Se alguma etapa falhar, o acessório determina que o dispositivo não suporta o modo acessório Android e aguarda a conexão do próximo dispositivo.
Estabeleça comunicação com o dispositivo
Se o acessório detectar um dispositivo Android no modo acessório, o acessório poderá consultar a interface do dispositivo e os descritores de endpoint para obter os endpoints em massa para comunicação com o dispositivo.
O número de interfaces e endpoints em massa depende do ID do produto. Um dispositivo com Android com um ID de produto de:
-
0x2D00
possui uma interface com dois endpoints em massa para comunicação de entrada e saída. -
0x2D01
possui duas interfaces com dois endpoints em massa, cada um para comunicação de entrada e saída. A primeira interface lida com a comunicação padrão e a segunda interface lida com a comunicação ADB. Para usar uma interface, localize os primeiros pontos de extremidade de entrada e saída em massa, defina a configuração do dispositivo para um valor de 1 com uma solicitação de dispositivoSET_CONFIGURATION
(0x09
) e comunique-se usando os pontos de extremidade.