Accessoire ouvert Android 1.0

Les accessoires USB Android doivent adhérer au protocole Android Open Accessories (AOA), qui définit la manière dont un accessoire détecte et établit la communication avec un appareil Android. Les accessoires doivent effectuer les étapes suivantes :

  1. Attendez et détectez un appareil connecté.
  2. Déterminez la prise en charge du mode accessoire de l’appareil.
  3. Essayez de démarrer l'appareil en mode accessoire (si nécessaire).
  4. Si l'appareil prend en charge AOA, établissez la communication avec l'appareil.

Les sections suivantes expliquent comment mettre en œuvre ces étapes.

Attendre et détecter les appareils connectés

Les accessoires doivent vérifier en permanence les appareils Android connectés. Lorsqu'un appareil est connecté, l'accessoire doit déterminer si l'appareil prend en charge le mode accessoire.

Déterminer la prise en charge du mode accessoire

Remarque : le débogage USB n'est pas requis pour connecter des accessoires, mais ADB peut être nécessaire pendant le développement. Pour plus de détails, consultez Considérations sur le débogage .

Lorsqu'un appareil Android se connecte, il peut se trouver dans l'un des trois états suivants :

  • Prend en charge le mode accessoire Android et est déjà en mode accessoire.
  • Prend en charge le mode accessoire Android mais ce n'est pas en mode accessoire.
  • Ne prend pas en charge le mode accessoire Android.

Lors de la connexion initiale, l'accessoire doit vérifier la version, l'ID du fournisseur et l'ID du produit du descripteur de périphérique USB du périphérique connecté. L'ID du fournisseur doit correspondre à l'ID de Google ( 0x18D1 ). Si l'appareil est déjà en mode accessoire, l'ID du produit doit être 0x2D00 ou 0x2D01 et l'accessoire peut établir une communication avec l'appareil via des points de terminaison de transfert en masse en utilisant son propre protocole de communication (l'appareil n'a pas besoin d'être démarré en mode accessoire).

Remarque : 0x2D00 est réservé aux appareils Android prenant en charge le mode accessoire. 0x2D01 est réservé aux appareils prenant en charge le mode accessoire ainsi que le protocole Android Debug Bridge (ADB), qui expose une deuxième interface avec deux points de terminaison en masse pour ADB. Vous pouvez utiliser ces points de terminaison pour déboguer l'application accessoire si vous simulez l'accessoire sur un ordinateur. En général, n'utilisez pas cette interface à moins que l'accessoire n'implémente un relais vers ADB sur l'appareil.

Si la version, l'ID du fournisseur ou l'ID du produit dans le descripteur du périphérique USB ne correspondent pas aux valeurs attendues, l'accessoire ne peut pas déterminer s'il prend en charge le mode accessoire Android. L'accessoire doit tenter de démarrer l'appareil en mode accessoire (détaillé ci-dessous) pour déterminer la prise en charge de l'appareil.

Point clé : un accessoire USB doit envoyer un en-tête lors de la première prise de contact. L'en-tête contient le fabricant, le modèle et la version. Bien que la version soit un champ facultatif, si une application Android installée correspond uniquement à la version, mais que l'accessoire n'envoie pas de version, les appareils Android fonctionnant sous Android 10 et versions antérieures redémarreront en raison d'une exception levée dans le processus système.

Tentative de démarrage en mode accessoire

Si la version, le fournisseur et les identifiants de produit ne correspondent pas à un appareil Android en mode accessoire, l'accessoire ne peut pas déterminer si l'appareil prend en charge (mais n'est pas en) le mode accessoire ou s'il ne prend pas en charge le mode accessoire. Cela peut se produire parce que les appareils qui prennent en charge le mode accessoire (mais qui ne sont pas en mode accessoire) signalent initialement les ID de fournisseur et de produit du fabricant de l'appareil au lieu des ID de fournisseur et de produit AOA .

L'accessoire doit essayer de démarrer l'appareil en mode accessoire pour déterminer si l'appareil prend en charge ce mode :

  1. Envoyez une demande de contrôle 51 (« Get Protocol ») pour déterminer si l'appareil prend en charge le protocole accessoire Android. Si l'appareil prend en charge le protocole, il renvoie un nombre différent de zéro qui représente la version du protocole prise en charge. La demande de contrôle se trouve sur le point final 0 avec les caractéristiques suivantes :
    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. Si l'appareil renvoie une version de protocole prise en charge, envoyez une demande de contrôle avec les informations de chaîne d'identification à l'appareil. Ces informations permettent à l'appareil de déterminer une application appropriée pour l'accessoire (ou de présenter une URL à l'utilisateur si une application appropriée n'existe pas). La demande de contrôle se trouve sur le point de terminaison 0 (pour chaque ID de chaîne) avec les caractéristiques suivantes :
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    Les ID de chaîne suivants sont pris en charge, avec une taille maximale de 256 octets pour chaque chaîne (doivent se terminer par zéro avec \0 ).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Envoyez une demande de contrôle pour demander à l'appareil de démarrer en mode accessoire. La demande de contrôle se trouve sur le point final 0 avec les caractéristiques suivantes :
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

Après avoir terminé ces étapes, l'accessoire doit attendre que le périphérique USB connecté se réintroduise sur le bus en mode accessoire, puis réénumérer les périphériques connectés. L'algorithme détermine la prise en charge du mode accessoire en vérifiant les identifiants du fournisseur et du produit, qui doivent être corrects (par exemple, correspondre aux identifiants du fournisseur et du produit de Google au lieu des identifiants du fabricant de l'appareil) si l'appareil est passé avec succès en mode accessoire. Si les identifiants et la version sont corrects, l'accessoire se déplace pour établir la communication avec l'appareil .

Remarque : AOA ne prend actuellement pas en charge les connexions AOA et MTP simultanées. Pour passer de l'AOA au MTP, l'accessoire doit d'abord déconnecter le périphérique USB (soit physiquement, soit de manière électriquement équivalente), puis se reconnecter via MTP.

Si une étape échoue, l'accessoire détermine que l'appareil ne prend pas en charge le mode accessoire Android et attend que le prochain appareil se connecte.

Établir la communication avec l'appareil

Si l'accessoire détecte un appareil Android en mode accessoire, l'accessoire peut interroger l'interface de l'appareil et les descripteurs de point de terminaison pour obtenir les points de terminaison en masse pour communiquer avec l'appareil.

Le nombre d'interfaces et de points de terminaison en bloc dépend de l'ID du produit. Un appareil Android avec un ID de produit :

  • 0x2D00 possède une interface avec deux points de terminaison en bloc pour la communication d’entrée et de sortie.
  • 0x2D01 dispose de deux interfaces avec deux points de terminaison en bloc chacun pour la communication d'entrée et de sortie. La première interface gère la communication standard et la deuxième interface gère la communication ADB. Pour utiliser une interface, localisez les premiers points de terminaison d'entrée et de sortie en bloc, définissez la configuration de l'appareil sur une valeur de 1 avec une requête de périphérique SET_CONFIGURATION ( 0x09 ), puis communiquez à l'aide des points de terminaison.