Otwarty protokół akcesoriów Android 2.0, otwarty protokół akcesoriów Android 2.0

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Ten dokument opisuje zmiany w protokole Android Open Accessory (AOA) od czasu jego pierwszego wydania i uzupełnia dokumentację AOA 1.0 . AOAv2 dodaje następujące funkcje:

  • Wyjście audio (przestarzałe w systemie Android 8.0).
  • Wsparcie dla akcesorium działającego jako jedno lub więcej urządzeń interfejsu ludzkiego (HID) do urządzenia z systemem Android.

Interfejsy API Android SDK dostępne dla programistów aplikacji na Androida pozostają niezmienione.

Wykrywanie obsługi AOAv2

Aby określić, czy podłączone urządzenie z systemem Android obsługuje akcesoria i obsługiwaną wersję protokołu, akcesorium musi wysłać polecenie getProtocol() i sprawdzić wynik. Urządzenia z systemem Android obsługujące tylko funkcje w AOAv1 muszą zwracać 1 jako wersję protokołu; urządzenia obsługujące dodatkowe funkcje w AOAv2 muszą zwracać 2 jako wersję protokołu. AOAv2 jest wstecznie kompatybilny z AOAv1, więc akcesoria zaprojektowane dla oryginalnego protokołu akcesoriów nadal działają z nowszymi urządzeniami z Androidem.

Poniższy przykład z biblioteki kodu źródłowego Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) demonstruje to sprawdzenie protokołu:

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 zawiera nowe identyfikatory produktów USB dla każdej kombinacji interfejsów USB dostępnych w trybie akcesoriów:

Wersja ID produktu Komunikacja Opis
AOAv1 0x2D00 akcesorium Zapewnia dwa zbiorcze punkty końcowe do komunikacji z aplikacją dla systemu Android.
0x2D01 akcesorium + adb Do celów debugowania podczas opracowywania akcesoriów. Dostępne tylko wtedy, gdy użytkownik włączył debugowanie USB w ustawieniach urządzenia z systemem Android.
AOAv2 0x2D02 audio Do przesyłania strumieniowego dźwięku z urządzenia z systemem Android do akcesorium.
0x2D03 dźwięk + adb
0x2D04 akcesoria + audio
0x2D05 akcesoria + audio + adb

Identyfikatory produktów używane w AOAv1 ( 0x2D00 i 0x2D01 ) są nadal obsługiwane w AOAv2.

Wsparcie audio

AOAv2 obejmuje obsługę wyjścia audio z urządzenia z systemem Android do akcesorium za pośrednictwem standardowego interfejsu klasy audio USB obsługującego 2-kanałowy, 16-bitowy dźwięk PCM o przepływności 44100 kHz (w przyszłości mogą zostać dodane dodatkowe tryby audio).

Aby włączyć obsługę dźwięku, akcesorium musi wysłać nowe żądanie sterowania USB:

**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

To polecenie musi zostać wysłane przed wysłaniem polecenia ACCESSORY_START w celu przejścia w tryb akcesoriów.

Wsparcie HID

AOAv2 umożliwia akcesoriom rejestrację jednego lub więcej urządzeń interfejsu ludzkiego USB (HID) na urządzeniu z systemem Android. To podejście odwraca kierunek komunikacji dla typowych urządzeń USB HID, takich jak myszy i klawiatury USB. Zwykle urządzenie HID jest urządzeniem peryferyjnym podłączonym do hosta USB (tj. komputerem osobistym), ale w AOA host USB może działać jako jedno lub więcej urządzeń wejściowych do urządzenia peryferyjnego USB.

Obsługa HID jest proxy dla standardowych zdarzeń HID; implementacja nie przyjmuje żadnych założeń dotyczących zawartości ani rodzaju zdarzeń i po prostu przekazuje je do systemu wejściowego, umożliwiając akcesorium AOAv2 działanie jako dowolne urządzenie HID (mysz, klawiatura, kontroler gier itp.). Możesz użyć obsługi HID, aby zapewnić podstawowe funkcje, takie jak przycisk odtwarzania/wstrzymania w stacji dokującej multimediów, lub zaawansowane funkcje, takie jak stacja dokująca z myszą i pełną klawiaturą QWERTY.

AOAv2 dodaje nowe żądania sterowania USB, które pozwalają akcesorium działać jako jedno lub więcej urządzeń wejściowych HID do urządzenia z systemem Android. Obsługa HID jest obsługiwana całkowicie poprzez żądania kontrolne w punkcie końcowym zero, więc nie jest potrzebny nowy interfejs USB. Cztery nowe wnioski o kontrolę to:

  • ACCESSORY_REGISTER_HID rejestruje nowe urządzenie HID na urządzeniu z systemem Android. Akcesorium zapewnia identyfikator używany do identyfikacji urządzenia HID dla pozostałych trzech połączeń. Ten identyfikator jest ważny do momentu rozłączenia USB lub do momentu, gdy akcesorium wyśle ACCESSORY_UNREGISTER_HID , aby wyrejestrować urządzenie HID.
  • ACCESSORY_UNREGISTER_HID wyrejestrowuje urządzenie HID zarejestrowane wcześniej w ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC wysyła deskryptor raportu dla urządzenia HID do urządzenia z systemem Android. To żądanie służy do opisania możliwości urządzenia HID i musi zostać wysłane przed zgłoszeniem jakichkolwiek zdarzeń HID do urządzenia z systemem Android. Jeśli deskryptor raportu jest większy niż maksymalny rozmiar pakietu dla punktu końcowego zero, wysyłanych jest wiele poleceń ACCESSORY_SET_HID_REPORT_DESC w celu przesłania całego deskryptora.
  • ACCESSORY_SEND_HID_EVENT wysyła zdarzenia wejściowe z akcesorium do urządzenia z systemem Android.

Definicje kodu dla nowych żądań sterowania to:

/* 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

Współpraca z AOAv1

Oryginalny protokół ( AOAv1 ) zapewnia obsługę aplikacji na Androida do bezpośredniej komunikacji z hostem USB (akcesorium) przez USB. AOAv2 kontynuuje tę obsługę i dodaje nowe funkcje, aby umożliwić akcesorium komunikację z samym systemem operacyjnym Android (w szczególności z systemami audio i wejściowymi). Konstrukcja AOAv2 umożliwia zbudowanie akcesorium, które oprócz oryginalnego zestawu funkcji korzysta z nowej obsługi dźwięku i HID. Po prostu korzystaj z nowych funkcji wraz z oryginalnymi funkcjami.

Łączenie AOAv2 bez aplikacji na Androida

Możesz zaprojektować akcesorium (takie jak stacja dokująca audio), które korzysta z obsługi dźwięku i HID, ale nie komunikuje się z aplikacją na urządzeniu z systemem Android. W przypadku tych akcesoriów użytkownicy nie muszą otrzymywać monitów dialogowych w celu znalezienia i powiązania nowo podłączonego akcesorium z aplikacją systemu Android, która może się z nim komunikować.

Aby wyłączyć takie okna dialogowe po podłączeniu akcesorium, akcesorium może wybrać opcję niewysyłania nazwy producenta i modelu do urządzenia z systemem Android. Gdy te ciągi nie są dostarczane do urządzenia z systemem Android:

  • System nie próbuje znaleźć aplikacji do komunikacji z akcesorium.
  • Interfejs USB akcesoriów nie jest obecny w konfiguracji USB urządzenia z systemem Android po przejściu urządzenia w tryb akcesoriów.
,

Ten dokument opisuje zmiany w protokole Android Open Accessory (AOA) od czasu jego pierwszego wydania i uzupełnia dokumentację AOA 1.0 . AOAv2 dodaje następujące funkcje:

  • Wyjście audio (przestarzałe w systemie Android 8.0).
  • Wsparcie dla akcesorium działającego jako jedno lub więcej urządzeń interfejsu ludzkiego (HID) do urządzenia z systemem Android.

Interfejsy API Android SDK dostępne dla programistów aplikacji na Androida pozostają niezmienione.

Wykrywanie obsługi AOAv2

Aby określić, czy podłączone urządzenie z systemem Android obsługuje akcesoria i obsługiwaną wersję protokołu, akcesorium musi wysłać polecenie getProtocol() i sprawdzić wynik. Urządzenia z systemem Android obsługujące tylko funkcje w AOAv1 muszą zwracać 1 jako wersję protokołu; urządzenia obsługujące dodatkowe funkcje w AOAv2 muszą zwracać 2 jako wersję protokołu. AOAv2 jest wstecznie kompatybilny z AOAv1, więc akcesoria zaprojektowane dla oryginalnego protokołu akcesoriów nadal działają z nowszymi urządzeniami z Androidem.

Poniższy przykład z biblioteki kodu źródłowego Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) demonstruje to sprawdzenie protokołu:

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 zawiera nowe identyfikatory produktów USB dla każdej kombinacji interfejsów USB dostępnych w trybie akcesoriów:

Wersja ID produktu Komunikacja Opis
AOAv1 0x2D00 akcesorium Zapewnia dwa zbiorcze punkty końcowe do komunikacji z aplikacją dla systemu Android.
0x2D01 akcesorium + adb Do celów debugowania podczas opracowywania akcesoriów. Dostępne tylko wtedy, gdy użytkownik włączył debugowanie USB w ustawieniach urządzenia z systemem Android.
AOAv2 0x2D02 audio Do przesyłania strumieniowego dźwięku z urządzenia z systemem Android do akcesorium.
0x2D03 dźwięk + adb
0x2D04 akcesoria + audio
0x2D05 akcesoria + audio + adb

Identyfikatory produktów używane w AOAv1 ( 0x2D00 i 0x2D01 ) są nadal obsługiwane w AOAv2.

Wsparcie audio

AOAv2 obejmuje obsługę wyjścia audio z urządzenia z systemem Android do akcesorium za pośrednictwem standardowego interfejsu klasy audio USB obsługującego 2-kanałowy, 16-bitowy dźwięk PCM o przepływności 44100 kHz (w przyszłości mogą zostać dodane dodatkowe tryby audio).

Aby włączyć obsługę dźwięku, akcesorium musi wysłać nowe żądanie sterowania USB:

**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

To polecenie musi zostać wysłane przed wysłaniem polecenia ACCESSORY_START w celu przejścia w tryb akcesoriów.

Wsparcie HID

AOAv2 umożliwia akcesoriom rejestrację jednego lub więcej urządzeń interfejsu ludzkiego USB (HID) na urządzeniu z systemem Android. To podejście odwraca kierunek komunikacji dla typowych urządzeń USB HID, takich jak myszy i klawiatury USB. Zwykle urządzenie HID jest urządzeniem peryferyjnym podłączonym do hosta USB (tj. komputerem osobistym), ale w AOA host USB może działać jako jedno lub więcej urządzeń wejściowych do urządzenia peryferyjnego USB.

Obsługa HID jest proxy dla standardowych zdarzeń HID; implementacja nie przyjmuje żadnych założeń dotyczących zawartości ani rodzaju zdarzeń i po prostu przekazuje je do systemu wejściowego, umożliwiając akcesorium AOAv2 działanie jako dowolne urządzenie HID (mysz, klawiatura, kontroler gier itp.). Możesz użyć obsługi HID, aby zapewnić podstawowe funkcje, takie jak przycisk odtwarzania/wstrzymania w stacji dokującej multimediów, lub zaawansowane funkcje, takie jak stacja dokująca z myszą i pełną klawiaturą QWERTY.

AOAv2 dodaje nowe żądania sterowania USB, które pozwalają akcesorium działać jako jedno lub więcej urządzeń wejściowych HID do urządzenia z systemem Android. Obsługa HID jest obsługiwana całkowicie poprzez żądania kontrolne w punkcie końcowym zero, więc nie jest potrzebny nowy interfejs USB. Cztery nowe wnioski o kontrolę to:

  • ACCESSORY_REGISTER_HID rejestruje nowe urządzenie HID na urządzeniu z systemem Android. Akcesorium zapewnia identyfikator używany do identyfikacji urządzenia HID dla pozostałych trzech połączeń. Ten identyfikator jest ważny do momentu rozłączenia USB lub do momentu, gdy akcesorium wyśle ACCESSORY_UNREGISTER_HID , aby wyrejestrować urządzenie HID.
  • ACCESSORY_UNREGISTER_HID wyrejestrowuje urządzenie HID zarejestrowane wcześniej w ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC wysyła deskryptor raportu dla urządzenia HID do urządzenia z systemem Android. To żądanie służy do opisania możliwości urządzenia HID i musi zostać wysłane przed zgłoszeniem jakichkolwiek zdarzeń HID do urządzenia z systemem Android. Jeśli deskryptor raportu jest większy niż maksymalny rozmiar pakietu dla punktu końcowego zero, wysyłanych jest wiele poleceń ACCESSORY_SET_HID_REPORT_DESC w celu przesłania całego deskryptora.
  • ACCESSORY_SEND_HID_EVENT wysyła zdarzenia wejściowe z akcesorium do urządzenia z systemem Android.

Definicje kodu dla nowych żądań sterowania to:

/* 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

Współpraca z AOAv1

Oryginalny protokół ( AOAv1 ) zapewnia obsługę aplikacji na Androida do bezpośredniej komunikacji z hostem USB (akcesorium) przez USB. AOAv2 kontynuuje tę obsługę i dodaje nowe funkcje, aby umożliwić akcesorium komunikację z samym systemem operacyjnym Android (w szczególności z systemami audio i wejściowymi). Konstrukcja AOAv2 umożliwia zbudowanie akcesorium, które oprócz oryginalnego zestawu funkcji korzysta z nowej obsługi dźwięku i HID. Po prostu korzystaj z nowych funkcji wraz z oryginalnymi funkcjami.

Łączenie AOAv2 bez aplikacji na Androida

Możesz zaprojektować akcesorium (takie jak stacja dokująca audio), które korzysta z obsługi dźwięku i HID, ale nie komunikuje się z aplikacją na urządzeniu z systemem Android. W przypadku tych akcesoriów użytkownicy nie muszą otrzymywać monitów dialogowych w celu znalezienia i powiązania nowo podłączonego akcesorium z aplikacją systemu Android, która może się z nim komunikować.

Aby wyłączyć takie okna dialogowe po podłączeniu akcesorium, akcesorium może wybrać opcję niewysyłania nazwy producenta i modelu do urządzenia z systemem Android. Gdy te ciągi nie są dostarczane do urządzenia z systemem Android:

  • System nie próbuje znaleźć aplikacji do komunikacji z akcesorium.
  • Interfejs USB akcesoriów nie jest obecny w konfiguracji USB urządzenia z systemem Android po przejściu urządzenia w tryb akcesoriów.