Ten dokument opisuje zmiany w protokole Android Open Accessory (AOA) od czasu jego pierwszej wersji i uzupełnia dokumentację AOA 1.0 . AOAv2 dodaje następujące funkcje:
- Wyjście audio (przestarzałe w systemie Android 8.0).
- Obsługa akcesorium działającego jako jedno lub więcej urządzeń interfejsu ludzkiego (HID) na urządzeniu z systemem Android.
Interfejsy API zestawu SDK systemu Android dostępne dla twórców aplikacji na Androida pozostają niezmienione.
Wykryj obsługę AOAv2
Aby ustalić, 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 Androidem obsługujące tylko funkcje 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
) ilustruje tę kontrolę 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ą na Androida. |
0x2D01 | dodatek + przysł | 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 strumieniowego przesyłania dźwięku z urządzenia z systemem Android do akcesorium. |
0x2D03 | dźwięk + przysł | ||
0x2D04 | akcesoria + dźwięk | ||
0x2D05 | akcesoria + audio + przym |
Identyfikatory produktów używane w AOAv1 ( 0x2D00
i 0x2D01
) są nadal obsługiwane w AOAv2.
Obsługa dźwięku
AOAv2 obsługuje wyjście 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 z szybkością transmisji 44100 kHz (dodatkowe tryby audio mogą zostać dodane w przyszłości).
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
Polecenie to musi zostać wysłane przed wysłaniem polecenia ACCESSORY_START
w celu wejścia w tryb akcesoriów.
Wsparcie HID
AOAv2 umożliwia akcesoriom zarejestrowanie jednego lub większej liczby urządzeń USB Human Interface Device (HID) na urządzeniu z systemem Android. Takie podejście odwraca kierunek komunikacji w przypadku typowych urządzeń USB HID, takich jak myszy i klawiatury USB. Zwykle urządzenie HID to urządzenie peryferyjne podłączone do hosta USB (tj. komputera osobistego), ale w AOA host USB może działać jako jedno lub więcej urządzeń wejściowych dla urządzenia peryferyjnego USB.
Obsługa HID jest proxy dla standardowych zdarzeń HID; implementacja nie przyjmuje żadnych założeń co do treś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.). Obsługi HID można używać w celu zapewnienia podstawowych funkcji, takich jak przycisk odtwarzania/pauzy w stacji dokującej, lub w celu uzyskania zaawansowanych funkcji, takich 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 na urządzeniu z systemem Android. Obsługa HID jest obsługiwana wyłącznie poprzez żądania sterujące w punkcie końcowym zero, więc nie jest potrzebny żaden nowy interfejs USB. Cztery nowe żądania kontroli to:
- ACCESSORY_REGISTER_HID rejestruje nowe urządzenie HID na urządzeniu z Androidem. 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 wysłania przez akcesorium
ACCESSORY_UNREGISTER_HID
w celu wyrejestrowania urządzenia 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 opisu 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ń kontroli są następujące:
/* 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 w celu 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 wykorzystuje nową obsługę audio i HID. Po prostu użyj nowych funkcji wraz z oryginalnymi funkcjami.
Połącz AOAv2 bez aplikacji na Androida
Możesz zaprojektować akcesorium (takie jak stacja dokująca audio), które obsługuje dźwięk i HID, ale nie komunikuje się z aplikacją na urządzeniu z Androidem. W przypadku tych akcesoriów użytkownicy nie muszą otrzymywać monitów o znalezienie nowo podłączonego akcesorium i powiązanie go z aplikacją na Androida, która może się z nim komunikować.
Aby ukryć takie okna dialogowe po podłączeniu akcesorium, może ono zdecydować o nie wysyłaniu nazwy producenta i modelu do urządzenia z systemem Android. Jeśli te ciągi nie są dostarczane do urządzenia z systemem Android:
- System nie próbuje znaleźć aplikacji umożliwiającej komunikację 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.