Les accessoires USB Android doivent respecter le protocole Android Open Accessory (AOA), qui définit la façon dont un accessoire détecte et établit la communication avec un appareil Android. Les accessoires doivent suivre les étapes suivantes :
- Attendez et détectez un appareil connecté.
- Déterminez la prise en charge du mode accessoire de l'appareil.
- Essayez de démarrer l'appareil en mode accessoire (si nécessaire).
- Si l'appareil prend en charge l'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 rechercher 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
Lorsqu'un appareil Android se connecte, il peut être 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 il 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 de l'appareil connecté. L'ID du fournisseur doit correspondre à l'ID de Google ( 0x18D1
). Si l'appareil est déjà en mode accessoire, l'ID produit doit être 0x2D00
ou 0x2D01
et l'accessoire peut établir une communication avec l'appareil via des points de terminaison de transfert en bloc 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 sous Android prenant en charge le mode accessoire. 0x2D01
est réservé aux appareils qui prennent 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 de périphérique USB ne correspondent pas aux valeurs attendues, l'accessoire ne peut pas déterminer si le périphérique 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 prise de contact initiale. 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 est installée qui ne correspond qu'à la version, mais que l'accessoire n'envoie pas de version, les appareils Android fonctionnant sous Android 10 et inférieur 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 ID 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 si l'appareil 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 le fournisseur du fabricant de l' appareil et les ID de produit 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 :
- Envoyez une requête de contrôle 51 ("Get Protocol") pour déterminer si l'appareil prend en charge le protocole accessoire Android. Si le périphérique prend en charge le protocole, il renvoie un nombre différent de zéro qui représente la version de protocole prise en charge. La demande de contrôle est sur le point de terminaison 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)
- Si l'appareil renvoie une version de protocole prise en charge, envoyez une demande de contrôle avec des 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 est 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 (doit se terminer par zéro par
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Envoyez une demande de contrôle pour demander à l'appareil de démarrer en mode accessoire. La demande de contrôle est sur le point de terminaison 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éintroduit 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 d'AOA à 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 l'appareil suivant se connecte.
Établir la communication avec l'appareil
Si l'accessoire détecte un appareil alimenté par 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 de produit. Un appareil fonctionnant sous 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
a deux interfaces avec deux points de terminaison en bloc chacune pour la communication d'entrée et de sortie. La première interface gère la communication standard et la seconde 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 demande d'appareilSET_CONFIGURATION
(0x09
), puis communiquez à l'aide des points de terminaison.