Android USB aksesuarları, bir aksesuarın Android destekli bir cihazla iletişimi nasıl algıladığını ve kurduğunu tanımlayan Android Açık Aksesuar (AOA) protokolüne uymalıdır. Aksesuarlar aşağıdaki adımları gerçekleştirmelidir:
- Bağlı bir cihazı bekleyin ve algılayın.
- Cihazın aksesuar modu desteğini belirleyin.
- Cihazı aksesuar modunda başlatmayı deneyin (gerekirse).
- Cihaz AOA'yı destekliyorsa cihazla iletişim kurun.
Aşağıdaki bölümlerde bu adımların nasıl uygulanacağı açıklanmaktadır.
Bağlı cihazları bekleyin ve algılayın
Aksesuarlar, bağlı Android destekli cihazları sürekli olarak kontrol etmelidir. Bir cihaz bağlandığında, cihazın aksesuar modunu destekleyip desteklemediğini aksesuar belirlemelidir.
Aksesuar modu desteğini belirleyin
Android destekli bir cihaz bağlandığında, şu üç durumdan birinde olabilir:
- Android aksesuar modunu destekler ve zaten aksesuar modundadır.
- Android aksesuar modunu destekler ancak aksesuar modunda değildir.
- Android aksesuar modunu desteklemez.
İlk bağlantı sırasında aksesuar, bağlı cihazın USB cihazı tanımlayıcısının sürümünü, satıcı kimliğini ve ürün kimliğini kontrol etmelidir. Satıcı kimliği, Google'ın kimliğiyle ( 0x18D1
) eşleşmelidir. Cihaz zaten aksesuar modundaysa, ürün kimliği 0x2D00
veya 0x2D01
olmalıdır ve aksesuar, kendi iletişim protokolünü kullanarak toplu aktarım uç noktaları aracılığıyla cihazla iletişim kurabilir (cihazın aksesuar modunda başlatılması gerekmez).
Not: 0x2D00
, aksesuar modunu destekleyen Android destekli cihazlar için ayrılmıştır. 0x2D01
, ADB için iki toplu uç nokta ile ikinci bir arabirim ortaya çıkaran Android Hata Ayıklama Köprüsü (ADB) protokolünün yanı sıra aksesuar modunu destekleyen cihazlar için ayrılmıştır. Aksesuarı bir bilgisayarda simüle ediyorsanız, aksesuar uygulamasında hata ayıklamak için bu uç noktaları kullanabilirsiniz. Genel olarak, aksesuar cihazda ADB'ye geçiş uygulamadıkça bu arabirimi kullanmayın.
USB cihaz tanımlayıcısındaki sürüm, satıcı kimliği veya ürün kimliği beklenen değerlerle eşleşmiyorsa aksesuar, cihazın Android aksesuar modunu destekleyip desteklemediğini belirleyemez. Aksesuar, cihaz desteğini belirlemek için cihazı aksesuar modunda (aşağıda ayrıntılı olarak açıklanmıştır) başlatmaya çalışmalıdır.
Önemli nokta: Bir USB aksesuarı, ilk el sıkışma sırasında bir başlık göndermelidir. Başlık, üretici, model ve sürümü içerir. Sürüm isteğe bağlı bir alan olsa da, yalnızca sürümle eşleşen ancak aksesuar bir sürüm göndermeyen bir Android uygulaması yüklenirse, sistem sürecinde oluşturulan bir istisna nedeniyle Android 10 ve daha düşük sürümlerde çalışan Android cihazlar yeniden başlatılır.
Aksesuar modunda başlatmayı deneyin
Sürüm, satıcı ve ürün kimlikleri, aksesuar modunda Android destekli bir cihaza karşılık gelmiyorsa, aksesuar, cihazın aksesuar modunu destekleyip desteklemediğini (ancak içinde olmadığını) veya cihazın aksesuar modunu desteklemediğini belirleyemez. Bu, aksesuar modunu destekleyen (ancak aksesuar modunda olmayan) cihazların başlangıçta AOA satıcısı ve ürün kimlikleri yerine cihaz üreticisi satıcısını ve ürün kimliklerini bildirmesi nedeniyle oluşabilir.
Aksesuar, cihazın bu modu destekleyip desteklemediğini belirlemek için cihazı aksesuar modunda başlatmaya çalışmalıdır:
- Cihazın Android aksesuar protokolünü destekleyip desteklemediğini belirlemek için 51 kontrol isteği ("Get Protocol") gönderin. Cihaz protokolü destekliyorsa, desteklenen protokol sürümünü temsil eden sıfırdan farklı bir sayı döndürür. Kontrol isteği, aşağıdaki özelliklere sahip 0 uç noktasındadır:
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)
- Cihaz desteklenen bir protokol sürümü döndürürse, cihaza tanımlayıcı dize bilgilerini içeren bir kontrol isteği gönderin. Bu bilgi, cihazın aksesuar için uygun bir uygulama belirlemesine (veya uygun bir uygulama yoksa kullanıcıya bir URL sunmasına) olanak tanır. Kontrol isteği, aşağıdaki özelliklere sahip (her dize kimliği için) 0 uç noktasındadır:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
Aşağıdaki dize kimlikleri, her dize için maksimum 256 bayt boyutuyla desteklenir (
\0
ile sıfır sonlandırılmalıdır).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Aygıtın aksesuar modunda başlamasını istemek için bir kontrol isteği gönderin. Kontrol talebi, aşağıdaki özelliklere sahip 0 uç noktasındadır:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
Bu adımları tamamladıktan sonra, aksesuar bağlanan USB cihazının aksesuar modunda veri yolunda kendisini yeniden tanıtmasını beklemeli, ardından bağlı cihazları yeniden numaralandırmalıdır. Algoritma, cihaz başarıyla aksesuar moduna geçtiğinde doğru olması gereken (örneğin, cihaz üreticisinin kimlikleri yerine Google'ın satıcı ve ürün kimliklerine karşılık gelen) satıcı ve ürün kimliklerini kontrol ederek aksesuar modu desteğini belirler . Kimlikler ve sürüm doğruysa, aksesuar cihazla iletişim kurmak için hareket eder.
Not: AOA şu anda eşzamanlı AOA ve MTP bağlantılarını desteklememektedir. AOA'dan MTP'ye geçmek için, aksesuarın önce USB cihazının bağlantısını kesmesi (fiziksel veya elektriksel olarak eşdeğer bir şekilde) ve ardından MTP kullanarak yeniden bağlanması gerekir.
Herhangi bir adım başarısız olursa aksesuar, cihazın Android aksesuar modunu desteklemediğini belirler ve bir sonraki cihazın bağlanmasını bekler.
Cihazla iletişim kurun
Aksesuar, aksesuar modunda Android destekli bir cihaz algılarsa, cihazla iletişim kurmak için toplu uç noktaları elde etmek için cihaz arabirimini ve uç nokta tanımlayıcılarını sorgulayabilir.
Arabirimlerin ve toplu uç noktaların sayısı, ürün kimliğine bağlıdır. Ürün kimliğine sahip Android destekli bir cihaz:
-
0x2D00
, giriş ve çıkış iletişimi için iki toplu uç noktalı bir arabirime sahiptir. -
0x2D01
, her biri giriş ve çıkış iletişimi için iki toplu uç noktalı iki arabirime sahiptir. İlk arabirim standart iletişimi, ikinci arabirim ADB iletişimini yönetir. Bir arabirim kullanmak için, ilk toplu giriş ve çıkış uç noktalarını bulun, cihaz yapılandırmasını birSET_CONFIGURATION
(0x09
) cihaz isteğiyle 1 değerine ayarlayın, ardından uç noktaları kullanarak iletişim kurun.