این سند تغییرات پروتکل «لوازم جانبی باز Android» (AOA) را از زمان انتشار اولیه آن شرح میدهد و مستندات AOA 1.0 را تکمیل میکند. AOAv2 ویژگیهای زیر را اضافه میکند:
- خروجی صوتی (در Android 8.0 منسوخ شده است).
- پشتیبانی از لوازم جانبی که بهعنوان یک یا چند دستگاه میانای انسانی (HID) برای دستگاه Android عمل میکند.
«میاناهای برنامهسازی کاربردی کیت توسعه نرمافزار Android» دردسترس توسعهدهندگان نرمافزار Android بدون تغییر باقی میماند.
شناسایی پشتیبانی AOAv2
برای تعیین اینکه آیا دستگاه Android متصل از لوازم جانبی و نسخه پروتکل پشتیبانیشده پشتیبانی میکند یا نه، لوازم جانبی باید فرمان getProtocol()
را ارسال کند و نتیجه را بررسی کند. دستگاههای Android که فقط از ویژگیهای
AOAv1 پشتیبانی میکنند باید 1 را بهعنوان نسخه پروتکل برگردانند؛ دستگاههایی که
از ویژگیهای اضافی در AOAv2 پشتیبانی میکنند باید 2 را بهعنوان
نسخه پروتکل برگردانند. AOAv2 با AOAv1 سازگار با نسخه قدیمی است، بنابراین لوازم جانبی طراحیشده برای پروتکل لوازم جانبی اصلی همچنان با دستگاههای Android جدیدتر کار میکنند.
مثال زیر از کتابخانه
کد منبع
(<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp)
«کیت توسعه لوازم جانبی ۲۰۱۱» این بررسی پروتکل را نشان میدهد:
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 شامل شناسههای محصول USB جدید برای هر ترکیب از میاناهای USB موجود در حالت لوازم جانبی است:
| نسخه | شناسه محصول | ارتباطات | شرح |
|---|---|---|---|
| AOAv1 | 0x2D00 |
وسیله جانبی | دو نقطه پایانی انبوه برای ارتباط با برنامه Android ارائه میدهد. |
0x2D01 |
accessory + adb | برای اهداف اشکالزدایی درطول توسعه لوازم جانبی. فقط درصورتی دردسترس است که کاربر عیبیابی USB را در تنظیمات دستگاه Android فعال کرده باشد. | |
| AOAv2 | 0x2D02 |
صوتی | برای جاریسازی صدا از دستگاه Android به لوازم جانبی. |
0x2D03 |
صوتی + adb | ||
0x2D04 |
لوازم جانبی + صدا | ||
0x2D05 |
لوازم جانبی + صدا + adb |
شناسههای محصول استفادهشده در AOAv1 (0x2D00 و 0x2D01)
در AOAv2 نیز پشتیبانی میشوند.
پشتیبانی از صدا
AOAv2 شامل پشتیبانی از برونداد صدا از دستگاه Android به لوازم جانبی ازطریق میانای استاندارد کلاس صدای USB با قابلیت صدای PCM دو کاناله ۱۶ بیتی با نرخ بیت ۴۴۱۰۰ کیلوهرتز است (حالتهای صدای اضافی ممکن است در آینده اضافه شود).
برای فعال کردن پشتیبانی از صدا، لوازم جانبی باید درخواست کنترل USB جدیدی ارسال کند:
**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
این فرمان باید قبلاز ارسال فرمان
ACCESSORY_START برای ورود به حالت لوازم جانبی ارسال شود.
پشتیبانی از HID
AOAv2 به لوازم جانبی اجازه میدهد یک یا چند «دستگاه میانای انسانی» (HID) USB را در دستگاه Android ثبت کنند. این رویکرد جهت ارتباط را برای دستگاههای HID USB معمولی مثل موشواره و صفحهکلید USB معکوس میکند. بهطور معمول، دستگاه HID یک دستگاه جانبی است که به میزبان USB (یعنی رایانه شخصی) متصل میشود، اما در AOA میزبان USB میتواند بهعنوان یک یا چند دستگاه ورودی برای دستگاه جانبی USB عمل کند.
پشتیبانی از HID جایگزینی برای رویدادهای استاندارد HID است؛ پیادهسازی هیچ فرضی درباره محتوا یا نوع رویدادها ندارد و آن را بهسادگی به سیستم ورودی منتقل میکند و به لوازم جانبی AOAv2 امکان میدهد بهعنوان هر دستگاه HID (موشواره، صفحهکلید، کنترل بازی، و غیره) عمل کند. میتوانید از پشتیبانی HID برای ارائه عملکردهای پایه، مانند دکمه پخش/مکث در پایه رسانه، یا برای عملکردهای پیشرفته مانند ایستگاه اتصال با موشواره و صفحهکلید کامل QWERTY استفاده کنید.
AOAv2 درخواستهای کنترل USB جدیدی اضافه میکند که به لوازم جانبی اجازه میدهد بهعنوان یک یا چند دستگاه ورودی HID برای دستگاه Android عمل کند. پشتیبانی از HID بهطور کامل ازطریق درخواستهای کنترل در نقطه پایانی صفر انجام میشود، بنابراین به میانای USB جدیدی نیاز نیست. چهار درخواست کنترل جدید عبارتاند از:
- ACCESSORY_REGISTER_HID دستگاه HID جدیدی را در دستگاه Android ثبت میکند. لوازم جانبی شناسه مورد استفاده برای شناسایی دستگاه HID را برای
سه تماس دیگر ارائه میدهد. این شناسه تا زمانی معتبر است که USB قطع شود یا تا زمانی که
لوازم جانبی
ACCESSORY_UNREGISTER_HIDرا برای لغو ثبت دستگاه HID ارسال کند. - ACCESSORY_UNREGISTER_HID دستگاه HID را که قبلاً با
ACCESSORY_REGISTER_HIDثبت شده است لغو ثبت میکند. - ACCESSORY_SET_HID_REPORT_DESC توصیفگر گزارشی برای
دستگاه HID به دستگاه Android ارسال میکند. این درخواست برای توصیف قابلیتهای دستگاه HID استفاده میشود و باید قبلاز گزارش هرگونه رویداد HID به دستگاه Android ارسال شود. اگر توصیفگر گزارش بزرگتر از حداکثر
اندازه بسته برای نقطه پایانی صفر باشد، چند
فرمان
ACCESSORY_SET_HID_REPORT_DESCبرای انتقال کل توصیفگر ارسال میشود. - ACCESSORY_SEND_HID_EVENT رویدادهای ورودی را از لوازم جانبی به دستگاه Android ارسال میکند.
تعاریف کد برای درخواستهای کنترل جدید عبارتاند از:
/* 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
پروتکل اصلی (AOAv1) از برنامه Android برای برقراری ارتباط مستقیم با میزبان USB (وسیله جانبی) ازطریق USB پشتیبانی میکند. AOAv2 این پشتیبانی را ادامه میدهد و ویژگیهای جدیدی اضافه میکند تا به لوازم جانبی اجازه دهد با خود سیستمعامل Android (بهطور خاص سیستمهای ورودی و صوتی) ارتباط برقرار کند. طراحی AOAv2 امکان ساخت لوازم جانبی را فراهم میکند که علاوهبر مجموعه ویژگیهای اصلی، از پشتیبانی جدید صدا و HID نیز استفاده کند. بهسادگی از ویژگیهای جدید در کنار ویژگیهای اصلی استفاده کنید.
اتصال AOAv2 بدون برنامه Android
میتوانید لوازم جانبیای (مانند پایه صوتی) طراحی کنید که از پشتیبانی صوتی و HID استفاده میکند اما با برنامهای در دستگاه Android ارتباط برقرار نمیکند. برای این لوازم جانبی، کاربران نیازی ندارند پیاموارههای گفتگویی برای پیدا کردن و قرینهسازی لوازم جانبی تازه متصلشده با برنامه Android که بتواند با آن ارتباط برقرار کند دریافت کنند.
برای جلوگیری از نمایش چنین کادرهای گفتگویی پساز اتصال لوازم جانبی، لوازم جانبی میتواند انتخاب کند که نام سازنده و مدل را به دستگاه Android ارسال نکند. وقتی این رشتهها به دستگاه Android ارائه نمیشوند:
- سیستم سعی نمیکند برنامهای برای ارتباط با وسیله جانبی پیدا کند.
- میانای USB لوازم جانبی در پیکربندی USB دستگاه Android پساز ورود دستگاه به حالت لوازم جانبی وجود ندارد.