Bu belge, ilk sürümünden bu yana Android Açık Aksesuar (AOA) protokolündeki değişiklikleri açıklar ve AOA 1.0 belgelerini tamamlar. AOAv2 aşağıdaki özellikleri ekler:
- Ses çıkışı (Android 8.0'da kullanımdan kaldırıldı).
- Android cihaza bir veya daha fazla insan arabirim cihazı (HID) görevi gören aksesuar desteği.
Android uygulama geliştiricilerine sunulan Android SDK API'lerinde değişiklik yoktur.
AOAv2 desteğini algılama
Bağlı bir Android cihazının aksesuarları ve desteklenen protokol sürümünü destekleyip desteklemediğini belirlemek için bir aksesuarın bir getProtocol()
komutu 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 tasarlanan aksesuarlar daha yeni Android cihazlarla çalışmaya devam eder.
Aksesuar Geliştirme Kiti 2011 kaynak kodundan ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) aşağıdaki örnek, bu protokol kontrolünü gösterir:
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 bir USB arabirimi kombinasyonu için yeni USB ürün kimlikleri içerir:
Sürüm | ürün kimliği | İletişim | Tanım |
---|---|---|---|
AOAv1 | 0x2D00 | aksesuar | Bir 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ıklamayı etkinleştirmişse kullanılabilir. | |
AOAv2 | 0x2D02 | ses | Bir Android cihazdan bir aksesuara ses akışı için. |
0x2D03 | ses + adb | ||
0x2D04 | aksesuar + ses | ||
0x2D05 | aksesuar + ses + adb |
AOAv1'de ( 0x2D00
ve 0x2D01
) kullanılan ürün kimlikleri AOAv2'de desteklenmeye devam ediyor.
Ses desteği
AOAv2, 2 kanal, 44100 Khz bit hızına sahip 16 bit PCM ses özelliğine sahip standart bir USB ses sınıfı arabirimi aracılığıyla bir Android cihazından bir 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
Aksesuar moduna girmek için ACCESSORY_START
komutu gönderilmeden önce bu komut gönderilmelidir.
HID desteği
AOAv2, aksesuarların bir veya daha fazla USB İnsan Arayüzü Aygıtını (HID) bir Android aygıtla kaydetmesine olanak tanır. Bu yaklaşım, USB fareler ve klavyeler gibi tipik USB HID aygıtları için iletişim yönünü tersine çevirir. Normalde, HID cihazı bir USB ana bilgisayarına (yani bir kişisel bilgisayara) bağlı bir çevre birimidir, ancak AOA'da USB ana bilgisayarı bir USB çevre birimine bir veya daha fazla giriş cihazı olarak işlev görebilir.
HID desteği, standart HID olayları için bir proxy'dir; uygulama, olayların içeriği veya türü hakkında hiçbir varsayımda bulunmaz ve bunu giriş sistemine iletir, böylece bir AOAv2 aksesuarının herhangi bir HID cihazı (fare, klavye, oyun kumandası, vb.) gibi davranmasını sağlar. HID desteğini, medya yuvasındaki oynat/duraklat düğmesi gibi temel işlevleri sağlamak veya fare ve tam QWERTY klavyesi olan bir yerleştirme istasyonu gibi gelişmiş işlevler için kullanabilirsiniz.
AOAv2, aksesuarın Android cihazına bir veya daha fazla HID giriş cihazı gibi davranmasını sağlayan yeni USB kontrol istekleri ekler. HID desteği tamamen sıfır uç noktasındaki kontrol istekleri aracılığıyla gerçekleştirilir, bu nedenle yeni bir USB arabirimine gerek yoktur. Dört yeni kontrol talebi şunlardır:
- ACCESSORY_REGISTER_HID , Android cihazla yeni bir HID cihazı kaydeder. Aksesuar, diğer üç arama için HID cihazını tanımlamak için 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
ile kayıtlı bir HID cihazının kaydını siler. - ACCESSORY_SET_HID_REPORT_DESC , Android cihaza bir HID cihazı için bir rapor tanımlayıcı gönderir. Bu istek, HID cihazının özelliklerini açıklamak için kullanılır ve Android cihaza herhangi bir HID olayı rapor edilmeden önce gönderilmelidir. Rapor tanımlayıcısı sıfır uç noktası için maksimum paket boyutundan büyükse, tanımlayıcının tamamını aktarmak için birden çok
ACCESSORY_SET_HID_REPORT_DESC
komutu gönderilir. - ACCESSORY_SEND_HID_EVENT , giriş olaylarını aksesuardan Android cihaza gönderir.
Yeni kontrol istekleri için 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 bir USB ana bilgisayarı (aksesuar) ile doğrudan iletişim kurmasını destekler. AOAv2 bu desteği sürdürür ve aksesuarın Android işletim sisteminin kendisiyle (özellikle ses ve giriş sistemleri) iletişim kurmasını sağlamak için yeni özellikler ekler. AOAv2'nin tasarımı, orijinal özellik setine ek olarak yeni ses ve HID desteğini kullanan bir aksesuar oluşturmayı mümkün kılar. Yeni özellikleri orijinal özelliklerle birlikte kullanmanız yeterlidir.
AOAv2'yi Android uygulaması olmadan bağlama
Ses ve HID desteğini kullanan ancak Android cihazdaki bir uygulamayla iletişim kurmayan bir aksesuar (ses yuvası gibi) tasarlayabilirsiniz. Bu aksesuarlar için, kullanıcıların yeni eklenen aksesuarı bulmak ve onunla iletişim kurabilen bir Android uygulamasıyla ilişkilendirmek için iletişim istemleri alması gerekmez.
Bir aksesuar bağlandıktan sonra bu tür diyalogları bastırmak 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 kurmak için bir uygulama bulmaya çalışmaz.
- Cihaz aksesuar moduna girdikten sonra, Android cihaz USB yapılandırmasında aksesuar USB arabirimi mevcut değil.
Bu belge, ilk sürümünden bu yana Android Açık Aksesuar (AOA) protokolündeki değişiklikleri açıklar ve AOA 1.0 belgelerini tamamlar. AOAv2 aşağıdaki özellikleri ekler:
- Ses çıkışı (Android 8.0'da kullanımdan kaldırıldı).
- Android cihaza bir veya daha fazla insan arabirim cihazı (HID) görevi gören aksesuar desteği.
Android uygulama geliştiricilerine sunulan Android SDK API'lerinde değişiklik yoktur.
AOAv2 desteğini algılama
Bağlı bir Android cihazının aksesuarları ve desteklenen protokol sürümünü destekleyip desteklemediğini belirlemek için bir aksesuarın bir getProtocol()
komutu 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 tasarlanan aksesuarlar daha yeni Android cihazlarla çalışmaya devam eder.
Aksesuar Geliştirme Kiti 2011 kaynak kodundan ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) aşağıdaki örnek, bu protokol kontrolünü gösterir:
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 bir USB arabirimi kombinasyonu için yeni USB ürün kimlikleri içerir:
Sürüm | ürün kimliği | İletişim | Tanım |
---|---|---|---|
AOAv1 | 0x2D00 | aksesuar | Bir 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ıklamayı etkinleştirmişse kullanılabilir. | |
AOAv2 | 0x2D02 | ses | Bir Android cihazdan bir aksesuara ses akışı için. |
0x2D03 | ses + adb | ||
0x2D04 | aksesuar + ses | ||
0x2D05 | aksesuar + ses + adb |
AOAv1'de ( 0x2D00
ve 0x2D01
) kullanılan ürün kimlikleri AOAv2'de desteklenmeye devam ediyor.
Ses desteği
AOAv2, 2 kanal, 44100 Khz bit hızına sahip 16 bit PCM ses özelliğine sahip standart bir USB ses sınıfı arabirimi aracılığıyla bir Android cihazından bir 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
Aksesuar moduna girmek için ACCESSORY_START
komutu gönderilmeden önce bu komut gönderilmelidir.
HID desteği
AOAv2, aksesuarların bir veya daha fazla USB İnsan Arayüzü Aygıtını (HID) bir Android aygıtla kaydetmesine olanak tanır. Bu yaklaşım, USB fareler ve klavyeler gibi tipik USB HID aygıtları için iletişim yönünü tersine çevirir. Normalde, HID cihazı bir USB ana bilgisayarına (yani bir kişisel bilgisayara) bağlı bir çevre birimidir, ancak AOA'da USB ana bilgisayarı bir USB çevre birimine bir veya daha fazla giriş cihazı olarak işlev görebilir.
HID desteği, standart HID olayları için bir proxy'dir; uygulama, olayların içeriği veya türü hakkında hiçbir varsayımda bulunmaz ve bunu giriş sistemine iletir, böylece bir AOAv2 aksesuarının herhangi bir HID cihazı (fare, klavye, oyun kumandası, vb.) gibi davranmasını sağlar. HID desteğini, medya yuvasındaki oynat/duraklat düğmesi gibi temel işlevleri sağlamak veya fare ve tam QWERTY klavyesi olan bir yerleştirme istasyonu gibi gelişmiş işlevler için kullanabilirsiniz.
AOAv2, aksesuarın Android cihazına bir veya daha fazla HID giriş cihazı gibi davranmasını sağlayan yeni USB kontrol istekleri ekler. HID desteği tamamen sıfır uç noktasındaki kontrol istekleri aracılığıyla gerçekleştirilir, bu nedenle yeni bir USB arabirimine gerek yoktur. Dört yeni kontrol talebi şunlardır:
- ACCESSORY_REGISTER_HID , Android cihazla yeni bir HID cihazı kaydeder. Aksesuar, diğer üç arama için HID cihazını tanımlamak için 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
ile kayıtlı bir HID cihazının kaydını siler. - ACCESSORY_SET_HID_REPORT_DESC , Android cihaza bir HID cihazı için bir rapor tanımlayıcı gönderir. Bu istek, HID cihazının özelliklerini açıklamak için kullanılır ve Android cihaza herhangi bir HID olayı rapor edilmeden önce gönderilmelidir. Rapor tanımlayıcısı sıfır uç noktası için maksimum paket boyutundan büyükse, tanımlayıcının tamamını aktarmak için birden çok
ACCESSORY_SET_HID_REPORT_DESC
komutu gönderilir. - ACCESSORY_SEND_HID_EVENT , giriş olaylarını aksesuardan Android cihaza gönderir.
Yeni kontrol istekleri için 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 bir USB ana bilgisayarı (aksesuar) ile doğrudan iletişim kurmasını destekler. AOAv2 bu desteği sürdürür ve aksesuarın Android işletim sisteminin kendisiyle (özellikle ses ve giriş sistemleri) iletişim kurmasını sağlamak için yeni özellikler ekler. AOAv2'nin tasarımı, orijinal özellik setine ek olarak yeni ses ve HID desteğini kullanan bir aksesuar oluşturmayı mümkün kılar. Yeni özellikleri orijinal özelliklerle birlikte kullanmanız yeterlidir.
AOAv2'yi Android uygulaması olmadan bağlama
Ses ve HID desteğini kullanan ancak Android cihazdaki bir uygulamayla iletişim kurmayan bir aksesuar (ses yuvası gibi) tasarlayabilirsiniz. Bu aksesuarlar için, kullanıcıların yeni eklenen aksesuarı bulmak ve onunla iletişim kurabilen bir Android uygulamasıyla ilişkilendirmek için iletişim istemleri alması gerekmez.
Bir aksesuar bağlandıktan sonra bu tür diyalogları bastırmak 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 kurmak için bir uygulama bulmaya çalışmaz.
- Cihaz aksesuar moduna girdikten sonra, Android cihaz USB yapılandırmasında aksesuar USB arabirimi mevcut değil.