Os acessórios USB para Android precisam aderir ao Android Open Accessory (AOA). , que define como um acessório detecta e configura a comunicação com um dispositivo Android. Os acessórios precisam seguir estas etapas:
- Aguarde e detecte um dispositivo conectado.
- Determine o suporte ao modo de acessório do dispositivo.
- Tente ligar o dispositivo no modo de 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.
Esperar e detectar conectado dispositivos
Os acessórios precisam verificar continuamente se há dispositivos Android conectados. Quando um dispositivo está conectado, o acessório deve determinar se ele é compatível com o modo de acessório.
Determinar o suporte ao 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 de depuração.
Quando um dispositivo Android se conecta, ele pode estar em um destes três estados:
- Oferece suporte ao modo de acessório Android e já está nesse modo.
- Oferece suporte ao modo de acessório Android, mas não está no modo de acessório.
- Não é compatível com o modo de acessório Android.
Durante a conexão inicial, o acessório deve verificar a versão, o ID do fornecedor,
e ID do produto do descritor do dispositivo USB do dispositivo conectado. O ID do fornecedor
precisam corresponder ao ID do Google (0x18D1
). Se o dispositivo já estiver
modo acessório, o ID do produto deve ser 0x2D00
ou
0x2D01
e o acessório possa
estabelecer a comunicação
o dispositivo por endpoints de transferência em massa usando comunicação própria
(o dispositivo não precisa ser iniciado no modo de acessório).
Observação: 0x2D00
é reservado para
Dispositivos com tecnologia Android compatíveis com o modo de acessório. 0x2D01
é
reservado para dispositivos compatíveis com o modo de acessório, bem como para o Android Debug
Protocolo Bridge (adb), que expõe uma segunda interface com dois endpoints em massa
para ADB. É possível usar esses endpoints para depurar o aplicativo acessório se
você está simulando o acessório em um computador. Em geral, não use isso
interface, a menos que o acessório implemente uma passagem 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 é compatível Modo de acessório Android. O acessório deve tentar iniciar o dispositivo modo acessório (detalhado abaixo) para determinar o suporte do dispositivo.
Ponto-chave : um acessório USB precisa enviar um cabeçalho no handshake inicial. O cabeçalho contém as informações de fabricante, modelo para a versão anterior. Embora a versão seja um campo opcional, se um app Android que só estiver instalado corresponde à versão, mas o acessório não envia uma versão, os dispositivos Android em execução no Android 10 e versões anteriores serão reinicializados devido a uma exceção ser gerada no o processo do sistema.
Tentativa de iniciar no acessório modo
Se a versão, o fornecedor e os IDs do produto não corresponderem a uma conta do Android dispositivo em modo de acessório, o acessório não pode determinar se o dispositivo é compatível, mas não está no modo de acessório) ou se o dispositivo não for compatível com esse modo. Isso pode ocorrer porque os dispositivos compatíveis com o modo de acessório, mas não estão em modo de informa inicialmente o fornecedor do fabricante do dispositivo e os IDs do produto em vez de IDs de produto e fornecedor AOA.
O acessório deve tentar iniciar o dispositivo no modo de acessório para determinar se o dispositivo for compatível com esse modo:
- Enviar uma solicitação de controle 51 ("Receber protocolo") para determinar se o dispositivo
oferece suporte ao protocolo de acessório Android. Se o dispositivo oferecer suporte ao protocolo,
ela 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 a identificação de informações de string para o dispositivo. Essas informações permitem que
dispositivo para determinar um aplicativo apropriado para o acessório (ou apresentar um
URL ao usuário se não houver um aplicativo apropriado). O controle
solicitação está no endpoint 0 (para cada ID de string) com o seguinte
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 terminar 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 de 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 deve aguardar o USB conectado para se apresentar novamente no barramento em modo de acessório e, em seguida, enumerar e dispositivos conectados. O algoritmo determina o suporte ao modo de acessório verificando os IDs de produto e fornecedor, que devem estar corretos (por exemplo, corresponder aos IDs de produto e fornecedor do Google em vez de aos IDs do fabricante do dispositivo) se o dispositivo entrou no modo de acessório. Se os IDs e a versão estiverem corretos, o acessório se move para estabelecer comunicação com o dispositivo.
Observação:no momento, a AOA não é compatível com a AOA. conexões AOA e MTP simultâneas. Para mudar de AOA para MTP, o acessório primeiro é necessário desconectar o dispositivo USB (seja fisicamente ou equivalente) e depois reconecte usando o MTP.
Se alguma etapa falhar, o acessório determinará que o dispositivo não é compatível Modo de acessório Android e espera até que o próximo dispositivo seja conectado.
Estabelecer comunicação com o dispositivo
Se o acessório detectar um dispositivo com tecnologia Android no modo de acessório, o acessório pode consultar a interface do dispositivo e os descritores de endpoint para receber a 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 Android com um ID de produto de:
0x2D00
tem uma interface com dois endpoints em massa para entrada e comunicação de saída.0x2D01
tem duas interfaces com dois endpoints em massa, cada um para comunicação de entrada e saída. A primeira interface lida com padrões comunicação, e a segunda interface lida com a comunicação ADB. Para usar um de entrada, localize os primeiros endpoints de entrada e saída em massa, defina os configuração do dispositivo para um valor de 1 com umSET_CONFIGURATION
(0x09
) e se comunica usando os endpoints.