Android Open Accessory 2.0

इस दस्तावेज़ में, Android Open Accessory (AOA) प्रोटोकॉल के रिलीज़ होने के बाद हुए बदलावों के बारे में बताया गया है. साथ ही, इसमें AOA 1.0 दस्तावेज़ के बारे में भी जानकारी दी गई है. AOAv2 में ये सुविधाएं जोड़ी गई हैं:

  • ऑडियो आउटपुट (Android 8.0 में काम नहीं करता).
  • Android डिवाइस के लिए, एक या उससे ज़्यादा ह्यूमन इंटरफ़ेस डिवाइस (एचआईडी) के तौर पर काम करने वाली ऐक्सेसरी के लिए सहायता.

Android ऐप्लिकेशन डेवलपर के लिए उपलब्ध Android SDK टूल के एपीआई में कोई बदलाव नहीं हुआ है.

यह पता लगाना कि 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 में, ऐक्सेसरी मोड में उपलब्ध यूएसबी इंटरफ़ेस के हर कॉम्बिनेशन के लिए नए यूएसबी प्रॉडक्ट आईडी शामिल हैं:

वर्शन प्रॉडक्ट आईडी कम्यूनिकेशन से जुड़ी सेटिंग ब्यौरा
AOAv1 0x2D00 ऐक्सेसरी Android ऐप्लिकेशन के साथ कम्यूनिकेट करने के लिए, दो बड़ी डेटा फ़ाइलों के एंडपॉइंट उपलब्ध कराता है.
0x2D01 ऐक्सेसरी + adb ऐक्सेसरी के डेवलपमेंट के दौरान, डीबग करने के लिए. यह सुविधा सिर्फ़ तब उपलब्ध होती है, जब उपयोगकर्ता ने Android डिवाइस की सेटिंग में यूएसबी डीबगिंग की सुविधा चालू की हो.
AOAv2 0x2D02 ऑडियो Android डिवाइस से किसी ऐक्सेसरी पर ऑडियो स्ट्रीम करने के लिए.
0x2D03 audio + adb
0x2D04 ऐक्सेसरी + ऑडियो
0x2D05 ऐक्सेसरी + ऑडियो + adb

AOAv1 (0x2D00 और 0x2D01) में इस्तेमाल किए गए प्रॉडक्ट आईडी, AOAv2 में भी काम करते रहेंगे.

ऑडियो से जुड़ी सहायता

AOAv2 में, Android डिवाइस से किसी ऐक्सेसरी पर ऑडियो आउटपुट भेजने की सुविधा शामिल है. इसके लिए, स्टैंडर्ड यूएसबी ऑडियो क्लास इंटरफ़ेस का इस्तेमाल किया जाता है. यह इंटरफ़ेस, 44100 केएचज़ के बिटरेट के साथ 2 चैनल, 16-बिट पीसीएम ऑडियो का इस्तेमाल कर सकता है. आने वाले समय में, इसमें और ऑडियो मोड जोड़े जा सकते हैं.

ऑडियो की सुविधा चालू करने के लिए, ऐक्सेसरी को यूएसबी कंट्रोल का नया अनुरोध भेजना होगा:

**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 कमांड भेजने से पहले यह कमांड भेजना ज़रूरी है.

एचआईडी की सुविधा

AOAv2 की मदद से, ऐक्सेसरी एक या उससे ज़्यादा यूएसबी ह्यूमन इंटरफ़ेस डिवाइस (एचआईडी) को Android डिवाइस के साथ रजिस्टर कर सकती हैं. इस तरीके से, यूएसबी माउस और कीबोर्ड जैसे सामान्य यूएसबी एचआईडी डिवाइसों के लिए, कम्यूनिकेशन की दिशा बदल जाती है. आम तौर पर, एचआईडी डिवाइस एक ऐसा पेरिफ़रल होता है जो यूएसबी होस्ट (जैसे, पर्सनल कंप्यूटर) से कनेक्ट होता है. हालांकि, एओए में यूएसबी होस्ट, यूएसबी पेरिफ़रल के लिए एक या उससे ज़्यादा इनपुट डिवाइसों के तौर पर काम कर सकता है.

एचआईडी सपोर्ट, स्टैंडर्ड एचआईडी इवेंट के लिए एक प्रॉक्सी है. इसे लागू करने पर, इवेंट के कॉन्टेंट या टाइप के बारे में कोई अनुमान नहीं लगाया जाता. इसके बजाय, इवेंट को सीधे इनपुट सिस्टम पर भेज दिया जाता है. इससे AOAv2 ऐक्सेसरी, किसी भी एचआईडी डिवाइस (माउस, कीबोर्ड, गेम कंट्रोलर वगैरह) के तौर पर काम कर सकती है. मीडिया डॉक पर मौजूद 'चलाएं/रोकें' बटन जैसी बुनियादी सुविधाएं देने के लिए, एचआईडी की सहायता का इस्तेमाल किया जा सकता है. इसके अलावा, माउस और फ़ुल QWERTY कीबोर्ड वाले डॉकिंग स्टेशन जैसी ऐडवांस सुविधाएं देने के लिए भी एचआईडी की सहायता का इस्तेमाल किया जा सकता है.

AOAv2 में, USB कंट्रोल के नए अनुरोध जोड़े गए हैं. इनकी मदद से, ऐक्सेसरी, Android डिवाइस के लिए एक या उससे ज़्यादा एचआईडी इनपुट डिवाइसों के तौर पर काम कर सकती है. एचआईडी की सहायता पूरी तरह से एंडपॉइंट शून्य पर कंट्रोल अनुरोधों के ज़रिए मैनेज की जाती है. इसलिए, किसी नए यूएसबी इंटरफ़ेस की ज़रूरत नहीं होती. कंट्रोल के लिए ये चार नए अनुरोध हैं:

  • ACCESSORY_REGISTER_HID, Android डिवाइस के साथ किसी नए एचआईडी डिवाइस को रजिस्टर करता है. ऐक्सेसरी, एक आईडी उपलब्ध कराती है. इसका इस्तेमाल, अन्य तीन कॉल के लिए एचआईडी डिवाइस की पहचान करने के लिए किया जाता है. यह आईडी तब तक मान्य होता है, जब तक यूएसबी डिसकनेक्ट नहीं हो जाता या जब तक ऐक्सेसरी, एचआईडी डिवाइस को अनरजिस्टर करने के लिए ACCESSORY_UNREGISTER_HID नहीं भेजती.
  • ACCESSORY_UNREGISTER_HID, उस एचआईडी डिवाइस को अनरजिस्टर कर देता है जो पहले ACCESSORY_REGISTER_HID के साथ रजिस्टर किया गया था.
  • ACCESSORY_SET_HID_REPORT_DESC, Android डिवाइस पर किसी HID डिवाइस के लिए रिपोर्ट डिस्क्रिप्टर भेजता है. इस अनुरोध का इस्तेमाल, HID डिवाइस की सुविधाओं के बारे में बताने के लिए किया जाता है. साथ ही, Android डिवाइस पर किसी भी HID इवेंट की शिकायत करने से पहले, यह अनुरोध भेजना ज़रूरी है. अगर रिपोर्ट डिस्क्रिप्टर, एंडपॉइंट ज़ीरो के लिए पैकेट के ज़्यादा से ज़्यादा साइज़ से बड़ा है, तो पूरे डिस्क्रिप्टर को ट्रांसफ़र करने के लिए कई 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 ऐप्लिकेशन को यूएसबी के ज़रिए सीधे यूएसबी होस्ट (ऐक्सेसरी) से कम्यूनिकेट करने की सुविधा देता है. AOAv2 में यह सुविधा जारी है. साथ ही, इसमें नई सुविधाएं भी जोड़ी गई हैं, ताकि ऐक्सेसरी, Android ऑपरेटिंग सिस्टम (खास तौर पर ऑडियो और इनपुट सिस्टम) के साथ कम्यूनिकेट कर सके. AOAv2 के डिज़ाइन की मदद से, ऐसी ऐक्सेसरी बनाई जा सकती है जो मूल सुविधाओं के साथ-साथ, नए ऑडियो और एचआईडी सपोर्ट का इस्तेमाल करती है. बस ओरिजनल सुविधाओं के साथ-साथ नई सुविधाओं का इस्तेमाल करें.

Android ऐप्लिकेशन के बिना AOAv2 को कनेक्ट करना

ऐसी ऐक्सेसरी (जैसे, ऑडियो डॉक) डिज़ाइन की जा सकती है जो ऑडियो और एचआईडी की सुविधा का इस्तेमाल करती हो, लेकिन Android डिवाइस पर मौजूद किसी ऐप्लिकेशन के साथ काम न करती हो. इन ऐक्सेसरी के लिए, उपयोगकर्ताओं को डिवाइस से कनेक्ट की गई नई ऐक्सेसरी को ढूंढने और उससे जुड़े Android ऐप्लिकेशन के साथ जोड़ने के लिए, डायलॉग प्रॉम्प्ट नहीं दिखते.

ऐक्सेसरी के कनेक्ट होने के बाद, इस तरह के डायलॉग को रोकने के लिए, ऐक्सेसरी यह चुन सकती है कि वह Android डिवाइस को मैन्युफ़ैक्चरर और मॉडल के नाम न भेजे. जब Android डिवाइस को ये स्ट्रिंग नहीं दी जाती हैं, तो:

  • सिस्टम, ऐक्सेसरी के साथ काम करने वाला कोई ऐप्लिकेशन ढूंढने की कोशिश नहीं करता.
  • डिवाइस के ऐक्सेसरी मोड में जाने के बाद, Android डिवाइस के यूएसबी कॉन्फ़िगरेशन में ऐक्सेसरी यूएसबी इंटरफ़ेस मौजूद नहीं होता.