Android-USB-Zubehör muss dem Android Open Accessoire (AOA)-Protokoll entsprechen, das definiert, wie ein Zubehör ein Android-Gerät erkennt und die Kommunikation mit ihm einrichtet. Zubehör sollte die folgenden Schritte ausführen:
- Warten Sie auf ein angeschlossenes Gerät und erkennen Sie es.
- Bestimmen Sie die Unterstützung des Zubehörmodus des Geräts.
- Versuchen Sie, das Gerät im Zubehörmodus zu starten (falls erforderlich).
- Wenn das Gerät AOA unterstützt, stellen Sie die Kommunikation mit dem Gerät her.
In den folgenden Abschnitten wird erläutert, wie Sie diese Schritte umsetzen.
Warten Sie auf angeschlossene Geräte und erkennen Sie diese
Zubehörteile sollten kontinuierlich nach angeschlossenen Android-Geräten suchen. Wenn ein Gerät angeschlossen ist, sollte das Zubehör ermitteln, ob das Gerät den Zubehörmodus unterstützt.
Bestimmen Sie die Unterstützung des Zubehörmodus
Hinweis: Für den Anschluss von Zubehör ist kein USB-Debugging erforderlich, während der Entwicklung kann jedoch ADB erforderlich sein. Einzelheiten finden Sie unter Überlegungen zum Debuggen .
Wenn ein Android-Gerät eine Verbindung herstellt, kann es sich in einem von drei Zuständen befinden:
- Unterstützt den Android-Zubehörmodus und befindet sich bereits im Zubehörmodus.
- Unterstützt den Android-Zubehörmodus, befindet sich jedoch nicht im Zubehörmodus.
- Unterstützt den Android-Zubehörmodus nicht.
Während der ersten Verbindung sollte das Zubehör die Version, Hersteller-ID und Produkt-ID des USB-Gerätedeskriptors des angeschlossenen Geräts überprüfen. Die Anbieter-ID sollte mit der ID von Google ( 0x18D1
) übereinstimmen. Wenn sich das Gerät bereits im Zubehörmodus befindet, sollte die Produkt-ID 0x2D00
oder 0x2D01
lauten und das Zubehör kann mithilfe seines eigenen Kommunikationsprotokolls über Massenübertragungsendpunkte mit dem Gerät kommunizieren (das Gerät muss nicht im Zubehörmodus gestartet werden).
Hinweis: 0x2D00
ist für Android-Geräte reserviert, die den Zubehörmodus unterstützen. 0x2D01
ist für Geräte reserviert, die den Zubehörmodus sowie das Android Debug Bridge (ADB)-Protokoll unterstützen, das eine zweite Schnittstelle mit zwei Massenendpunkten für ADB bereitstellt. Sie können diese Endpunkte zum Debuggen der Zubehöranwendung verwenden, wenn Sie das Zubehör auf einem Computer simulieren. Verwenden Sie diese Schnittstelle im Allgemeinen nicht, es sei denn, das Zubehör implementiert einen Passthrough zu ADB auf dem Gerät.
Wenn die Version, die Hersteller-ID oder die Produkt-ID im USB-Gerätedeskriptor nicht mit den erwarteten Werten übereinstimmen, kann das Zubehör nicht ermitteln, ob das Gerät den Android-Zubehörmodus unterstützt. Das Zubehör sollte versuchen, das Gerät im Zubehörmodus zu starten (siehe unten), um die Geräteunterstützung zu ermitteln.
Kernpunkt: Ein USB-Zubehör muss beim ersten Handshake einen Header senden. Der Header enthält den Hersteller, das Modell und die Version. Obwohl die Version ein optionales Feld ist, werden Android-Geräte, die unter Android 10 und niedriger ausgeführt werden, neu gestartet, wenn eine Android-App installiert ist, die nur mit der Version übereinstimmt, das Zubehör jedoch keine Version sendet, da im Systemprozess eine Ausnahme ausgelöst wird.
Versuchen Sie, im Zubehörmodus zu starten
Wenn Version, Hersteller und Produkt-IDs nicht mit einem Android-Gerät im Zubehörmodus übereinstimmen, kann das Zubehör nicht ermitteln, ob das Gerät den Zubehörmodus unterstützt (sich aber nicht im Zubehörmodus befindet) oder ob das Gerät den Zubehörmodus nicht unterstützt. Dies kann auftreten, weil Geräte, die den Zubehörmodus unterstützen (sich aber nicht im Zubehörmodus befinden), zunächst die Hersteller- und Produkt-IDs des Geräts anstelle der AOA- Anbieter- und Produkt-IDs melden.
Das Zubehör sollte versuchen, das Gerät im Zubehörmodus zu starten, um festzustellen, ob das Gerät diesen Modus unterstützt:
- Senden Sie eine 51-Steuerungsanforderung („Get Protocol“), um festzustellen, ob das Gerät das Android-Zubehörprotokoll unterstützt. Wenn das Gerät das Protokoll unterstützt, gibt es eine Zahl ungleich Null zurück, die die unterstützte Protokollversion darstellt. Die Steuerungsanforderung erfolgt auf Endpunkt 0 mit den folgenden Merkmalen:
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)
- Wenn das Gerät eine unterstützte Protokollversion zurückgibt, senden Sie eine Steuerungsanforderung mit identifizierenden Zeichenfolgeninformationen an das Gerät. Anhand dieser Informationen kann das Gerät eine geeignete Anwendung für das Zubehör ermitteln (oder dem Benutzer eine URL anzeigen, wenn keine geeignete Anwendung vorhanden ist). Die Steuerungsanforderung erfolgt am Endpunkt 0 (für jede String-ID) mit den folgenden Merkmalen:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
Die folgenden String-IDs werden unterstützt, mit einer maximalen Größe von 256 Byte für jeden String (muss mit
\0
nullterminiert sein).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Senden Sie eine Steuerungsanforderung, um das Gerät aufzufordern, im Zubehörmodus zu starten. Die Steuerungsanforderung erfolgt auf Endpunkt 0 mit den folgenden Merkmalen:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
Nach Abschluss dieser Schritte sollte das Zubehör warten, bis sich das angeschlossene USB-Gerät im Zubehörmodus erneut am Bus vorstellt, und dann die angeschlossenen Geräte neu auflisten. Der Algorithmus bestimmt die Unterstützung des Zubehörmodus , indem er die Anbieter- und Produkt-IDs überprüft. Diese sollten korrekt sein (z. B. den Anbieter- und Produkt-IDs von Google statt den IDs des Geräteherstellers entsprechen), wenn das Gerät erfolgreich in den Zubehörmodus gewechselt ist. Wenn IDs und Version korrekt sind, stellt das Zubehör die Kommunikation mit dem Gerät her .
Hinweis: AOA unterstützt derzeit keine gleichzeitigen AOA- und MTP-Verbindungen. Um von AOA zu MTP zu wechseln, muss das Zubehör zunächst das USB-Gerät trennen (entweder physisch oder auf eine elektrisch äquivalente Weise) und dann mithilfe von MTP erneut eine Verbindung herstellen.
Wenn ein Schritt fehlschlägt, stellt das Zubehör fest, dass das Gerät den Android-Zubehörmodus nicht unterstützt, und wartet, bis das nächste Gerät eine Verbindung herstellt.
Stellen Sie die Kommunikation mit dem Gerät her
Wenn das Zubehör ein Android-Gerät im Zubehörmodus erkennt, kann das Zubehör die Geräteschnittstelle und Endpunktdeskriptoren abfragen, um die Massenendpunkte für die Kommunikation mit dem Gerät zu erhalten.
Die Anzahl der Schnittstellen und Massenendpunkte hängt von der Produkt-ID ab. Ein Android-Gerät mit der Produkt-ID:
-
0x2D00
verfügt über eine Schnittstelle mit zwei Massenendpunkten für die Eingabe- und Ausgabekommunikation. -
0x2D01
verfügt über zwei Schnittstellen mit jeweils zwei Massenendpunkten für die Eingabe- und Ausgabekommunikation. Die erste Schnittstelle übernimmt die Standardkommunikation und die zweite Schnittstelle die ADB-Kommunikation. Um eine Schnittstelle zu verwenden, suchen Sie die ersten Masseneingabe- und -ausgabeendpunkte, legen Sie die Gerätekonfiguration mit einerSET_CONFIGURATION
(0x09
)-Geräteanforderung auf den Wert 1 fest und kommunizieren Sie dann über die Endpunkte.