Les accessoires USB Android doivent respecter le protocole Android Open Accessory (AOA), qui définit la manière dont un accessoire détecte et configure la communication avec un appareil Android. Les accessoires doivent effectuer les étapes suivantes:
- Attendez et détectez un appareil connecté.
- Déterminez si l'appareil est compatible avec le mode accessoire.
- Essayez de démarrer l'appareil en mode accessoire (si nécessaire).
- Si l'appareil est compatible avec AOA, établissez une communication avec lui.
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 s'il est compatible avec le mode accessoire.
Déterminer la prise en charge du mode accessoire
Remarque:Le débogage USB n'est pas nécessaire pour connecter des accessoires, mais ADB peut être nécessaire pendant le développement. Pour en savoir plus, consultez la section Considérations concernant le débogage.
Lorsqu'un appareil Android se connecte, il peut être dans l'un des trois états suivants:
- Compatible avec le mode accessoire Android et déjà en mode accessoire.
- Compatible avec le mode accessoire Android, mais n'est pas en mode accessoire.
- Non compatible avec 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 l'appareil USB connecté. L'ID du fournisseur doit correspondre à celui 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 groupé à l'aide de 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 compatibles avec le mode accessoire. 0x2D01
est réservé aux appareils compatibles avec le mode accessoire et le protocole Android Debug Bridge (ADB), qui expose une deuxième interface avec deux points de terminaison groupés pour ADB. Vous pouvez utiliser ces points de terminaison pour déboguer l'application de l'accessoire si vous simulez l'accessoire sur un ordinateur. En règle générale, n'utilisez pas cette interface, sauf si l'accessoire implémente un passthrough vers ADB sur l'appareil.
Si la version, l'ID du fournisseur ou l'ID du produit du descripteur de l'appareil USB ne correspondent pas aux valeurs attendues, l'accessoire ne peut pas déterminer si l'appareil est compatible avec le mode accessoire Android. L'accessoire doit tenter de démarrer l'appareil en mode accessoire (décrit ci-dessous) pour déterminer la compatibilité de l'appareil.
Point clé : Un accessoire USB doit envoyer un en-tête lors de l'établissement initial de la liaison. 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 et qu'elle ne correspond qu'à la version, mais que l'accessoire n'envoie pas de version, les appareils Android exécutant Android 10 ou version antérieure redémarrent en raison d'une exception générée dans le processus système.
Tentative de démarrage en mode accessoire
Si les ID de version, de fournisseur et de produit ne correspondent pas à un appareil Android en mode accessoire, l'accessoire ne peut pas déterminer si l'appareil est compatible avec le mode accessoire (mais ne l'est pas) ou s'il n'est pas compatible avec le mode accessoire. Cela peut se produire, car les appareils compatibles avec le mode accessoire (mais qui ne sont pas en mode accessoire) signalent initialement le fournisseur et les ID de produit du fabricant de l'appareil au lieu du fournisseur et des ID de produit de l'AOA.
L'accessoire doit essayer de démarrer l'appareil en mode accessoire pour déterminer s'il est compatible avec ce mode:
- Envoyez une requête de contrôle 51 ("Get Protocol") pour déterminer si l'appareil est compatible avec le protocole d'accessoire Android. Si l'appareil est compatible avec le protocole, il renvoie un nombre non nul représentant la version du protocole compatible.
La requête de contrôle se trouve 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 compatible, envoyez-lui une requête de contrôle avec des informations de chaîne d'identification. 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 requête 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 acceptés, avec une taille maximale de 256 octets pour chaque chaîne (ils doivent être terminés par un zéro avec
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Envoyez une requête de contrôle pour demander à l'appareil de démarrer en mode accessoire. La requête de contrôle se trouve 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
Une fois ces étapes terminées, l'accessoire doit attendre que l'appareil USB connecté se réintroduise sur le bus en mode accessoire, puis rénumérer les appareils connectés. L'algorithme détermine la compatibilité avec le mode accessoire en vérifiant les ID du fournisseur et du produit, qui doivent être corrects (par exemple, correspondre aux ID du fournisseur et du produit de Google plutôt qu'aux ID du fabricant de l'appareil) si l'appareil est passé en mode accessoire. Si les ID et la version sont corrects, l'accessoire passe à l'étape d'établissement de la communication avec l'appareil.
Remarque:L'AOA n'est pas compatible avec les connexions AOA et MTP simultanées pour le moment. Pour passer d'AOA à MTP, l'accessoire doit d'abord déconnecter l'appareil USB (physiquement ou de manière électrique équivalente), puis le reconnecter à l'aide de MTP.
Si une étape échoue, l'accessoire détermine que l'appareil n'est pas compatible avec le mode accessoire Android et attend que l'appareil suivant se connecte.
Établir une communication avec l'appareil
Si l'accessoire détecte un appareil Android en mode accessoire, il peut interroger l'interface de l'appareil et les descripteurs de point de terminaison pour obtenir les points de terminaison groupés permettant de communiquer avec l'appareil.
Le nombre d'interfaces et de points de terminaison groupés dépend de l'ID produit. Un appareil Android avec l'ID produit suivant:
0x2D00
possède une interface avec deux points de terminaison groupés pour la communication d'entrée et de sortie.0x2D01
possède deux interfaces avec deux points de terminaison groupés chacun pour la communication d'entrée et de sortie. La première interface gère la communication standard et la seconde gère la communication ADB. Pour utiliser une interface, recherchez les premiers points de terminaison d'entrée et de sortie groupés, définissez la configuration de l'appareil sur une valeur de 1 avec une requête d'appareilSET_CONFIGURATION
(0x09
), puis communiquez à l'aide des points de terminaison.