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-App-Entwickler verfügbaren Android SDK-APIs bleiben unverändert.
Erkennen Sie die AOAv2-Unterstützung
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-App. |
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 bereit, die zur Identifizierung des HID-Geräts für die anderen drei Anrufe verwendet 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 Originalprotokoll ( AOAv1 ) unterstützt eine Android-App 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ör 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.
Verbinden Sie AOAv2 ohne eine Android-App
Sie können ein Zubehör (z. B. ein Audio-Dock) entwerfen, das Audio- und HID-Unterstützung nutzt, aber nicht mit einer App 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-App 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 App zu finden, um mit dem Zubehör zu kommunizieren.
- 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.