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 configura 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 ao 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 suporta o modo acessório.

Determinar o suporte ao modo acessório

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

  • Suporta o 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 de 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 do 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 através de endpoints de transferência em massa usando seu próprio protocolo de comunicação (o dispositivo não precisa ser iniciado no modo acessório).

Observação: 0x2D00 é 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 é compatível com o 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 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 inferior 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 Android no modo acessório, o acessório não poderá determinar se o dispositivo é compatível (mas não está no) modo acessório ou se não é compatível com 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) relatam inicialmente 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 é compatível com esse modo:

  1. Envie uma solicitação de controle 51 ("Obter protocolo") para determinar se o dispositivo é compatível com o protocolo de acessório do Android. Se o dispositivo for compatível com 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)
    
  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 um URL ao 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
    

Após concluir essas etapas, o acessório deve aguardar que o dispositivo USB conectado se reintroduza no barramento no modo acessório e, em seguida, reenumere 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, correspondem aos IDs do fornecedor e do produto do Google em vez dos IDs do fabricante do dispositivo) se o dispositivo mudou 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: Atualmente, o AOA não oferece suporte a conexões AOA e MTP simultâneas. Para mudar de AOA para MTP, o acessório deve primeiro desconectar o dispositivo USB (fisicamente ou de maneira eletricamente equivalente) e depois reconectar usando MTP.

Se alguma etapa falhar, o acessório determina que o dispositivo não é compatível com o modo de acessório Android e aguarda a conexão do próximo dispositivo.

Estabelecer 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 Android com um ID do produto de:

  • 0x2D00 tem uma interface com dois terminais em massa para comunicação de entrada e saída.
  • 0x2D01 tem duas interfaces com dois terminais em massa cada para comunicação de entrada e saída. A primeira interface trata da comunicação padrão e a segunda interface trata da 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.