Bu belgede, Android Açık Aksesuar (AOA) protokolünde ilk sürümden bu yana yapılan değişiklikler açıklanmakta ve AOA 1.0 dokümanları desteklenmektedir. AOAv2 aşağıdaki özellikleri ekler:
- Ses çıkışı (Android 8.0'da desteği sonlandırıldı).
- Android cihazda bir veya daha fazla insan arabirim cihazı (HID) olarak işlev gören aksesuar desteği.
Android uygulama geliştiricilerinin kullanabileceği Android SDK API'lerinde değişiklik yapılmamıştır.
AOAv2 desteğini algılama
Bağlı bir Android cihazın aksesuarları ve desteklenen protokol sürümünü destekleyip desteklemediğini belirlemek için aksesuarın bir getProtocol()
komut göndermesi ve sonucu kontrol etmesi gerekir. Yalnızca AOAv1'deki özellikleri destekleyen Android cihazlar, protokol sürümü olarak 1
döndürmelidir; AOAv2'deki ek özellikleri destekleyen cihazlar, protokol sürümü olarak 2
döndürmelidir. AOAv2, AOAv1 ile geriye dönük uyumludur. Bu nedenle, orijinal aksesuar protokolü için tasarlanmış aksesuarlar daha yeni Android cihazlarla çalışmaya devam eder.
Aksesuar Geliştirme Kiti 2011 kaynak kodu (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) kitaplığındaki aşağıdaki örnekte bu protokol kontrolü gösterilmektedir:
bool AndroidAccessory::switchDevice(byte addr) { int protocol = getProtocol(addr); if (protocol >= 1) { Serial.print("device supports protocol 1 or higher\n"); } else { Serial.print("could not read device protocol version\n"); return false; } sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer); sendString(addr, ACCESSORY_STRING_MODEL, model); sendString(addr, ACCESSORY_STRING_DESCRIPTION, description); sendString(addr, ACCESSORY_STRING_VERSION, version); sendString(addr, ACCESSORY_STRING_URI, uri); sendString(addr, ACCESSORY_STRING_SERIAL, serial); usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL); return true; }
AOAv2, aksesuar modunda kullanılabilen her USB arayüzü kombinasyonu için yeni USB ürün kimlikleri içerir:
Sürüm | Ürün Kimliği | İletişim | Açıklama |
---|---|---|---|
AOAv1 | 0x2D00 |
aksesuar | Android uygulamasıyla iletişim kurmak için iki toplu uç nokta sağlar. |
0x2D01 |
aksesuar + adb | Aksesuar geliştirme sırasında hata ayıklama amacıyla. Yalnızca kullanıcı Android cihaz ayarlarında USB Hata Ayıklama'yı etkinleştirdiyse kullanılabilir. | |
AOAv2 | 0x2D02 |
Ses | Android cihazdan aksesuara ses aktarmak için. |
0x2D03 |
ses + adb | ||
0x2D04 |
aksesuar + ses | ||
0x2D05 |
aksesuar + ses + adb |
AOAv1'de kullanılan ürün kimlikleri (0x2D00
ve 0x2D01
), AOAv2'de desteklenmeye devam eder.
Ses desteği
AOAv2, 44.100 Khz bit hızında 2 kanallı, 16 bit PCM ses sunabilen standart bir USB ses sınıfı arayüzü aracılığıyla Android cihazdan aksesuara ses çıkışı desteği içerir (gelecekte ek ses modları eklenebilir).
Ses desteğini etkinleştirmek için aksesuarın yeni bir USB kontrol isteği göndermesi gerekir:
**SET_AUDIO_MODE** requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 58 value: 0 for no audio (default), 1 for 2 channel, 16-bit PCM at 44100 KHz index: 0 data none
Bu komut, aksesuar moduna girmek için ACCESSORY_START
komutu gönderilmeden önce gönderilmelidir.
HID desteği
AOAv2, aksesuarların bir veya daha fazla USB insan arabirim cihazını (HID) Android cihaza kaydetmesine olanak tanır. Bu yaklaşım, USB fareler ve klavyeler gibi tipik USB HID cihazlarının iletişim yönünü tersine çevirir. Normalde HID cihaz, bir USB ana makinesine (ör. kişisel bilgisayar) bağlı bir çevre birimidir ancak AOA'da USB ana makinesi, bir USB çevre birimine bir veya daha fazla giriş cihazı olarak davranabilir.
HID desteği, standart HID etkinlikleri için bir proxy'dir; uygulama, etkinliklerin içeriği veya türü hakkında hiçbir varsayımda bulunmaz ve yalnızca giriş sistemine iletir. Böylece bir AOAv2 aksesuarı, herhangi bir HID cihazı (fare, klavye, oyun kumandası vb.) gibi davranabilir. Medya yuvası üzerindeki oynatma/duraklatma düğmesi gibi temel işlevler veya fare ve tam QWERTY klavyesi bulunan bağlantı istasyonu gibi gelişmiş işlevler sağlamak için HID desteğini kullanabilirsiniz.
AOAv2, aksesuarın Android cihazda bir veya daha fazla HID giriş cihazı gibi davranmasına olanak tanıyan yeni USB kontrol istekleri ekler. HID desteği tamamen sıfır uç noktadaki kontrol istekleri aracılığıyla yönetildiğinden yeni bir USB arayüzüne gerek yoktur. Dört yeni kontrol isteği şunlardır:
- ACCESSORY_REGISTER_HID, Android cihaza yeni bir HID cihazı kaydeder. Aksesuar, diğer üç çağrı için HID cihazını tanımlamak üzere kullanılan bir kimlik sağlar. Bu kimlik, USB bağlantısı kesilene veya aksesuar HID cihazının kaydını silmek için
ACCESSORY_UNREGISTER_HID
gönderene kadar geçerlidir. - ACCESSORY_UNREGISTER_HID, daha önce
ACCESSORY_REGISTER_HID
'ye kayıtlı bir HID cihazın kaydını siler. - ACCESSORY_SET_HID_REPORT_DESC, Android cihaza bir HID cihazı için rapor tanımlayıcı gönderir. Bu istek, HID cihazının özelliklerini açıklamak için kullanılır ve Android cihaza HID etkinlikleri bildirilmeden önce gönderilmelidir. Rapor tanımlayıcı sıfır uç noktası için maksimum paket boyutundan büyükse tanımlayıcının tamamını aktarmak üzere birden fazla
ACCESSORY_SET_HID_REPORT_DESC
komutu gönderilir. - ACCESSORY_SEND_HID_EVENT, aksesuardan Android cihaza giriş etkinlikleri gönderir.
Yeni kontrol isteklerinin kod tanımları şunlardır:
/* Control request for registering a HID device. * Upon registering, a unique ID is sent by the accessory in the * value parameter. This ID will be used for future commands for * the device * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_REGISTER_HID_DEVICE * value: Accessory assigned ID for the HID device * index: total length of the HID report descriptor * data none */ #define ACCESSORY_REGISTER_HID 54 /* Control request for unregistering a HID device. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_REGISTER_HID * value: Accessory assigned ID for the HID device * index: 0 * data none */ #define ACCESSORY_UNREGISTER_HID 55 /* Control request for sending the HID report descriptor. * If the HID descriptor is longer than the endpoint zero max packet size, * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC * commands. The data for the descriptor must be sent sequentially * if multiple packets are needed. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_SET_HID_REPORT_DESC * value: Accessory assigned ID for the HID device * index: offset of data in descriptor * (needed when HID descriptor is too big for one packet) * data the HID report descriptor */ #define ACCESSORY_SET_HID_REPORT_DESC 56 /* Control request for sending HID events. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_SEND_HID_EVENT * value: Accessory assigned ID for the HID device * index: 0 * data the HID report for the event */ #define ACCESSORY_SEND_HID_EVENT 57
AOAv1 ile birlikte çalışabilirlik
Orijinal protokol (AOAv1), bir Android uygulamasının USB üzerinden doğrudan bir USB ana makineyle (aksesuar) iletişim kurması için destek sağlar. AOAv2 bu desteği sürdürür ve aksesuarın Android işletim sistemiyle (özellikle ses ve giriş sistemleriyle) iletişim kurmasına olanak tanıyan yeni özellikler ekler. AOAv2'nin tasarımı, orijinal özellik grubuna ek olarak yeni ses ve HID desteğini kullanan bir aksesuar oluşturmayı mümkün kılar. Orijinal özelliklerle birlikte yeni özellikleri kullanmanız yeterlidir.
Android uygulaması olmadan AOAv2'ye bağlanma
Ses ve HID desteği kullanan ancak Android cihazdaki bir uygulamayla iletişim kurmayan bir aksesuar (ör. ses istasyonu) tasarlayabilirsiniz. Bu aksesuarlarda, kullanıcıların yeni takılan aksesuarı bulup onunla iletişim kurabilen bir Android uygulamasıyla ilişkilendirmek için iletişim istemleri almaları gerekmez.
Bir aksesuar bağlandıktan sonra bu tür iletişim kutularını engellemek için aksesuar, üretici ve model adlarını Android cihaza göndermemeyi seçebilir. Bu dizeler Android cihaza sağlanmadığında:
- Sistem, aksesuarla iletişim kuracak bir uygulama bulmaya çalışmaz.
- Cihaz aksesuar moduna girdikten sonra Android cihazın USB yapılandırmasında aksesuar USB arayüzü bulunmuyor.