Otwarty protokół akcesoriów Android 1.0

Akcesoria Android USB muszą być zgodne z protokołem Android Open Accessory (AOA), który określa, w jaki sposób akcesorium wykrywa i konfiguruje komunikację z urządzeniem z systemem Android. Akcesoria powinny wykonać następujące czynności:

  1. Poczekaj i wykryj podłączone urządzenie.
  2. Określ obsługę trybu akcesoriów urządzenia.
  3. Spróbuj uruchomić urządzenie w trybie akcesoriów (w razie potrzeby).
  4. Jeśli urządzenie obsługuje AOA, nawiąż komunikację z urządzeniem.

W poniższych sekcjach wyjaśniono, jak wdrożyć te kroki.

Poczekaj i wykryj podłączone urządzenia

Akcesoria powinny stale sprawdzać, czy są podłączone urządzenia z systemem Android. Gdy urządzenie jest podłączone, akcesorium powinno określać, czy urządzenie obsługuje tryb akcesoriów.

Określ obsługę trybu akcesoriów

Uwaga: debugowanie USB nie jest wymagane do podłączania akcesoriów, ale ADB może być konieczne podczas programowania. Aby uzyskać szczegółowe informacje, zobacz Uwagi dotyczące debugowania .

Gdy urządzenie z systemem Android się łączy, może znajdować się w jednym z trzech stanów:

  • Obsługuje tryb akcesoriów Androida i jest już w trybie akcesoriów.
  • Obsługuje tryb akcesoriów Androida, ale nie jest w trybie akcesoriów.
  • Nie obsługuje trybu akcesoriów Androida.

Podczas pierwszego 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 akcesoriów, identyfikator produktu powinien mieć wartość 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 akcesoriów).

Uwaga: 0x2D00 jest zarezerwowany dla urządzeń z systemem Android obsługujących tryb akcesoriów. 0x2D01 jest zarezerwowany 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. Możesz użyć tych punktów końcowych do debugowania aplikacji akcesoriów, jeśli symulujesz akcesorium na komputerze. Zasadniczo nie używaj tego interfejsu, chyba że akcesorium implementuje przekazywanie do ADB na urządzeniu.

Jeśli wersja, identyfikator dostawcy lub identyfikator produktu w deskryptorze urządzenia USB nie odpowiadają oczekiwanym wartościom, akcesorium nie może określić, czy urządzenie obsługuje tryb akcesoriów Android. Akcesorium powinno podjąć próbę uruchomienia urządzenia w trybie akcesoriów (szczegóły poniżej), aby określić obsługę urządzenia.

Kluczowy punkt: akcesorium USB musi wysłać nagłówek po wstępnym uzgodnieniu. Nagłówek zawiera producenta, model i wersję. Chociaż wersja jest polem opcjonalnym, jeśli zainstalowana jest aplikacja na Androida, która jest zgodna tylko z wersją, ale akcesorium nie wysyła wersji, urządzenia z systemem Android w wersji 10 lub starszej uruchomią się ponownie z powodu zgłoszenia wyjątku w procesie systemowym.

Spróbuj uruchomić w trybie akcesoriów

Jeśli wersja, dostawca i identyfikatory produktu nie odpowiadają urządzeniu z systemem Android w trybie akcesoriów, akcesorium nie może określić, czy urządzenie obsługuje (ale nie jest) w trybie akcesoriów lub czy urządzenie nie obsługuje trybu akcesoriów. Może się to zdarzyć, ponieważ urządzenia, które obsługują tryb akcesoriów (ale nie są w trybie akcesoriów), początkowo zgłaszają identyfikatory dostawcy i produktu producenta urządzenia zamiast identyfikatora 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:

  1. Wyślij żądanie kontroli 51 („Pobierz protokół”), aby ustalić, czy urządzenie obsługuje protokół akcesoriów Android. Jeśli urządzenie obsługuje protokół, zwraca liczbę różną od zera, która reprezentuje obsługiwaną wersję protokołu. Żądanie sterowania dotyczy punktu końcowego 0 z następującą charakterystyką:
    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)
    
  2. Jeśli urządzenie zwróci obsługiwaną wersję protokołu, wyślij do urządzenia żądanie sterowania z informacjami identyfikacyjnymi. Ta informacja pozwala urządzeniu określić odpowiednią aplikację dla akcesorium (lub przedstawić użytkownikowi adres URL, jeśli odpowiednia aplikacja nie istnieje). Żądanie kontroli znajduje się w punkcie końcowym 0 (dla każdego identyfikatora ciągu) z następującymi 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, z maksymalnym rozmiarem 256 bajtów dla każdego ciągu (musi być zakończone zerem \0 ).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Wyślij żądanie sterowania, aby poprosić urządzenie o uruchomienie w trybie akcesoriów. Żądanie sterowania dotyczy punktu końcowego 0 z następującą charakterystyką:
    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 wprowadzi się do magistrali w trybie akcesoriów, 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ć prawidłowe (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ą prawidłowe, akcesorium przesunie się, aby nawiązać 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 w równoważny sposób elektryczny), a następnie połączyć się ponownie za pomocą protokołu MTP.

Jeśli jakikolwiek krok się nie powiedzie, akcesorium ustali, ż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, aby uzyskać zbiorcze punkty końcowe do komunikacji z urządzeniem.

Liczba interfejsów i masowych 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 zbiorczymi punktami końcowymi do komunikacji wejściowej i wyjściowej. Pierwszy interfejs obsługuje standardową komunikację, a drugi interfejs obsługuje komunikację ADB. Aby użyć interfejsu, zlokalizuj pierwsze zbiorcze punkty końcowe wejścia i wyjścia, ustaw konfigurację urządzenia na wartość 1 za pomocą żądania urządzenia SET_CONFIGURATION ( 0x09 ), a następnie komunikuj się za pomocą punktów końcowych.