Android Open Accessory 2.0

این سند تغییرات پروتکل «لوازم جانبی باز 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 پس‌از ورود دستگاه به حالت لوازم جانبی وجود ندارد.