Aksesori USB Android harus mematuhi protokol Android Open Accessory (AOA), yang menentukan cara aksesori mendeteksi dan menyiapkan komunikasi dengan perangkat yang didukung Android. Aksesori harus melakukan langkah-langkah berikut:
- Menunggu dan mendeteksi perangkat yang terhubung.
- Menentukan dukungan mode aksesori perangkat.
- Coba mulai perangkat dalam mode aksesori (jika diperlukan).
- Jika perangkat mendukung AOA, buat komunikasi dengan perangkat.
Bagian berikut menjelaskan cara menerapkan langkah-langkah ini.
Menunggu dan mendeteksi perangkat yang terhubung
Aksesori harus terus memeriksa perangkat yang terhubung dan didukung Android. Saat perangkat terhubung, aksesori harus menentukan apakah perangkat mendukung mode aksesori.
Menentukan dukungan mode aksesori
Catatan: Proses debug USB tidak diperlukan untuk menghubungkan aksesori, tetapi ADB mungkin diperlukan selama pengembangan. Untuk mengetahui detailnya, lihat Pertimbangan proses debug.
Saat terhubung, perangkat yang didukung Android dapat berada dalam 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 deskripsi perangkat USB perangkat yang terhubung. ID vendor
harus cocok dengan ID Google (0x18D1
). Jika perangkat sudah dalam
mode aksesori, ID produk harus berupa 0x2D00
atau
0x2D01
dan aksesori dapat
membangun komunikasi dengan
perangkat melalui endpoint transfer massal menggunakan protokol
komunikasi sendiri (perangkat tidak perlu dimulai dalam mode aksesori).
Catatan: 0x2D00
dicadangkan untuk
perangkat yang didukung Android yang mendukung mode aksesori. 0x2D01
disediakan untuk perangkat yang mendukung mode aksesori serta protokol Android Debug
Bridge (ADB), yang mengekspos antarmuka kedua dengan dua endpoint massal
untuk ADB. Anda dapat menggunakan endpoint ini untuk men-debug aplikasi aksesori jika
Anda menyimulasikan aksesori di komputer. Secara umum, jangan gunakan
antarmuka ini kecuali jika aksesori menerapkan passthrough ke ADB di perangkat.
Jika versi, ID vendor, atau ID produk dalam deskripsi perangkat USB tidak cocok dengan nilai yang diharapkan, aksesori tidak dapat menentukan apakah perangkat mendukung mode aksesori Android. Aksesori akan mencoba memulai perangkat dalam mode aksesori (dijelaskan di bawah) untuk menentukan dukungan perangkat.
Poin penting: Aksesori USB harus mengirim header setelah handshake awal. Header berisi produsen, model, dan versi. Meskipun versi adalah kolom opsional, jika aplikasi Android diinstal yang hanya cocok dengan versi, tetapi aksesori tidak mengirim versi, perangkat Android yang berjalan di Android 10 dan yang lebih lama akan dimulai ulang karena pengecualian ditampilkan dalam proses sistem.
Mencoba memulai dalam mode aksesori
Jika ID versi, vendor, dan produk tidak sesuai dengan perangkat yang didukung 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 ID produk dan vendor produsen perangkat, bukan ID produk dan vendor AOA.
Aksesori harus mencoba memulai perangkat dalam mode aksesori untuk menentukan apakah perangkat mendukung mode tersebut:
- Kirim permintaan kontrol 51 ("Get Protocol") untuk menentukan apakah perangkat
mendukung protokol aksesori Android. Jika mendukung protokol,
perangkat akan menampilkan angka non-nol yang mewakili versi protokol yang didukung.
Permintaan kontrol berada di endpoint 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)
- Jika perangkat menampilkan versi protokol yang didukung, kirim permintaan kontrol
dengan informasi string identifikasi ke perangkat. Informasi ini memungkinkan
perangkat menentukan aplikasi yang sesuai untuk aksesori (atau menampilkan
URL kepada pengguna jika tidak ada aplikasi yang sesuai). Permintaan kontrol berada di endpoint 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 dengan
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Kirim permintaan kontrol untuk meminta perangkat memulai dalam mode aksesori. Permintaan kontrol berada di endpoint 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 untuk memperkenalkan dirinya kembali di bus dalam mode aksesori, lalu menghitung ulang perangkat yang terhubung. Algoritma menentukan dukungan mode aksesori dengan memeriksa ID vendor dan produk, yang harus benar (misalnya, sesuai dengan ID vendor dan produk Google, bukan dengan ID produsen perangkat) jika perangkat berhasil beralih ke mode aksesori. Jika ID dan versi sudah benar, aksesori akan beralih untuk membangun 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 maupun secara listrik yang setara), lalu menghubungkan kembali menggunakan MTP.
Jika ada langkah yang gagal, aksesori akan menentukan bahwa perangkat tidak mendukung mode aksesori Android dan menunggu perangkat berikutnya terhubung.
Melakukan komunikasi dengan perangkat
Jika aksesori mendeteksi perangkat yang didukung Android dalam mode aksesori, aksesori dapat mengkueri antarmuka perangkat dan deskripsi endpoint untuk mendapatkan endpoint massal guna berkomunikasi dengan perangkat.
Jumlah antarmuka dan endpoint massal bergantung pada ID produk. Perangkat yang didukung Android dengan ID produk:
0x2D00
memiliki satu antarmuka dengan dua endpoint massal untuk komunikasi input dan output.0x2D01
memiliki dua antarmuka dengan dua endpoint massal masing-masing untuk komunikasi input dan output. Antarmuka pertama menangani komunikasi standar dan antarmuka kedua menangani komunikasi ADB. Untuk menggunakan antarmuka, temukan endpoint input dan output massal pertama, tetapkan konfigurasi perangkat ke nilai 1 dengan permintaan perangkatSET_CONFIGURATION
(0x09
), lalu berkomunikasi menggunakan endpoint.