Android Open Accessory Protocol 2.0 و Android Open Accessory Protocol 2.0

يصف هذا المستند التغييرات في بروتوكول Android Open Accessory (AOA) منذ إصداره الأولي ويكمل وثائق AOA 1.0 . يضيف AOAv2 الميزات التالية:

  • إخراج الصوت (مهمل في Android 8.0).
  • دعم الملحق الذي يعمل كواجهة بشرية واحدة أو أكثر (HIDs) لجهاز Android.

لم تتغير واجهات برمجة تطبيقات Android SDK المتاحة لمطوري تطبيقات Android.

الكشف عن دعم AOAv2

لتحديد ما إذا كان جهاز Android المتصل يدعم الملحقات وإصدار البروتوكول المدعوم ، يجب أن يرسل الملحق أمر getProtocol() والتحقق من النتيجة. يجب أن تقوم أجهزة Android التي تدعم الميزات في AOAv1 فقط بإرجاع 1 كإصدار البروتوكول ؛ الأجهزة التي تدعم الميزات الإضافية في AOAv2 يجب أن ترجع 2 كإصدار البروتوكول. AOAv2 متوافق مع الإصدارات السابقة مع AOAv1 ، لذلك تستمر الملحقات المصممة لبروتوكول الملحقات الأصلي في العمل مع أجهزة Android الأحدث.

يوضح المثال التالي من التعليمات البرمجية المصدر لـ Accessory Development Kit 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 ملحق يوفر نقطتي نهاية مجمعتين للتواصل مع تطبيق Android.
0x2D01 ملحق + adb لأغراض التصحيح أثناء تطوير الملحقات. متاح فقط إذا قام المستخدم بتمكين تصحيح أخطاء USB في إعدادات جهاز Android.
AOAv2 0x2D02 صوتي لتدفق الصوت من جهاز Android إلى أحد الملحقات.
0x2D03 صوت + adb
0x2D04 ملحق + صوتي
0x2D05 ملحق + صوت + adb

يستمر دعم معرفات المنتجات المستخدمة في AOAv1 ( 0x2D00 و 0x2D01 ) في AOAv2.

دعم الصوت

يتضمن AOAv2 دعمًا لإخراج الصوت من جهاز Android إلى ملحق عبر واجهة USB قياسية من فئة الصوت قادرة على قناتين وصوت PCM 16 بت بمعدل بت 44100 كيلو هرتز (يمكن إضافة أوضاع صوتية إضافية في المستقبل).

لتمكين دعم الصوت ، يجب أن يرسل الملحق طلب تحكم 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 هذا الدعم ويضيف ميزات جديدة للسماح للملحق بالاتصال بنظام التشغيل Android نفسه (تحديدًا أنظمة الصوت والإدخال). يتيح تصميم AOAv2 إمكانية إنشاء ملحق يستخدم الصوت الجديد ودعم HID بالإضافة إلى مجموعة الميزات الأصلية. ما عليك سوى استخدام الميزات الجديدة جنبًا إلى جنب مع الميزات الأصلية.

توصيل AOAv2 بدون تطبيق Android

يمكنك تصميم ملحق (مثل رصيف صوتي) يستخدم الصوت ودعم HID لكن لا يتصل بتطبيق على جهاز Android. بالنسبة لهذه الملحقات ، لا يحتاج المستخدمون إلى تلقي مطالبات حوار للعثور على الملحق المرفق حديثًا وربطه بتطبيق Android يمكنه الاتصال به.

لمنع مثل هذه الحوارات بعد توصيل أحد الملحقات ، يمكن للملحق اختيار عدم إرسال اسم الشركة المصنعة والطراز إلى جهاز Android. عندما لا يتم توفير هذه السلاسل لجهاز Android:

  • لا يحاول النظام العثور على تطبيق للاتصال بالملحق.
  • واجهة USB للملحق غير موجودة في تكوين USB لجهاز Android بعد أن يدخل الجهاز في وضع الملحقات.