Android Open Accessory 2.0

In diesem Dokument werden die Änderungen am Android Open Accessory-Protokoll (AOA) beschrieben. und Nahrungsergänzungsmittel und Dokumentation zu AOA 1.0 AOAv2 bietet folgende Funktionen:

  • Audioausgabe (in Android 8.0 eingestellt)
  • Unterstützung für Zubehör, das als ein oder mehrere Benutzeroberflächengeräte agiert (HIDs) auf das Android-Gerät übertragen.

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

AOAv2-Unterstützung erkennen

So stellen Sie fest, ob ein verbundenes Android-Gerät Zubehör und die unterstützte Protokollversion gesendet wird, muss das Zubehör eine getProtocol() und überprüfen Sie das Ergebnis. Android-Geräte, die nur die Funktionen unterstützen in AOAv1 muss 1 als Protokollversion zurückgeben. Geräte, die die zusätzlichen Funktionen in AOAv2 unterstützen, muss 2 als Protokollversion. AOAv2 ist abwärtskompatibel mit AOAv1, die für das ursprüngliche Zubehörprotokoll entwickelt wurden, funktionieren auch mit neueren Android-Versionen Geräte.

Das folgende Beispiel aus dem Accessory Development Kit 2011 Quellcode (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) Bibliothek diese Protokollprüfung veranschaulicht:

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. im Zubehörmodus verfügbar:

Version Produkt-ID Kommunikation Beschreibung
AOAv1 0x2D00 Accessoires Stellt zwei Bulk-Endpunkte für die Kommunikation mit einer Android-App bereit.
0x2D01 Zubehör + ADB Für die Fehlerbehebung bei der Entwicklung von Zubehör. Nur verfügbar, wenn die Nutzer hat in den Android-Geräteeinstellungen USB-Debugging aktiviert.
AOAv2 0x2D02 Audio Zum Streamen von Audio von einem Android-Gerät auf Zubehör
0x2D03 Audio + ADB
0x2D04 Zubehör + Audio
0x2D05 Zubehör + Audio + ADB

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

Audio-Unterstützung

AOAv2 unterstützt die Audioausgabe von einem Android-Gerät an ein über eine standardmäßige USB-Audioklasse-Schnittstelle mit 2 Kanälen, 16 Bit PCM-Audio mit einer Bitrate von 44.100 kHz (weitere Audiomodi können in in der Zukunft).

Um die Audiounterstützung zu aktivieren, muss das Zubehör eine neue USB-Steueranfrage 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-Befehl zum Aufrufen des Zubehörmodus.

HID-Unterstützung

AOAv2 ermöglicht Zubehör die Registrierung einer oder mehrerer USB Human Interfaces Geräte (HID) mit einem Android-Gerät Dieser Ansatz kehrt die Richtung Kommunikation für typische USB-HID-Geräte wie USB-Mäuse und -Tastaturen. Normalerweise ist das HID-Gerät ein Peripheriegerät, das mit einem USB-Host verbunden ist (d.h. Computer), aber bei AOA kann der USB-Host als eine oder mehrere Eingaben fungieren. mit einem USB-Peripheriegerät verbinden.

HID-Unterstützung ist ein Proxy für standardmäßige HID-Ereignisse. die keine Annahmen über den Inhalt oder die Art der Ereignisse übergeben sie einfach an das Eingabesystem, wodurch ein AOAv2-Zubehör als beliebiges HID-Gerät fungieren (Maus, Tastatur, Gamecontroller usw.). Sie können HID verwenden Unterstützung der Bereitstellung grundlegender Funktionen, wie z. B. einer Schaltfläche für Wiedergabe/Pause auf einem Medium Dock oder für erweiterte Funktionen wie eine Dockingstation mit Maus und vollständige QWERTY-Tastatur.

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

  • ACCESSORY_REGISTER_HID registriert ein neues HID-Gerät beim Android-Gerät Im Zubehör ist eine ID angegeben, mit der das HID-Gerät für die anderen drei Aufrufe. Diese ID ist gültig, bis die USB-Verbindung getrennt oder Zubehör sendet ACCESSORY_UNREGISTER_HID, um die HID-Registrierung aufzuheben .
  • ACCESSORY_UNREGISTER_HID hebt die Registrierung eines HID-Geräts auf zuvor bei ACCESSORY_REGISTER_HID registriert
  • ACCESSORY_SET_HID_REPORT_DESC sendet einen Berichtsdeskriptor für ein HID-Gerät mit dem Android-Gerät verbinden. Mit dieser Anfrage wird das Funktionen des HID-Geräts und muss gesendet werden, bevor HID-Ereignisse gemeldet werden auf das Android-Gerät übertragen. Wenn der Berichtsdeskriptor größer als das Maximum ist Paketgröße für Endpunkt null, mehrere ACCESSORY_SET_HID_REPORT_DESC-Befehle werden gesendet, um den gesamten Deskriptor zu finden.
  • ACCESSORY_SEND_HID_EVENT sendet Eingabeereignisse vom für das Android-Gerät.

Die Codedefinitionen für die neuen Kontrollanfragen 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-App, um direkt mit einem USB-Kabel zu kommunizieren. (Zubehör) über USB. AOAv2 setzt diese Unterstützung fort und bietet um dem Zubehör die Kommunikation mit dem Android-Betriebssystem zu ermöglichen (insbesondere Audio- und Eingabesysteme). Das Design von AOAv2 macht es ein Zubehör zu bauen, das die neue Audio- und HID-Unterstützung verwendet. Funktionen hinzugefügt werden. Verwenden Sie einfach die neuen Funktionen die ursprünglichen Funktionen.

AOAv2 verbinden ohne Android-App

Sie können Zubehör (z. B. ein Audiodock) entwerfen, das Audio und HID verwendet. unterstützt, kommuniziert aber nicht mit einer App auf dem Android-Gerät. Für Zubehörteile brauchen Nutzer keine Aufforderungen zum Suchen und das neu angeschlossene Zubehör mit einer Android-App verknüpft, mit ihr kommunizieren können.

Um solche Dialogfelder zu unterdrücken, nachdem eine Verbindung mit einem Zubehör hergestellt wurde, Zubehörteils nicht die Hersteller- und Modellnamen an das Android- . Wenn diese Strings nicht für das Android-Gerät bereitgestellt werden:

  • Das System versucht nicht, eine App zur Kommunikation mit dem Zubehör zu finden.
  • Die USB-Schnittstelle des Zubehörs ist nicht im USB-Anschluss des Android-Geräts vorhanden. nachdem das Gerät in den Zubehörmodus gewechselt ist.