Protokol Aksesori Terbuka Android 1.0

Aksesori USB Android harus mematuhi protokol Android Open Accessory (AOA), yang menentukan cara aksesori mendeteksi dan menyiapkan komunikasi dengan perangkat yang diberdayakan Android. Aksesori harus melakukan langkah-langkah berikut:

  1. Tunggu dan deteksi perangkat yang terhubung.
  2. Tentukan dukungan mode aksesori perangkat.
  3. Cobalah untuk memulai perangkat dalam mode aksesori (jika diperlukan).
  4. Jika perangkat mendukung AOA, buat komunikasi dengan perangkat.

Bagian berikut menjelaskan cara menerapkan langkah-langkah ini.

Tunggu dan deteksi perangkat yang terhubung

Aksesori harus terus-menerus memeriksa perangkat yang diberdayakan Android yang terhubung. Saat perangkat tersambung, aksesori harus menentukan apakah perangkat mendukung mode aksesori.

Tentukan dukungan mode aksesori

Saat perangkat yang diberdayakan Android terhubung, perangkat tersebut dapat berada di salah satu dari tiga status:

  • Mendukung mode aksesori Android dan sudah dalam mode aksesori.
  • Mendukung mode aksesori Android tetapi tidak dalam mode aksesori.
  • Tidak mendukung mode aksesori Android.

Selama koneksi awal, aksesori harus memeriksa versi, ID vendor, dan ID produk dari deskriptor perangkat USB perangkat yang terhubung. ID vendor harus cocok dengan ID Google ( 0x18D1 ). Jika perangkat sudah dalam mode aksesori, ID produk harus 0x2D00 atau 0x2D01 dan aksesori dapat menjalin komunikasi dengan perangkat melalui titik akhir transfer massal menggunakan protokol komunikasinya sendiri (perangkat tidak perlu dimulai dalam mode aksesori).

Catatan: 0x2D00 dicadangkan untuk perangkat yang diberdayakan Android yang mendukung mode aksesori. 0x2D01 dicadangkan untuk perangkat yang mendukung mode aksesori serta protokol Android Debug Bridge (ADB), yang menampilkan antarmuka kedua dengan dua titik akhir massal untuk ADB. Anda dapat menggunakan titik akhir ini untuk men-debug aplikasi aksesori jika Anda mensimulasikan aksesori di komputer. Secara umum, jangan gunakan antarmuka ini kecuali aksesori mengimplementasikan passthrough ke ADB pada perangkat.

Jika versi, ID vendor, atau ID produk di deskriptor perangkat USB tidak sesuai dengan nilai yang diharapkan, aksesori tidak dapat menentukan apakah perangkat mendukung mode aksesori Android. Aksesori harus mencoba memulai perangkat dalam mode aksesori (rinci di bawah) untuk menentukan dukungan perangkat.

Poin kunci: Aksesori USB harus mengirim header saat handshake awal. Header berisi pabrikan, model, dan versi. Meskipun versi adalah bidang opsional, jika aplikasi Android diinstal yang hanya cocok dengan versi, tetapi aksesori tidak mengirim versi, perangkat Android yang menjalankan Android 10 dan di bawahnya akan reboot karena pengecualian yang dilemparkan dalam proses sistem.

Cobalah untuk memulai dalam mode aksesori

Jika versi, vendor, dan ID produk tidak sesuai dengan perangkat yang diberdayakan Android dalam mode aksesori, aksesori tidak dapat menentukan apakah perangkat mendukung (tetapi tidak dalam) mode aksesori atau apakah perangkat tidak mendukung mode aksesori. Hal ini dapat terjadi karena perangkat yang mendukung mode aksesori (tetapi tidak dalam mode aksesori) awalnya melaporkan vendor produsen perangkat dan ID produk, bukan vendor AOA dan ID produk.

Aksesori harus mencoba memulai perangkat dalam mode aksesori untuk menentukan apakah perangkat mendukung mode tersebut:

  1. Kirim permintaan kontrol 51 ("Dapatkan Protokol") untuk menentukan apakah perangkat mendukung protokol aksesori Android. Jika perangkat mendukung protokol, ia mengembalikan angka bukan nol yang mewakili versi protokol yang didukung. Permintaan kontrol ada di titik akhir 0 dengan karakteristik berikut:
    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. Jika perangkat mengembalikan versi protokol yang didukung, kirim permintaan kontrol dengan mengidentifikasi informasi string ke perangkat. Informasi ini memungkinkan perangkat untuk menentukan aplikasi yang sesuai untuk aksesori (atau menyajikan URL kepada pengguna jika aplikasi yang sesuai tidak ada). Permintaan kontrol ada di titik akhir 0 (untuk setiap ID string) dengan karakteristik berikut:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    ID string berikut didukung, dengan ukuran maksimum 256 byte untuk setiap string (harus diakhiri dengan nol \0 ).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Kirim permintaan kontrol untuk meminta perangkat memulai dalam mode aksesori. Permintaan kontrol ada di titik akhir 0 dengan karakteristik berikut:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

Setelah menyelesaikan langkah-langkah ini, aksesori harus menunggu perangkat USB yang terhubung memperkenalkan dirinya kembali di bus dalam mode aksesori, lalu menghitung ulang perangkat yang terhubung. Algoritme menentukan dukungan mode aksesori dengan memeriksa vendor dan ID produk, yang harus benar (misalnya, sesuai dengan vendor dan ID produk Google, bukan ID produsen perangkat) jika perangkat berhasil beralih ke mode aksesori. Jika ID dan versi sudah benar, aksesori akan bergerak untuk menjalin komunikasi dengan perangkat .

Catatan: AOA saat ini tidak mendukung koneksi AOA dan MTP secara bersamaan. Untuk beralih dari AOA ke MTP, aksesori harus terlebih dahulu memutuskan sambungan perangkat USB (baik secara fisik atau dengan cara yang setara secara elektrik) lalu menyambungkan kembali menggunakan MTP.

Jika ada langkah yang gagal, aksesori menentukan perangkat tidak mendukung mode aksesori Android dan menunggu perangkat berikutnya terhubung.

Jalin komunikasi dengan perangkat

Jika aksesori mendeteksi perangkat yang diberdayakan Android dalam mode aksesori, aksesori dapat menanyakan antarmuka perangkat dan deskriptor titik akhir untuk mendapatkan titik akhir massal untuk berkomunikasi dengan perangkat.

Jumlah antarmuka dan titik akhir massal bergantung pada ID produk. Perangkat yang diberdayakan Android dengan ID produk:

  • 0x2D00 memiliki satu antarmuka dengan dua titik akhir massal untuk komunikasi input dan output.
  • 0x2D01 memiliki dua antarmuka dengan dua titik akhir massal masing-masing untuk komunikasi input dan output. Antarmuka pertama menangani komunikasi standar dan antarmuka kedua menangani komunikasi ADB. Untuk menggunakan antarmuka, temukan titik akhir input dan output massal pertama, setel konfigurasi perangkat ke nilai 1 dengan permintaan perangkat SET_CONFIGURATION ( 0x09 ), lalu komunikasikan menggunakan titik akhir.