Ten dokument opisuje zmiany w protokole AOA (Android Open Accessory) od czasu jego pierwszej wersji i uzupełnia dokumentację AOA 1.0. AOAv2 wprowadza te funkcje:
- Wyjście audio (wycofane w Androidzie 8.0).
- Obsługa akcesoriów działających jako co najmniej 1 urządzenie HID (Human Interface Device) na urządzeniu z Androidem.
Interfejsy API pakietu Android SDK dostępne dla deweloperów aplikacji na Androida pozostają bez zmian.
Wykrywanie obsługi AOAv2
Aby określić, czy połączone urządzenie z Androidem obsługuje akcesoria i obsługiwaną wersję protokołu, akcesorium musi wysłać polecenie getProtocol()
i sprawdzić wynik. Urządzenia z Androidem, które obsługują tylko funkcje w AOAv1, muszą zwracać 1
jako wersję protokołu. Urządzenia, które obsługują dodatkowe funkcje w AOAv2, muszą zwracać 2
jako wersję protokołu. AOAv2 jest wstecznie zgodny z AOAv1, więc akcesoria zaprojektowane pod kątem oryginalnego protokołu akcesoriów nadal będą działać z nowszymi urządzeniami z Androidem.
Ten przykład z pakietu Accessory Development Kit 2011
kod źródłowy
(<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
)
biblioteki demonstruje sprawdzanie 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 akcesorium:
Wersja | Identyfikator produktu | Komunikacja | Opis |
---|---|---|---|
AOAv1 | 0x2D00 |
akcesorium | Udostępnia 2 punkty końcowe zbiorcze do komunikacji z aplikacją na Androida. |
0x2D01 |
akcesoria + adb | Na potrzeby debugowania podczas tworzenia akcesoriów. Dostępne tylko wtedy, gdy użytkownik włączył Debugowanie przez USB w ustawieniach urządzenia z Androidem. | |
AOAv2 | 0x2D02 |
dźwięk | Do strumieniowego przesyłania dźwięku z urządzenia z Androidem na akcesoria. |
0x2D03 |
audio + adb | ||
0x2D04 |
akcesoria + dźwięk | ||
0x2D05 |
akcesoria + dźwięk + 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 Androidem do akcesorium za pomocą standardowego interfejsu klasy audio USB obsługującego 2-kanałowy 16-bitowy dźwięk PCM z szybkością transmisji bitów 44100 kHz (w przyszłości możemy dodać dodatkowe tryby audio).
Aby włączyć obsługę dźwięku, akcesorium musi wysłać nowe żądanie sterowania przez 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
, aby przejść do trybu akcesorium.
Obsługa HID
AOAv2 umożliwia akcesoriom rejestrowanie co najmniej 1 urządzenia HID (Human Interface Device) z urządzeniem z Androidem. Takie podejście odwraca kierunek komunikacji w przypadku typowych urządzeń HID USB, takich jak myszy i klawiatury USB. Zazwyczaj urządzenie HID jest urządzeniem peryferyjnym podłączonym do hosta USB (np. komputera osobistego), ale w OA host USB może pełnić funkcję co najmniej 1 urządzenia wejściowego dla urządzenia peryferyjnego USB.
Obsługa HID jest prostym zamiennikiem standardowych zdarzeń HID. Implementacja nie zakłada żadnych założeń dotyczących treści ani typu zdarzeń, a tylko przekazuje je do systemu wejściowego, umożliwiając akcesoriom AOAv2 działanie jak każde urządzenie HID (mysz, klawiatura, kontroler gier itp.). Możesz użyć obsługi HID, aby zapewnić podstawowe funkcje, takie jak przycisk odtwarzania/pauzowania w dokującej stacji multimedialnej, lub zaawansowane funkcje, takie jak stacja dokująca z myszką i pełną klawiaturą QWERTY.
AOAv2 dodaje nowe żądania sterowania USB, które umożliwiają akcesoriom działanie jako co najmniej 1 urządzenie wejściowe HID na urządzeniu z Androidem. Obsługa HID jest obsługiwana wyłącznie za pomocą żądań sterowania na urządzeniu końcowym 0, więc nie jest potrzebny nowy interfejs USB. Te 4 nowe żądania kontroli to:
- ACCESSORY_REGISTER_HID rejestruje nowe urządzenie HID na urządzeniu z Androidem. Akcesorium udostępnia identyfikator, który służy do identyfikowania urządzenia HID w przypadku pozostałych 3 wywołań. Ten identyfikator jest ważny do momentu odłączenia kabla USB lub wysłania przez urządzenie akcesorium
ACCESSORY_UNREGISTER_HID
w celu wyrejestrowania urządzenia HID. - ACCESSORY_UNREGISTER_HID wyrejestrowuje urządzenie HID, które zostało wcześniej zarejestrowane za pomocą
ACCESSORY_REGISTER_HID
. - ACCESSORY_SET_HID_REPORT_DESC wysyła do urządzenia z Androidem opis raportu dla urządzenia HID. Ta prośba służy do opisu możliwości urządzenia HID i musi zostać wysłana przed zgłoszeniem jakichkolwiek zdarzeń HID na urządzenie z Androidem. Jeśli opis raportu jest większy niż maksymalny rozmiar pakietu dla punktu końcowego 0, do przesłania całego opisu wysyłane są liczne polecenia
ACCESSORY_SET_HID_REPORT_DESC
. - ACCESSORY_SEND_HID_EVENT wysyła zdarzenia wejściowe z akcesorium na urządzenie z Androidem.
Definicje kodu dla nowych żądań kontroli:
/* 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
Interoperacyjność z AOAv1
Pierwotny protokół (AOAv1) zapewnia obsługę aplikacji na Androida, która może komunikować się bezpośrednio z hostem USB (akcesorium) przez USB. AOAv2 nadal obsługuje te funkcje i dodaje nowe, aby umożliwić akcesoriom komunikację z systemem operacyjnym Android (w szczególności z systemami audio i wejścia). Dzięki projektowi AOAv2 możesz stworzyć akcesorium, które korzysta z nowego wsparcia audio i HID oprócz oryginalnego zestawu funkcji. Wystarczy, że będziesz używać nowych funkcji razem z pierwotnymi funkcjami.
Łączenie AOAv2 bez aplikacji na Androida
Możesz zaprojektować akcesorium (np. głośnik z płytą do ładowania), które korzysta z interfejsu HID i interfejsu audio, ale nie komunikuje się z aplikacją na urządzeniu z Androidem. W przypadku tych akcesoriów użytkownicy nie muszą otrzymywać promptów z prośbą o znalezienie i powiązanie nowo podłączonego akcesorium z aplikacją na Androida, która może z nim współpracować.
Aby pominąć takie okna dialogowe po połączeniu akcesorium, akcesorium może zdecydować się na niewysyłanie nazw producenta i modelu do urządzenia z Androidem. Gdy te ciągi znaków nie są udostępniane urządzeniu z Androidem:
- System nie próbuje znaleźć aplikacji do komunikacji z dodatkiem.
- Po przejściu urządzenia w tryb akcesoriów interfejs USB akcesoriów nie jest widoczny w konfiguracji USB urządzenia z Androidem.