Protocolo de acessório aberto do Android 1.0

Os acessórios Android USB devem aderir ao protocolo Android Open Accessory (AOA), que define como um acessório detecta e estabelece a comunicação com um dispositivo Android. Os acessórios devem seguir os seguintes passos:

  1. Aguarde e detecte um dispositivo conectado.
  2. Determine o suporte do modo acessório do dispositivo.
  3. Tente iniciar o dispositivo no modo acessório (se necessário).
  4. 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 Android conectados. Quando um dispositivo é conectado, o acessório deve determinar se o dispositivo oferece suporte ao modo de acessório.

Determinar o suporte do modo 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 obter detalhes, consulte Considerações de depuração .

Quando um dispositivo Android se conecta, ele pode estar em um dos três estados:

  • Suporta o modo de acessório do Android e já está no modo de acessório.
  • Suporta o modo de acessório do Android, mas não está no modo de acessório.
  • Não suporta o modo acessório Android.

Durante a conexão inicial, o acessório deve verificar a versão, ID do fornecedor e 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 deve ser 0x2D00 ou 0x2D01 e o acessório pode estabelecer comunicação com o dispositivo por meio de terminais 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 é reservado para dispositivos Android que suportam o modo acessório. 0x2D01 é reservado para dispositivos que oferecem suporte ao modo acessório, bem como ao protocolo Android Debug Bridge (ADB), que expõe uma segunda interface com dois endpoints em massa para ADB. Você pode usar esses terminais para depurar o aplicativo acessório se estiver simulando o acessório em um computador. Em geral, não use essa interface, a menos que o acessório implemente uma passagem para ADB no dispositivo.

Se a versão, ID do fornecedor ou 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 deve tentar iniciar o dispositivo no modo acessório (detalhado abaixo) para determinar o suporte do dispositivo.

Ponto-chave: Um acessório USB deve enviar um cabeçalho no aperto de mão inicial. O cabeçalho contém o fabricante, modelo e versão. Embora a versão seja um campo opcional, se um aplicativo Android estiver instalado que corresponda apenas à versão, mas o acessório não enviar uma versão, os dispositivos Android com Android 10 e versões 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 as IDs do produto não corresponderem a um dispositivo Android no modo de acessório, o acessório não poderá determinar se o dispositivo oferece suporte (mas não está no) modo de acessório ou se o dispositivo não oferece suporte ao modo de acessório. Isso pode ocorrer porque os dispositivos que oferecem suporte ao modo acessório (mas não estão no modo acessório) inicialmente relatam o fornecedor do fabricante do dispositivo e as IDs do produto em vez do fornecedor AOA e as IDs do produto.

O acessório deve tentar iniciar o dispositivo no modo acessório para determinar se o dispositivo suporta esse modo:

  1. Envie uma solicitação de controle 51 ("Obter protocolo") para determinar se o dispositivo oferece suporte ao protocolo de acessório Android. Se o dispositivo oferecer suporte ao 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)
    
  2. 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 para o usuário se um aplicativo apropriado 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 seguintes IDs de string são suportados, com um tamanho máximo de 256 bytes para cada string (deve ser terminado em zero com \0 ).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Envie uma solicitação de controle para solicitar que o dispositivo inicie 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 deve 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 sucesso para o modo acessório. Se os IDs e a versão estiverem corretos, o acessório move-se para estabelecer comunicação com o dispositivo .

Nota: AOA atualmente não suporta conexões AOA e MTP simultâneas. Para alternar 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 determinará que o dispositivo não oferece suporte ao modo de acessório Android e aguardará a conexão do próximo dispositivo.

Estabelecer comunicação com o dispositivo

Se o acessório detectar um dispositivo Android no modo de acessório, o acessório pode 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 Android com um ID de produto de:

  • 0x2D00 tem uma interface com dois endpoints em massa para comunicação de entrada e saída.
  • 0x2D01 tem duas interfaces com dois endpoints em massa cada 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 endpoints de entrada e saída em massa, defina a configuração do dispositivo para um valor de 1 com uma solicitação de dispositivo SET_CONFIGURATION ( 0x09 ) e comunique-se usando os endpoints.