Android Open Accessory 2.0

این سند تغییرات پروتکل 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 وجود ندارد.