Android Open Accessory Protocol 2.0

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

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

Android SDK-APIs, die Android-Anwendungsentwicklern zur Verfügung stehen, bleiben unverändert.

AOAv2-Unterstützung erkennen

Um festzustellen, ob ein angeschlossenes Android-Gerät Zubehör und die unterstützte Protokollversion unterstützt, muss ein Zubehör einen Befehl getProtocol() 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 Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp 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 Zum Debuggen 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 auf 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.

Audio-Unterstützung

AOAv2 unterstützt die Audioausgabe von einem Android-Gerät an ein Zubehör über eine Standard-USB-Audioklassenschnittstelle, die 2-Kanal-16-Bit-PCM-Audio mit einer Bitrate von 44100 kHz unterstützt (zusätzliche 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 gesendet werden, bevor der Befehl ACCESSORY_START zum ACCESSORY_START des ACCESSORY_START gesendet wird.

HID-Unterstützung

Mit AOAv2 kann Zubehör ein oder mehrere USB Human Interface Devices (HID) bei einem Android-Gerät registrieren. 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 (dh einen Personal Computer) angeschlossen ist. In AOA kann der USB-Host jedoch 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 als beliebiges HID-Gerät (Maus, Tastatur, Gamecontroller usw.) fungieren kann. Sie können die HID-Unterstützung verwenden, um grundlegende Funktionen wie eine Wiedergabe- / Pause-Taste auf einem Mediendock oder erweiterte Funktionen wie eine Dockingstation mit einer Maus und einer vollständigen QWERTZ-Tastatur bereitzustellen.

AOAv2 fügt dem Android-Gerät neue USB-Steuerungsanforderungen hinzu, mit denen das Zubehör als ein oder mehrere HID-Eingabegeräte fungieren kann. Die HID-Unterstützung wird vollständig über Steuerungsanforderungen auf Endpunkt Null abgewickelt, sodass keine neue USB-Schnittstelle erforderlich ist. Die vier neuen Steuerungsanforderungen sind:

  • ACCESSORY_REGISTER_HID registriert ein neues HID-Gerät beim Android-Gerät. Das Zubehör enthält eine ID, mit der das HID-Gerät für die anderen drei Anrufe identifiziert wird. Diese ID ist gültig, bis die USB-Verbindung getrennt wird oder bis das Zubehör ACCESSORY_UNREGISTER_HID sendet, um die Registrierung des HID-Geräts ACCESSORY_UNREGISTER_HID .
  • ACCESSORY_UNREGISTER_HID hebt die Registrierung eines zuvor bei ACCESSORY_REGISTER_HID registrierten HID-Geräts auf.
  • ACCESSORY_SET_HID_REPORT_DESC sendet einen Berichtsdeskriptor für ein HID-Gerät an das Android-Gerät. Diese Anforderung wird verwendet, um die Funktionen des HID-Geräts zu beschreiben. Sie 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 Steuerungsanforderungen 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, damit das Zubehör mit dem Android-Betriebssystem selbst (insbesondere den Audio- und Eingabesystemen) kommunizieren kann. Das Design von AOAv2 ermöglicht es, ein Zubehör zu erstellen, das zusätzlich zum ursprünglichen Funktionsumfang die neue Audio- und HID-Unterstützung verwendet. Verwenden 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 verwendet, jedoch nicht mit einer Anwendung auf dem Android-Gerät kommuniziert. Für dieses Zubehör müssen Benutzer keine Dialogansagen erhalten, um das neu angehängte Zubehör zu finden und mit einer Android-Anwendung zu verknüpfen, die mit ihm kommunizieren kann.

Um solche Dialoge nach dem Verbinden eines Zubehörs zu unterdrücken, 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 für die 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 gewechselt ist.