In diesem Dokument werden Änderungen am Android Open Accessory (AOA)-Protokoll seit der Erstveröffentlichung beschrieben. Es ergänzt die AOA 1.0-Dokumentation. AOAv2 bietet folgende zusätzliche Funktionen:
- Audioausgabe (in Android 8.0 eingestellt)
- Unterstützung für das Zubehör, das als ein oder mehrere Human Interface Devices (HIDs) für das Android-Gerät dient.
Die für Android-App-Entwickler verfügbaren Android SDK APIs bleiben unverändert.
Unterstützung für AOAv2 erkennen
Um festzustellen, ob ein verbundenes Android-Gerät Zubehör und die unterstützte Protokollversion unterstützt, muss ein Zubehörgerät einen getProtocol()
-Befehl senden und das Ergebnis prü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. Daher funktionieren Zubehörteile, die für das ursprüngliche Protokoll für Zubehör entwickelt wurden, auch weiterhin mit neueren Android-Geräten.
Das folgende Beispiel aus der Accessory Development Kit 2011-Bibliothek (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) zeigt 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:
Version | Produkt-ID | Kommunikation | Beschreibung |
---|---|---|---|
AOAv1 | 0x2D00 |
Accessoires | Bietet zwei Bulk-Endpunkte für die Kommunikation mit einer Android-App. |
0x2D01 |
Zubehör + ADB | Für Debugging-Zwecke während der Entwicklung von Zubehör. Nur verfügbar, wenn der Nutzer die Option USB-Debugging in den Einstellungen des Android-Geräts aktiviert hat. | |
AOAv2 | 0x2D02 |
Audio | Zum Streamen von Audio von einem Android-Gerät auf ein Zubehörgerät. |
0x2D03 |
audio + adb | ||
0x2D04 |
Zubehör + Audio | ||
0x2D05 |
Zubehör + Audio + ADB |
Produkt-IDs, die in AOAv1 (0x2D00
und 0x2D01
) verwendet werden, 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 standardmäßige USB-Audio-Klassenschnittstelle, die 2-Kanal-16-Bit-PCM-Audio mit einer Bitrate von 44.100 kHz unterstützt. Weitere Audiomodi werden möglicherweise in Zukunft hinzugefügt.
Um die Audiounterstützung zu aktivieren, muss das Zubehör eine neue USB-Steuerungsanfrage 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 Befehls ACCESSORY_START
zum Wechseln in den Zubehörmodus gesendet werden.
HID-Unterstützung
Mit AOAv2 können Zubehörteile ein oder mehrere USB-HIDs (Human Interface Devices) bei einem Android-Gerät registrieren. Bei diesem Ansatz wird die Kommunikationsrichtung für typische USB-HID-Geräte wie USB-Mäuse und ‑Tastaturen umgekehrt. Normalerweise ist das HID-Gerät ein Peripheriegerät, das mit einem USB-Host (z. B. einem Computer) verbunden ist. Bei 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 standardmäßige HID-Ereignisse. Die Implementierung geht nicht von bestimmten Inhalten oder Ereignistypen aus und leitet sie einfach an das Eingabesystem weiter. So kann ein AOAv2-Zubehör wie jedes andere HID-Gerät (Maus, Tastatur, Gamecontroller usw.) verwendet werden. Sie können HID-Unterstützung für grundlegende Funktionen wie eine Wiedergabe-/Pause-Taste auf einem Mediendock oder für erweiterte Funktionen wie eine Dockingstation mit Maus und voller QWERTY-Tastatur verwenden.
AOAv2 fügt neue USB-Steuerungsanfragen hinzu, mit denen das Zubehör als ein oder mehrere HID-Eingabegeräte für das Android-Gerät fungieren kann. Die HID-Unterstützung wird vollständig über Steueranfragen an Endpunkt 0 abgewickelt. Es ist also keine neue USB-Schnittstelle erforderlich. Die vier neuen Anträge auf Datenleihe sind:
- ACCESSORY_REGISTER_HID registriert ein neues HID-Gerät beim Android-Gerät. Das Zubehör stellt eine ID bereit, mit der das HID-Gerät für die anderen drei Aufrufe identifiziert wird. Diese ID ist gültig, bis die USB-Verbindung getrennt wird oder das Zubehör
ACCESSORY_UNREGISTER_HID
sendet, um das HID-Gerät abzumelden. - Mit ACCESSORY_UNREGISTER_HID wird die Registrierung eines HID-Geräts aufgehoben, das zuvor bei
ACCESSORY_REGISTER_HID
registriert wurde. - ACCESSORY_SET_HID_REPORT_DESC sendet einen Berichts-Descriptor für ein HID-Gerät an das Android-Gerät. Mit dieser Anfrage werden die Funktionen des HID-Geräts beschrieben. Sie muss gesendet werden, bevor HID-Ereignisse an das Android-Gerät gesendet werden. Wenn der Berichtsdeskriptor größer als die maximale Paketgröße für Endpunkt 0 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 Steueranfragen 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) ermöglicht es einer Android-App, direkt über USB mit einem USB-Host (Zubehör) zu kommunizieren. AOAv2 setzt diese Unterstützung fort und fügt neue Funktionen hinzu, damit das Zubehör mit dem Android-Betriebssystem selbst kommunizieren kann (insbesondere mit den Audio- und Eingabesystemen). Das Design von AOAv2 ermöglicht es, Zubehör zu entwickeln, das neben den ursprünglichen Funktionen auch die neue Audio- und HID-Unterstützung nutzt. 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 Audiodock) entwerfen, das Audio- und HID-Unterstützung nutzt, aber nicht mit einer App auf dem Android-Gerät kommuniziert. Bei diesen Zubehörteilen müssen Nutzer keine Dialogaufforderungen erhalten, um das neu angeschlossene Zubehör zu finden und mit einer Android-App zu verknüpfen, die damit kommunizieren kann.
Wenn solche Dialogfelder nach der Verbindung eines Zubehörs unterdrückt werden sollen, kann das Zubehör festlegen, dass die Namen des Herstellers und des Modells nicht an das Android-Gerät gesendet werden. Wenn diese Strings nicht für das Android-Gerät bereitgestellt werden, passiert Folgendes:
- Das System versucht nicht, eine App zu finden, um mit dem Zubehör zu kommunizieren.
- Die USB-Schnittstelle des Zubehörs ist nicht in der USB-Konfiguration des Android-Geräts vorhanden, nachdem das Gerät in den Zubehörmodus gewechselt ist.