Android Open Accessory Protocol 2.0,Android Open Accessory Protocol 2.0

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

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 (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.

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

Erkennung der 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 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 Features 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 ) veranschaulicht 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 Stellt zwei Bulk-Endpunkte für die Kommunikation mit einer Android-Anwendung bereit.
0x2D01 Zubehör + Adb Für Debugging-Zwecke 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 zu einem 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 unterstützt die Audioausgabe von einem Android-Gerät an ein Zubehör über eine Standard-USB-Audioklasse-Schnittstelle, 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 gesendet wird, um in den Zubehörmodus zu wechseln.

HID-Unterstützung

AOAv2 ermöglicht Zubehör, ein oder mehrere USB Human Interface Devices (HID) mit einem Android-Gerät zu 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 mit einem USB-Host (dh einem Personalcomputer) verbunden ist, aber in 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 standardmäßige 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 verwenden, um grundlegende Funktionen wie eine Wiedergabe-/Pausetaste auf einem Mediendock oder erweiterte Funktionen wie eine Dockingstation mit einer Maus und einer vollständigen QWERTY-Tastatur bereitzustellen.

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 Steuerungsanforderungen am Endpunkt Null abgewickelt, sodass keine neue USB-Schnittstelle erforderlich ist. Die vier neuen Steueranforderungen sind:

  • ACCESSORY_REGISTER_HID registriert ein neues HID-Gerät beim Android-Gerät. Das Zubehör stellt eine ID bereit, die verwendet wird, um das HID-Gerät für die anderen drei Anrufe zu identifizieren. Diese ID ist gültig, bis USB getrennt wird oder bis das Zubehör ACCESSORY_UNREGISTER_HID sendet, um die Registrierung des HID-Geräts aufzuheben.
  • 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 Anfrage wird verwendet, um die Fähigkeiten des HID-Geräts zu beschreiben 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 Steueranforderungen lauten:

/* 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 ) bietet Unterstützung für eine Android-Anwendung zur direkten 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 kommunizieren kann (insbesondere mit den Audio- und Eingabesystemen). Das Design von AOAv2 ermöglicht es, ein Zubehör zu bauen, das die neue Audio- und HID-Unterstützung zusätzlich zum ursprünglichen Funktionsumfang 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 Audio-Dock) entwerfen, das Audio- und HID-Unterstützung verwendet, 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 einer Android-Anwendung zuzuordnen, die damit kommunizieren kann.

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

  • Das System versucht nicht, eine Anwendung 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.
,

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 (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.

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

Erkennung der 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 Features 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 ) veranschaulicht 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 Stellt zwei Bulk-Endpunkte für die Kommunikation mit einer Android-Anwendung bereit.
0x2D01 Zubehör + Adb Für Debugging-Zwecke 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 zu einem 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 unterstützt die Audioausgabe von einem Android-Gerät an ein Zubehör über eine Standard-USB-Audioklasse-Schnittstelle, 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 gesendet wird, um in den Zubehörmodus zu wechseln.

HID-Unterstützung

AOAv2 ermöglicht Zubehör, ein oder mehrere USB Human Interface Devices (HID) mit einem Android-Gerät zu 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 mit einem USB-Host (dh einem Personalcomputer) verbunden ist, aber in 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 standardmäßige 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 verwenden, um grundlegende Funktionen wie eine Wiedergabe-/Pausetaste auf einem Mediendock oder erweiterte Funktionen wie eine Dockingstation mit einer Maus und einer vollständigen QWERTY-Tastatur bereitzustellen.

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 Steuerungsanforderungen am Endpunkt Null abgewickelt, sodass keine neue USB-Schnittstelle erforderlich ist. Die vier neuen Steueranforderungen sind:

  • ACCESSORY_REGISTER_HID registriert ein neues HID-Gerät beim Android-Gerät. Das Zubehör stellt eine ID bereit, die verwendet wird, um das HID-Gerät für die anderen drei Anrufe zu identifizieren. Diese ID ist gültig, bis USB getrennt wird oder bis das Zubehör ACCESSORY_UNREGISTER_HID sendet, um die Registrierung des HID-Geräts aufzuheben.
  • 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 Anfrage wird verwendet, um die Fähigkeiten des HID-Geräts zu beschreiben 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 Steueranforderungen lauten:

/* 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 ) bietet Unterstützung für eine Android-Anwendung zur direkten 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 kommunizieren kann (insbesondere mit den Audio- und Eingabesystemen). Das Design von AOAv2 ermöglicht es, ein Zubehör zu bauen, das die neue Audio- und HID-Unterstützung zusätzlich zum ursprünglichen Funktionsumfang 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 Audio-Dock) entwerfen, das Audio- und HID-Unterstützung verwendet, 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 einer Android-Anwendung zuzuordnen, die damit kommunizieren kann.

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

  • Das System versucht nicht, eine Anwendung 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.