Android Open Access 2.0

Dieses Dokument beschreibt Änderungen im Android Open Accessoire (AOA)-Protokoll seit seiner ersten Veröffentlichung und ergänzt die AOA 1.0-Dokumentation . AOAv2 fügt die folgenden Funktionen hinzu:

  • Audioausgabe (veraltet in Android 8.0).
  • Unterstützung für das Zubehör, das als ein oder mehrere Human Interface Devices (HIDs) für das Android-Gerät fungiert.

Die für Android-Anwendungsentwickler verfügbaren Android SDK-APIs bleiben unverändert.

AOAv2-Unterstützung wird erkannt

Um festzustellen, ob ein verbundenes Android-Gerät Zubehör und die unterstützte Protokollversion unterstützt, muss ein Zubehör einen getProtocol() Befehl senden und das Ergebnis überprüfen. Android-Geräte, die nur die Funktionen in AOAv1 unterstützen, müssen 1 als Protokollversion zurückgeben; Geräte, die die zusätzlichen Funktionen in AOAv2 unterstützen, müssen 2 als Protokollversion zurückgeben. AOAv2 ist abwärtskompatibel mit AOAv1, sodass Zubehör, das für das ursprüngliche Zubehörprotokoll entwickelt wurde, weiterhin mit neueren Android-Geräten funktioniert.

Das folgende Beispiel aus der Quellcodebibliothek des Accessoire Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) demonstriert diese Protokollprüfung:

bool AndroidAccessory::switchDevice(byte addr)
{
    int protocol = getProtocol(addr);
    if (protocol >= 1) {
        Serial.print("device supports protocol 1 or higher\n");
    } else {
        Serial.print("could not read device protocol version\n");
        return false;
    }

    sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
    sendString(addr, ACCESSORY_STRING_MODEL, model);
    sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
    sendString(addr, ACCESSORY_STRING_VERSION, version);
    sendString(addr, ACCESSORY_STRING_URI, uri);
    sendString(addr, ACCESSORY_STRING_SERIAL, serial);

    usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR |
                USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL);
    return true;
}

AOAv2 enthält neue USB-Produkt-IDs für jede Kombination von USB-Schnittstellen, die im Zubehörmodus verfügbar sind:

Ausführung Produkt ID Kommunikation Beschreibung
AOAv1 0x2D00 Zubehörteil Bietet zwei Massenendpunkte für die Kommunikation mit einer Android-Anwendung.
0x2D01 Zubehör + Adb Zu Debugzwecken während der Zubehörentwicklung. Nur verfügbar, wenn der Benutzer das USB-Debugging in den Android-Geräteeinstellungen aktiviert hat.
AOAv2 0x2D02 Audio- Zum Streamen von Audio von einem Android-Gerät an ein Zubehör.
0x2D03 Audio + Adb
0x2D04 Zubehör + Audio
0x2D05 Zubehör + Audio + Adb

In AOAv1 verwendete Produkt-IDs ( 0x2D00 und 0x2D01 ) werden in AOAv2 weiterhin unterstützt.

Audiounterstützung

AOAv2 bietet Unterstützung für die Audioausgabe von einem Android-Gerät an ein Zubehör über eine standardmäßige USB-Audioklasse-Schnittstelle, die 2-Kanal-16-Bit-PCM-Audio mit einer Bitrate von 44.100 kHz unterstützt (weitere Audiomodi können in Zukunft hinzugefügt werden).

Um die Audiounterstützung zu aktivieren, muss das Zubehör eine neue USB-Steuerungsanforderung senden:

**SET_AUDIO_MODE**
requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        58
value:          0 for no audio (default),
                1 for 2 channel, 16-bit PCM at 44100 KHz
index:          0
data            none

Dieser Befehl muss vor dem Senden des ACCESSORY_START Befehls zum Aufrufen des Zubehörmodus gesendet werden.

HID-Unterstützung

AOAv2 ermöglicht Zubehör die Registrierung eines oder mehrerer USB Human Interface Devices (HID) bei einem Android-Gerät. Dieser Ansatz kehrt die Kommunikationsrichtung für typische USB-HID-Geräte wie USB-Mäuse und -Tastaturen um. Normalerweise ist das HID-Gerät ein Peripheriegerät, das an einen USB-Host (z. B. einen Personalcomputer) angeschlossen ist, aber bei AOA kann der USB-Host als ein oder mehrere Eingabegeräte für ein USB-Peripheriegerät fungieren.

Die HID-Unterstützung ist ein Proxy für Standard-HID-Ereignisse. Die Implementierung macht keine Annahmen über den Inhalt oder die Art der Ereignisse und leitet sie einfach an das Eingabesystem weiter, sodass ein AOAv2-Zubehör wie ein beliebiges HID-Gerät (Maus, Tastatur, Gamecontroller usw.) fungieren kann. Sie können die HID-Unterstützung nutzen, um grundlegende Funktionen bereitzustellen, beispielsweise eine Wiedergabe-/Pause-Taste auf einem Mediendock, oder um erweiterte Funktionen bereitzustellen, beispielsweise eine Dockingstation mit einer Maus und einer vollständigen QWERTZ-Tastatur.

AOAv2 fügt neue USB-Steuerungsanforderungen hinzu, die es dem Zubehör ermöglichen, als ein oder mehrere HID-Eingabegeräte für das Android-Gerät zu fungieren. Die HID-Unterstützung wird vollständig über Kontrollanfragen am Endpunkt Null abgewickelt, sodass keine neue USB-Schnittstelle erforderlich ist. Die vier neuen Kontrollanforderungen sind:

  • ACCESSORY_REGISTER_HID registriert ein neues HID-Gerät beim Android-Gerät. Das Zubehör stellt eine ID zur Verfügung, mit der das HID-Gerät für die anderen drei Anrufe identifiziert wird. Diese ID ist gültig, bis USB die Verbindung trennt oder bis das Zubehör ACCESSORY_UNREGISTER_HID sendet, um die Registrierung des HID-Geräts aufzuheben.
  • ACCESSORY_UNREGISTER_HID hebt die Registrierung eines HID-Geräts auf, das zuvor bei ACCESSORY_REGISTER_HID registriert wurde.
  • ACCESSORY_SET_HID_REPORT_DESC sendet einen Berichtsdeskriptor für ein HID-Gerät an das Android-Gerät. Diese Anfrage dient zur Beschreibung der Funktionen des HID-Geräts und muss gesendet werden, bevor HID-Ereignisse an das Android-Gerät gemeldet werden. Wenn der Berichtsdeskriptor größer als die maximale Paketgröße für Endpunkt Null ist, werden mehrere ACCESSORY_SET_HID_REPORT_DESC Befehle gesendet, um den gesamten Deskriptor zu übertragen.
  • ACCESSORY_SEND_HID_EVENT sendet Eingabeereignisse vom Zubehör an das Android-Gerät.

Die Codedefinitionen für die neuen Kontrollanforderungen sind:

/* Control request for registering a HID device.
 * Upon registering, a unique ID is sent by the accessory in the
 * value parameter. This ID will be used for future commands for
 * the device
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID_DEVICE
 *  value:          Accessory assigned ID for the HID device
 *  index:          total length of the HID report descriptor
 *  data            none
 */
#define ACCESSORY_REGISTER_HID         54

/* Control request for unregistering a HID device.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            none
 */
#define ACCESSORY_UNREGISTER_HID         55

/* Control request for sending the HID report descriptor.
 * If the HID descriptor is longer than the endpoint zero max packet size,
 * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
 * commands. The data for the descriptor must be sent sequentially
 * if multiple packets are needed.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SET_HID_REPORT_DESC
 *  value:          Accessory assigned ID for the HID device
 *  index:          offset of data in descriptor
 *                      (needed when HID descriptor is too big for one packet)
 *  data            the HID report descriptor
 */
#define ACCESSORY_SET_HID_REPORT_DESC         56

/* Control request for sending HID events.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SEND_HID_EVENT
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            the HID report for the event
 */
#define ACCESSORY_SEND_HID_EVENT         57

Interoperabilität mit AOAv1

Das ursprüngliche Protokoll ( AOAv1 ) unterstützt eine Android-Anwendung für die direkte Kommunikation mit einem USB-Host (Zubehör) über USB. AOAv2 setzt diese Unterstützung fort und fügt neue Funktionen hinzu, die es dem Zubehör ermöglichen, mit dem Android-Betriebssystem selbst (insbesondere den Audio- und Eingabesystemen) zu kommunizieren. Das Design von AOAv2 ermöglicht es, ein Zubehörteil zu bauen, das zusätzlich zum ursprünglichen Funktionsumfang die neue Audio- und HID-Unterstützung nutzt. Nutzen Sie einfach die neuen Funktionen zusammen mit den ursprünglichen Funktionen.

AOAv2 ohne Android-App verbinden

Sie können ein Zubehör (z. B. ein Audio-Dock) entwerfen, das Audio- und HID-Unterstützung nutzt, aber nicht mit einer Anwendung auf dem Android-Gerät kommuniziert. Für diese Zubehörteile müssen Benutzer keine Dialogaufforderungen erhalten, um das neu angeschlossene Zubehörteil zu finden und mit einer Android-Anwendung zu verknüpfen, die mit ihm kommunizieren kann.

Um solche Dialoge zu unterdrücken, nachdem ein Zubehör eine Verbindung hergestellt hat, kann das Zubehör festlegen, dass die Hersteller- und Modellnamen nicht an das Android-Gerät gesendet werden. Wenn diese Zeichenfolgen nicht für das Android-Gerät bereitgestellt werden:

  • Das System versucht nicht, eine Anwendung zur Kommunikation mit dem Zubehör zu finden.
  • Die Zubehör-USB-Schnittstelle ist in der USB-Konfiguration des Android-Geräts nicht vorhanden, nachdem das Gerät in den Zubehörmodus wechselt.