Akcesoria USB z systemem Android muszą być zgodne z protokołem Android Open Accessory (AOA), który definiuje sposób, w jaki akcesorium wykrywa i konfiguruje komunikację z urządzeniem z systemem Android. Akcesoria powinny wykonywać następujące kroki:
- Poczekaj i wykryj podłączone urządzenie.
- Określ obsługę trybu akcesoriów urządzenia.
- Spróbuj uruchomić urządzenie w trybie akcesoriów (w razie potrzeby).
- Jeśli urządzenie obsługuje AOA, nawiąż komunikację z urządzeniem.
W poniższych sekcjach wyjaśniono, jak wykonać te kroki.
Poczekaj i wykryj podłączone urządzenia
Akcesoria powinny stale sprawdzać, czy są podłączone urządzenia z systemem Android. Po podłączeniu urządzenia akcesorium powinno określić, czy obsługuje ono tryb akcesoriów.
Określ obsługę trybu akcesoriów
Gdy urządzenie z systemem Android łączy się, może znajdować się w jednym z trzech stanów:
- Obsługuje tryb akcesoriów Android i jest już w trybie akcesoriów.
- Obsługuje tryb akcesoriów Android, ale nie jest w trybie akcesoriów.
- Nie obsługuje trybu akcesoriów Androida.
Podczas początkowego połączenia akcesorium powinno sprawdzić wersję, identyfikator dostawcy i identyfikator produktu deskryptora urządzenia USB podłączonego urządzenia. Identyfikator dostawcy powinien być zgodny z identyfikatorem Google ( 0x18D1
). Jeśli urządzenie jest już w trybie akcesorium, identyfikator produktu powinien wynosić 0x2D00
lub 0x2D01
, a akcesorium może nawiązać komunikację z urządzeniem za pośrednictwem 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 systemem Android obsługujących tryb akcesoriów. 0x2D01
jest zarezerwowane dla urządzeń obsługujących tryb akcesoriów, a także protokół Android Debug Bridge (ADB), który udostępnia drugi interfejs z dwoma zbiorczymi punktami końcowymi dla ADB. Tych punktów końcowych można używać do debugowania aplikacji akcesoriów, jeśli symulujesz akcesorium na komputerze. Ogólnie rzecz biorąc, nie używaj tego interfejsu, chyba że akcesorium implementuje przejście do ADB na urządzeniu.
Jeśli wersja, identyfikator dostawcy lub identyfikator produktu w deskryptorze urządzenia USB nie są zgodne z oczekiwanymi wartościami, akcesorium nie może określić, czy urządzenie obsługuje tryb akcesorium Android. Akcesorium powinno próbować uruchomić urządzenie w trybie akcesoriów (szczegóły poniżej) w celu określenia obsługi urządzenia.
Kluczowa uwaga: akcesorium USB musi wysłać nagłówek po pierwszym uzgadnianiu. Nagłówek zawiera producenta, model i wersję. Chociaż wersja jest polem opcjonalnym, jeśli zainstalowana jest aplikacja dla systemu Android, która jest zgodna tylko z wersją, ale akcesorium nie wysyła wersji, urządzenia z systemem Android 10 i starszym zostaną ponownie uruchomione z powodu wykrycia wyjątku w procesie systemowym.
Spróbuj uruchomić w trybie akcesoriów
Jeśli identyfikatory wersji, dostawcy i produktu nie odpowiadają urządzeniu z systemem Android w trybie akcesoriów, akcesorium nie może określić, czy urządzenie obsługuje tryb akcesoriów (ale nie jest w nim) lub czy nie obsługuje trybu akcesoriów. Może się tak zdarzyć, ponieważ urządzenia obsługujące tryb akcesoriów (ale nie w trybie akcesoriów) początkowo zgłaszają identyfikatory producenta i producenta urządzenia zamiast identyfikatorów dostawcy i produktu AOA .
Akcesorium powinno spróbować uruchomić urządzenie w trybie akcesoriów, aby określić, czy urządzenie obsługuje ten tryb:
- Wyślij żądanie sterowania 51 („Pobierz protokół”), aby sprawdzić, czy urządzenie obsługuje protokół akcesoriów Androida. Jeśli urządzenie obsługuje protokół, zwraca niezerową liczbę, która reprezentuje obsługiwaną wersję protokołu. Żądanie sterujące znajduje się w punkcie końcowym 0 o następującej charakterystyce:
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 zwraca obsługiwaną wersję protokołu, wyślij do urządzenia żądanie sterowania z identyfikującą informacją o ciągu znaków. Informacje te umożliwiają urządzeniu określenie odpowiedniej aplikacji dla akcesorium (lub przedstawienie użytkownikowi adresu URL, jeśli odpowiednia aplikacja nie istnieje). Żądanie sterujące znajduje się w punkcie końcowym 0 (dla każdego identyfikatora ciągu) o następującej charakterystyce:
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 o maksymalnym rozmiarze 256 bajtów dla każdego ciągu (musi być zakończony zerem z
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Wyślij żądanie sterowania, aby poprosić urządzenie o uruchomienie w trybie akcesoriów. Żądanie sterujące znajduje się w punkcie końcowym 0 o następującej charakterystyce:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
Po wykonaniu tych kroków akcesorium powinno poczekać, aż podłączone urządzenie USB ponownie pojawi się w magistrali w trybie akcesorium, a następnie ponownie wyliczyć podłączone urządzenia. Algorytm określa obsługę trybu akcesoriów, sprawdzając identyfikatory dostawcy i produktu, które powinny być poprawne (na przykład odpowiadać identyfikatorom dostawcy i produktu Google zamiast identyfikatorom producenta urządzenia), jeśli urządzenie pomyślnie przełączyło się w tryb akcesoriów. Jeśli identyfikatory i wersja są poprawne, akcesorium rusza w celu nawiązania komunikacji 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 w sposób równoważny elektrycznie), a następnie ponownie podłączyć za pomocą MTP.
Jeśli jakikolwiek krok się nie powiedzie, akcesorium określa, że urządzenie nie obsługuje trybu akcesoriów Android i czeka na połączenie z następnym urządzeniem.
Nawiąż komunikację z urządzeniem
Jeśli akcesorium wykryje urządzenie z systemem Android w trybie akcesorium, może wysłać zapytanie do interfejsu urządzenia i deskryptorów punktów końcowych w celu uzyskania zbiorczych punktów końcowych do komunikacji z urządzeniem.
Liczba interfejsów i zbiorczych punktów końcowych zależy od identyfikatora produktu. Urządzenie z systemem Android o identyfikatorze produktu:
-
0x2D00
ma jeden interfejs z dwoma zbiorczymi punktami końcowymi do komunikacji wejściowej i wyjściowej. -
0x2D01
ma dwa interfejsy z dwoma punktami końcowymi masowymi, każdy do komunikacji wejściowej i wyjściowej. Pierwszy interfejs obsługuje komunikację standardową, a drugi interfejs obsługuje komunikację ADB. Aby użyć interfejsu, zlokalizuj pierwsze zbiorcze wejściowe i wyjściowe punkty końcowe, 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.