این سند تغییرات پروتکل Android Open Accessory (AOA) را از زمان انتشار اولیه آن شرح میدهد و مستندات AOA 1.0 را تکمیل میکند. AOAv2 ویژگی های زیر را اضافه می کند:
- خروجی صدا (در اندروید 8.0 منسوخ شده است).
- پشتیبانی از لوازم جانبی که به عنوان یک یا چند دستگاه رابط انسانی (HID) برای دستگاه Android عمل می کند.
APIهای Android SDK در دسترس توسعه دهندگان برنامه اندروید بدون تغییر هستند.
پشتیبانی از AOAv2 را شناسایی کنید
برای تعیین اینکه آیا یک دستگاه Android متصل از لوازم جانبی و نسخه پروتکل پشتیبانی شده پشتیبانی می کند یا خیر، یک وسیله جانبی باید دستور getProtocol()
ارسال کند و نتیجه را بررسی کند. دستگاههای اندرویدی که فقط از ویژگیهای موجود در AOAv1 پشتیبانی میکنند باید 1
به عنوان نسخه پروتکل برگردانند. دستگاه هایی که از ویژگی های اضافی در AOAv2 پشتیبانی می کنند باید 2
به عنوان نسخه پروتکل برگردانند. AOAv2 با AOAv1 سازگار است، بنابراین لوازم جانبی طراحی شده برای پروتکل لوازم جانبی اصلی همچنان با دستگاههای Android جدیدتر کار میکنند.
مثال زیر از کد منبع کد توسعه لوازم جانبی 2011 ( <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 | لوازم جانبی | دو نقطه پایانی انبوه برای برقراری ارتباط با یک برنامه اندروید ارائه می دهد. |
0x2D01 | لوازم جانبی + adb | برای اهداف اشکال زدایی در طول توسعه لوازم جانبی. فقط در صورتی در دسترس است که کاربر در تنظیمات دستگاه Android ، اشکال زدایی USB را فعال کرده باشد. | |
AOAv2 | 0x2D02 | صوتی | برای پخش صدا از دستگاه Android به لوازم جانبی. |
0x2D03 | صوتی + adb | ||
0x2D04 | لوازم جانبی + صدا | ||
0x2D05 | لوازم جانبی + صدا + adb |
شناسههای محصول مورد استفاده در AOAv1 ( 0x2D00
و 0x2D01
) همچنان در AOAv2 پشتیبانی میشوند.
پشتیبانی صوتی
AOAv2 شامل پشتیبانی از خروجی صدا از یک دستگاه Android به یک لوازم جانبی از طریق رابط استاندارد کلاس صوتی USB است که قادر به پخش صدای PCM 2 کاناله 16 بیتی با نرخ بیت 44100 Khz است (حالت های صوتی اضافی ممکن است در آینده اضافه شوند).
برای فعال کردن پشتیبانی صوتی، لوازم جانبی باید یک درخواست کنترل 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 به لوازم جانبی اجازه می دهد تا یک یا چند دستگاه رابط انسانی USB (HID) را با دستگاه Android ثبت کنند. این رویکرد جهت ارتباط دستگاههای USB HID معمولی مانند ماوسها و کیبوردهای 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 این پشتیبانی را ادامه میدهد و ویژگیهای جدیدی را اضافه میکند تا به لوازم جانبی اجازه دهد تا با خود سیستم عامل اندروید (مخصوصاً سیستمهای صوتی و ورودی) ارتباط برقرار کند. طراحی AOAv2 امکان ساخت لوازم جانبی را فراهم می کند که علاوه بر مجموعه ویژگی های اصلی، از پشتیبانی صوتی و HID جدید استفاده می کند. به سادگی از ویژگی های جدید همراه با ویژگی های اصلی استفاده کنید.
AOAv2 را بدون برنامه اندروید وصل کنید
میتوانید لوازم جانبی (مانند داک صوتی) طراحی کنید که از پشتیبانی صوتی و HID استفاده میکند اما با برنامهای در دستگاه Android ارتباط برقرار نمیکند. برای این لوازم جانبی، کاربران برای یافتن و مرتبط کردن لوازم جانبی جدید پیوست شده با یک برنامه Android که می تواند با آن ارتباط برقرار کند، نیازی به دریافت پیام های گفتگو ندارند.
برای سرکوب چنین گفتگوهایی پس از اتصال لوازم جانبی، لوازم جانبی می تواند انتخاب کند که نام سازنده و مدل به دستگاه Android ارسال نشود. وقتی این رشتهها به دستگاه Android ارائه نمیشوند:
- سیستم سعی نمی کند برنامه ای برای برقراری ارتباط با لوازم جانبی پیدا کند.
- پس از اینکه دستگاه وارد حالت لوازم جانبی شد، رابط USB لوازم جانبی در پیکربندی USB دستگاه Android وجود ندارد.