Android Open Access 1.0

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:

  1. Warten Sie auf ein angeschlossenes Gerät und erkennen Sie es.
  2. Bestimmen Sie die Unterstützung des Zubehörmodus des Geräts.
  3. Versuchen Sie, das Gerät im Zubehörmodus zu starten (falls erforderlich).
  4. 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 (aber nicht im Zubehörmodus ist) 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:

  1. 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)
    
  2. 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
    
  3. 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 einer SET_CONFIGURATION ( 0x09 )-Geräteanforderung auf den Wert 1 fest und kommunizieren Sie dann über die Endpunkte.