Android Open Accessory Protocol 1.0

Android-USB-Zubehör muss dem Android Open Accessory (AOA)-Protokoll entsprechen, das definiert, wie ein Zubehör die Kommunikation mit einem Android-betriebenen Gerät erkennt und einrichtet. Zubehör sollte die folgenden Schritte ausführen:

  1. Warten Sie auf ein verbundenes Gerät und erkennen Sie es.
  2. Ermitteln Sie die Zubehörmodusunterstützung 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 implementieren.

Auf angeschlossene Geräte warten und erkennen

Zubehör sollte kontinuierlich nach verbundenen Android-Geräten suchen. Wenn ein Gerät angeschlossen wird, sollte das Zubehör bestimmen, ob das Gerät den Zubehörmodus unterstützt.

Bestimmen Sie die Unterstützung des Zubehörmodus

Wenn ein Android-betriebenes 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 Google-ID ( 0x18D1 ) übereinstimmen. Wenn sich das Gerät bereits im Zubehörmodus befindet, sollte die Produkt-ID 0x2D00 oder 0x2D01 und das Zubehör kann die Kommunikation mit dem Gerät über Bulk-Transfer-Endpunkte mithilfe seines eigenen Kommunikationsprotokolls herstellen (das Gerät muss nicht im Zubehörmodus gestartet werden).

Hinweis: 0x2D00 ist für Android-betriebene 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 Bulk-Endpunkten für ADB verfügbar macht. 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 nur, wenn das Zubehör einen Passthrough zu ADB auf dem Gerät implementiert.

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 feststellen, ob das Gerät den Android-Zubehörmodus unterstützt. Das Zubehör sollte versuchen, das Gerät im Zubehörmodus (siehe unten) zu starten, um die Geräteunterstützung zu bestimmen.

Kernpunkt: Ein USB-Zubehör muss beim ersten Handshake einen Header senden. Der Header enthält Hersteller, Modell und Version. Version ist zwar ein optionales Feld, aber wenn eine Android-App installiert ist, die nur mit der Version übereinstimmt, das Zubehör jedoch keine Version sendet, werden Android-Geräte mit Android 10 und darunter neu gestartet, da im Systemprozess eine Ausnahme ausgelöst wird.

Versuchen Sie, im Zubehörmodus zu starten

Wenn die Versions-, Anbieter- und Produkt-IDs nicht mit einem Android-betriebenen Gerät im Zubehörmodus übereinstimmen, kann das Zubehör nicht feststellen, 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 (aber sich nicht im Zubehörmodus befinden), zunächst die Anbieter- und Produkt-IDs des Geräteherstellers 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 befindet sich 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 Steueranfrage mit identifizierenden Zeichenfolgeninformationen an das Gerät. Diese Informationen ermöglichen es dem Gerät, eine geeignete Anwendung für das Zubehör zu bestimmen (oder dem Benutzer eine URL anzuzeigen, wenn keine geeignete Anwendung vorhanden ist). Die Steuerungsanforderung befindet sich am Endpunkt 0 (für jede Zeichenfolgen-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 werden).

    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 befindet sich auf Endpunkt 0 mit den folgenden Merkmalen:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

Nachdem Sie diese Schritte ausgeführt haben, sollte das Zubehör warten, bis sich das angeschlossene USB-Gerät wieder im Zubehörmodus am Bus anmeldet, und dann die angeschlossenen Geräte erneut auflisten. Der Algorithmus bestimmt die Unterstützung des Zubehörmodus, indem er die Anbieter- und Produkt-IDs überprüft, die korrekt sein sollten (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, bewegt sich das Zubehör, um die Kommunikation mit dem Gerät herzustellen .

Hinweis: AOA unterstützt derzeit keine gleichzeitigen AOA- und MTP-Verbindungen. Um von AOA zu MTP zu wechseln, muss das Zubehör zuerst das USB-Gerät trennen (entweder physisch oder auf elektrisch gleichwertige Weise) und dann über MTP erneut verbinden.

Wenn ein Schritt fehlschlägt, stellt das Zubehör fest, dass das Gerät den Android-Zubehörmodus nicht unterstützt, und wartet darauf, dass das nächste Gerät eine Verbindung herstellt.

Kommunikation mit dem Gerät aufbauen

Wenn das Zubehör ein Android-betriebenes Gerät im Zubehörmodus erkennt, kann das Zubehör die Geräteschnittstelle und die Endpunktdeskriptoren abfragen, um die Massenendpunkte für die Kommunikation mit dem Gerät abzurufen.

Die Anzahl der Schnittstellen und Massenendpunkte hängt von der Produkt-ID ab. Ein Android-betriebenes Gerät mit einer Produkt-ID von:

  • 0x2D00 hat eine Schnittstelle mit zwei Bulk-Endpunkten für die Eingabe- und Ausgabekommunikation.
  • 0x2D01 hat zwei Schnittstellen mit jeweils zwei Bulk-Endpunkten für die Ein- und Ausgabekommunikation. Die erste Schnittstelle verarbeitet die Standardkommunikation und die zweite Schnittstelle die ADB-Kommunikation. Um eine Schnittstelle zu verwenden, suchen Sie die ersten Masseneingabe- und -ausgabeendpunkte, setzen Sie die Gerätekonfiguration mit einer SET_CONFIGURATION ( 0x09 )-Geräteanforderung auf den Wert 1 und kommunizieren Sie dann über die Endpunkte.