Akcesoria USB do urządzeń z Androidem muszą być zgodne z protokołem Android Open Accessory (AOA), który określa sposób wykrywania i konfigurowania komunikacji z urządzeniem z Androidem. Akcesoria powinny wykonać te czynności:
- Poczekaj na wykrycie połączonego urządzenia.
- Sprawdź, czy urządzenie obsługuje tryb akcesoriów.
- Spróbuj uruchomić urządzenie w trybie akcesoriów (w razie potrzeby).
- Jeśli urządzenie obsługuje AOA, nawiązać z nim połączenie.
W sekcjach poniżej znajdziesz instrukcje dotyczące wdrażania tych kroków.
Czekaj na wykrycie połączonych urządzeń
Akcesoria powinny stale sprawdzać, czy są połączone z urządzeniami z Androidem. Po połączeniu urządzenia akcesorium powinno określić, czy urządzenie obsługuje tryb akcesorium.
Określanie obsługi trybu akcesoriów
Uwaga: debugowanie przez USB nie jest wymagane do podłączania akcesoriów, ale podczas tworzenia aplikacji może być potrzebne ADB. Więcej informacji znajdziesz w artykule Informacje o debugowaniu.
Połączenie z urządzeniem z Androidem może być nawiązane w jednym z 3 stanów:
- obsługuje tryb akcesoriów Androida i jest już w tym trybie;
- Obsługuje tryb akcesoriów Androida, ale nie jest w trybie akcesoriów.
- Nie obsługuje trybu akcesoriów na Androidzie.
Podczas początkowego połączenia akcesorium powinno sprawdzić wersję, identyfikator dostawcy oraz identyfikator produktu w opisie urządzenia USB. Identyfikator dostawcy powinien być zgodny z identyfikatorem Google (0x18D1
). Jeśli urządzenie jest już w trybie akcesorium, identyfikator produktu powinien być 0x2D00
lub 0x2D01
, a akcesorium może nawiązać komunikację z urządzeniem za pomocą punktów końcowych przesyłania zbiorczego przy użyciu własnego protokołu komunikacyjnego (urządzenie nie musi być uruchamiane w trybie akcesorium).
Uwaga: 0x2D00
jest zarezerwowane dla urządzeń z Androidem, które obsługują tryb akcesorium. 0x2D01
jest zarezerwowany dla urządzeń, które obsługują tryb akcesorium, a także protokół Android Debug Bridge (ADB), który udostępnia drugi interfejs z 2 punktami końcowymi ADB. Możesz używać tych punktów końcowych do debugowania aplikacji akcesorium, jeśli symulujesz akcesorium na komputerze. Ogólnie nie należy używać tego interfejsu, chyba że akcesorium obsługuje protokół ADB na urządzeniu.
Jeśli wersja, identyfikator producenta lub identyfikator produktu w dekskryptorze urządzenia USB nie odpowiadają oczekiwanym wartościom, urządzenie nie może określić, czy obsługuje tryb akcesoriów Androida. Akcesorium powinno spróbować uruchomić urządzenie w trybie akcesoriów (szczegóły poniżej), aby określić, czy urządzenie jest obsługiwane.
Ważna informacja: akcesorium USB musi wysłać nagłówek podczas początkowego uścisku dłoni. Nagłówek zawiera informacje o producencie, modelu i wersji. Chociaż wersja jest polem opcjonalnym, jeśli zainstalowana jest aplikacja na Androida, która pasuje tylko do wersji, ale akcesorium nie wysyła wersji, urządzenia z Androidem w wersji 10 lub starszej uruchomią się ponownie z powodu wyjątku wygenerowanego w ramach procesu systemowego.
Spróbuj uruchomić urządzenie w trybie akcesoriów.
Jeśli identyfikatory wersji, producenta i produktu nie odpowiadają urządzeniu z Androidem w trybie akcesorium, akcesorium nie może określić, czy urządzenie obsługuje tryb akcesorium (ale nie jest w nim), czy też nie obsługuje trybu akcesorium. Może się tak zdarzyć, ponieważ urządzenia, które obsługują tryb akcesoriów (ale nie są w tym trybie), początkowo zgłaszają identyfikatory dostawcy i produktu urządzenia zamiast identyfikatorów AOA.
Akcesorium powinno spróbować uruchomić urządzenie w trybie akcesoriów, aby określić, czy urządzenie obsługuje ten tryb:
- Wysłać żądanie sterowania 51 („Get Protocol”), aby określić, czy urządzenie obsługuje protokół akcesoriów Androida. Jeśli urządzenie obsługuje ten protokół, zwraca liczbę różną od 0, która reprezentuje obsługiwaną wersję protokołu.
Żądanie sterujące jest wysyłane z punktu końcowego 0 i ma następujące właściwości:
requestType: USB_DIR_IN | USB_TYPE_VENDOR request: 51 value: 0 index: 0 data: protocol version number (16 bits little endian sent from the device to the accessory)
- Jeśli urządzenie zwróci obsługiwaną wersję protokołu, wyślij na urządzenie żądanie sterowania z identyfikującym ciągiem znaków. Te informacje umożliwiają urządzeniu określenie odpowiedniej aplikacji dla akcesorium (lub wyświetlenie użytkownikowi adresu URL, jeśli odpowiednia aplikacja nie istnieje). Żądanie kontrolne jest wysyłane do punktu końcowego 0 (dla każdego identyfikatora ciągu znaków) z tymi cechami:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
Obsługiwane są następujące identyfikatory ciągów znaków o maksymalnym rozmiarze 256 bajtów (muszą być zakończone zerem z wartością
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Wyślij żądanie sterowania, aby urządzenie uruchomiło się w trybie akcesoriów. Żądanie dotyczące kontroli jest wysyłane z punktu końcowego 0 o tych cechach:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
Po wykonaniu tych czynności akcesorium powinno poczekać, aż podłączone urządzenie USB ponownie się zaloguje w trybie akcesorium, a następnie ponownie policzyć podłączone urządzenia. Jeśli urządzenie zostało przełączone do trybu akcesorium, algorytm określa obsługę trybu akcesorium, sprawdzając identyfikatory dostawcy i produktu, które powinny być prawidłowe (np. odpowiadać identyfikatorom dostawcy i produktu Google, a nie identyfikatorom producenta urządzenia). Jeśli identyfikatory i wersja są prawidłowe, akcesorium nawiązuje komunikację z urządzeniem.
Uwaga: AOA nie obsługuje obecnie jednoczesnych połączeń AOA i MTP. Aby przełączyć się z AOA na MTP, akcesorium musi najpierw odłączyć urządzenie USB (fizycznie lub elektrycznie), a następnie ponownie połączyć je za pomocą MTP.
Jeśli któryś z tych kroków się nie powiedzie, akcesorium stwierdzi, że urządzenie nie obsługuje trybu akcesoriów Androida, i zaczeka na połączenie z kolejną konsolą.
Nawiązanie komunikacji z urządzeniem
Jeśli akcesorium wykryje urządzenie z Androidem w trybie akcesorium, może wysłać zapytanie do interfejsu urządzenia i opisów punktów końcowych, aby uzyskać punkty końcowe zbiorcze do komunikacji z urządzeniem.
Liczba interfejsów i punktów końcowych zbiorczych zależy od identyfikatora usługi. Urządzenie z Androidem o identyfikatorze produktu:
0x2D00
ma jeden interfejs z 2 punktami końcowymi zbiorczymi do komunikacji wejściowej i wyjściowej.0x2D01
ma 2 interfejsy z 2 punktami końcowymi zbiorczymi do komunikacji wejściowej i wyjściowej. Pierwszy interfejs obsługuje standardową komunikację, a drugi – komunikację ADB. Aby użyć interfejsu, znajdź pierwsze punkty końcowe zbiorczego wejścia i wyjścia, ustaw konfigurację urządzenia na wartość 1 za pomocą żądania urządzeniaSET_CONFIGURATION
(0x09
), a następnie komunikuj się za pomocą punktów końcowych.