الإصدار المفتوح من Android 2.0

يصف هذا المستند التغييرات التي طرأت على بروتوكول "ملحق Android المفتوح" (AOA). منذ إطلاقه الأولي ومكمّلات مستندات حول الإصدار 1.0 من AOA AOAv2 إضافة الميزات التالية:

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

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

رصد توافق AOAv2

لتحديد ما إذا كان جهاز Android المتصل يتوافق مع الملحقات إصدار بروتوكول متوافق، يجب أن يرسل الملحق getProtocol() الأمر والتحقق من النتيجة. أجهزة Android التي لا تتوافق إلا مع الميزات في 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 الإكسسوار يتم توفير نقطتَي نهاية مُجمَّعة للتواصل مع تطبيق Android.
0x2D01 الإكسسوار + adb لأغراض تصحيح الأخطاء أثناء تطوير الملحق. متاح فقط إذا كانت فعَّل المستخدم تصحيح أخطاء USB في إعدادات جهاز Android.
AOAv2 0x2D02 بعدّة لغات" لبث الصوت من جهاز Android إلى أحد الملحقات.
0x2D03 audio + adb
0x2D04 الإكسسوار + الصوت
0x2D05 الإكسسوار + الصوت + أداة Adb

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

الدعم الصوتي

يشمل AOAv2 إمكانية إخراج الصوت من جهاز Android إلى ملحق عبر واجهة USB عادية من الفئة الصوتية يمكنها قناتان بسرعة 16 بت صوت PCM بمعدل بت يبلغ 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 الدعم لتقديم وظائف أساسية، مثل زر التشغيل/الإيقاف المؤقت على الوسائط أو لتشغيل وظائف متقدمة مثل محطة الإرساء باستخدام الماوس لوحة مفاتيح 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. التهيئة بعد دخول الجهاز في وضع الملحق.