Android यूएसबी ऐक्सेसरी, Android Open Accessory (AOA) प्रोटोकॉल का पालन करती हैं. इस प्रोटोकॉल से यह तय होता है कि कोई ऐक्सेसरी, Android डिवाइस का पता कैसे लगाती है और उससे कैसे कम्यूनिकेट करती है. ऐक्सेसरी को ये काम करने चाहिए:
- कनेक्ट किए गए डिवाइस के कनेक्ट होने का इंतज़ार करें और उसे पहचानें.
- यह पता लगाना कि डिवाइस में ऐक्सेसरी मोड काम करता है या नहीं.
- अगर ज़रूरी हो, तो डिवाइस को ऐक्सेसरी मोड में चालू करने की कोशिश करें.
- अगर डिवाइस में AOA की सुविधा काम करती है, तो डिवाइस से कनेक्ट करें.
नीचे दिए गए सेक्शन में, इन चरणों को लागू करने का तरीका बताया गया है.
कनेक्ट किए गए डिवाइसों के कनेक्ट होने का इंतज़ार करना और उनकी पहचान करना
ऐक्सेसरी को लगातार यह जांच करते रहना चाहिए कि Android डिवाइस कनेक्ट हैं या नहीं. जब कोई डिवाइस कनेक्ट होता है, तो एक्सेसरी यह तय करनी चाहिए कि डिवाइस, ऐक्सेसरी मोड के साथ काम करता है या नहीं.
यह पता लगाना कि ऐक्सेसरी मोड काम करता है या नहीं
ध्यान दें: ऐक्सेसरी कनेक्ट करने के लिए, यूएसबी डीबगिंग की ज़रूरत नहीं होती. हालांकि, ऐप्लिकेशन डेवलप करने के दौरान ADB की ज़रूरत पड़ सकती है. ज़्यादा जानकारी के लिए, डीबग करने से जुड़ी बातें देखें.
Android डिवाइस कनेक्ट होने पर, वह इनमें से किसी एक स्थिति में हो सकता है:
- Android ऐक्सेसरी मोड के साथ काम करती हो और पहले से ही ऐक्सेसरी मोड में हो.
- Android ऐक्सेसरी मोड के साथ काम करता है, लेकिन यह ऐक्सेसरी मोड में नहीं है.
- Android ऐक्सेसरी मोड के साथ काम नहीं करता.
शुरुआती कनेक्शन के दौरान, ऐक्सेसरी को कनेक्ट किए गए डिवाइस के यूएसबी डिवाइस डिस्क्रिप्टर के वर्शन, वेंडर आईडी, और प्रॉडक्ट आईडी की जांच करनी चाहिए. वेंडर आईडी, Google के आईडी (0x18D1
) से मेल खाना चाहिए. अगर डिवाइस पहले से ही ऐक्सेसरी मोड में है, तो प्रॉडक्ट आईडी 0x2D00
या 0x2D01
होना चाहिए. साथ ही, ऐक्सेसरी अपने कम्यूनिकेशन प्रोटोकॉल का इस्तेमाल करके, एक साथ कई फ़ाइलें ट्रांसफ़र करने की सुविधा वाले एंडपॉइंट की मदद से, डिवाइस से संपर्क कर सकती है. इसके लिए, डिवाइस को ऐक्सेसरी मोड में चालू करने की ज़रूरत नहीं है.
ध्यान दें: 0x2D00
, Android डिवाइसों के लिए रिज़र्व है. हालांकि, यह सिर्फ़ उन डिवाइसों के लिए है जिनमें ऐक्सेसरी मोड की सुविधा काम करती है. 0x2D01
, ऐक्सेसरी मोड के साथ-साथ Android डीबग ब्रिज (ADB) प्रोटोकॉल के साथ काम करने वाले डिवाइसों के लिए है. यह प्रोटोकॉल, ADB के लिए दो बड़ी संख्या वाले एंडपॉइंट के साथ दूसरा इंटरफ़ेस दिखाता है. अगर किसी कंप्यूटर पर ऐक्सेसरी को सिम्युलेट किया जा रहा है, तो ऐक्सेसरी ऐप्लिकेशन को डीबग करने के लिए, इन एंडपॉइंट का इस्तेमाल किया जा सकता है. आम तौर पर, इस इंटरफ़ेस का इस्तेमाल तब तक न करें, जब तक ऐक्सेसरी डिवाइस पर ADB के लिए पासथ्रू लागू न कर दे.
अगर यूएसबी डिवाइस डिस्क्रिप्टर में मौजूद वर्शन, वेंडर आईडी या प्रॉडक्ट आईडी, उम्मीद की गई वैल्यू से मेल नहीं खाते, तो ऐक्सेसरी यह तय नहीं कर सकती कि डिवाइस, Android ऐक्सेसरी मोड के साथ काम करता है या नहीं. डिवाइस के साथ काम करने की जानकारी पाने के लिए, ऐक्सेसरी को डिवाइस को ऐक्सेसरी मोड में चालू करने की कोशिश करनी चाहिए. इस मोड के बारे में नीचे बताया गया है.
अहम जानकारी: यूएसबी ऐक्सेसरी को शुरुआती हैंडशेक के बाद हेडर भेजना चाहिए. हेडर में मैन्युफ़ैक्चरर, मॉडल, और वर्शन की जानकारी होती है. हालांकि, वर्शन एक ज़रूरी फ़ील्ड नहीं है. अगर कोई ऐसा Android ऐप्लिकेशन इंस्टॉल किया गया है जो सिर्फ़ वर्शन के हिसाब से मैच करता है, लेकिन ऐक्सेसरी कोई वर्शन नहीं भेजती है, तो सिस्टम प्रोसेस में कोई अपवाद होने की वजह से, Android 10 और उससे पहले के वर्शन पर काम करने वाले Android डिवाइस रीबूट हो जाएंगे.
ऐक्सेसरी मोड में शुरू करने की कोशिश करना
अगर वर्शन, वेंडर, और प्रॉडक्ट आईडी, Android डिवाइस के ऐक्सेसरी मोड से मेल नहीं खाते, तो ऐक्सेसरी यह तय नहीं कर सकती कि डिवाइस ऐक्सेसरी मोड के साथ काम करता है या नहीं. ऐसा इसलिए हो सकता है, क्योंकि ऐक्सेसरी मोड के साथ काम करने वाले डिवाइस (जो ऐक्सेसरी मोड में नहीं हैं) शुरुआत में AOA वेंडर और प्रॉडक्ट आईडी के बजाय, डिवाइस मैन्युफ़ैक्चरर वेंडर और प्रॉडक्ट आईडी की जानकारी देते हैं.
ऐक्सेसरी को डिवाइस को ऐक्सेसरी मोड में चालू करने की कोशिश करनी चाहिए, ताकि यह पता चल सके कि डिवाइस उस मोड के साथ काम करता है या नहीं:
- यह पता लगाने के लिए कि डिवाइस पर Android एक्सेसरी प्रोटोकॉल काम करता है या नहीं, 51 कंट्रोल अनुरोध ("Get Protocol") भेजें. अगर डिवाइस पर प्रोटोकॉल काम करता है, तो यह शून्य से ज़्यादा की संख्या दिखाता है. यह संख्या, प्रोटोकॉल के काम करने वाले वर्शन को दिखाती है.
कंट्रोल का अनुरोध, एंडपॉइंट 0 पर है. इसमें ये विशेषताएं हैं:
requestType: USB_DIR_IN | USB_TYPE_VENDOR request: 51 value: 0 index: 0 data: protocol version number (16 bits little endian sent from the device to the accessory)
- अगर डिवाइस, काम करने वाले प्रोटोकॉल का वर्शन दिखाता है, तो डिवाइस पर कंट्रोल का अनुरोध भेजें. साथ ही, पहचान करने वाली स्ट्रिंग की जानकारी भी भेजें. इस जानकारी की मदद से, डिवाइस यह तय कर सकता है कि ऐक्सेसरी के लिए कौनसा ऐप्लिकेशन सही है. अगर कोई सही ऐप्लिकेशन मौजूद नहीं है, तो डिवाइस उपयोगकर्ता को एक यूआरएल दिखा सकता है. कंट्रोल का अनुरोध, एंडपॉइंट 0 (हर स्ट्रिंग आईडी के लिए) पर होता है. इसमें ये विशेषताएं होती हैं:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
यहां दिए गए स्ट्रिंग आईडी इस्तेमाल किए जा सकते हैं. हर स्ट्रिंग का साइज़ ज़्यादा से ज़्यादा 256 बाइट होना चाहिए. साथ ही,
\0
के साथ खत्म होनी चाहिए.manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- डिवाइस को ऐक्सेसरी मोड में चालू करने के लिए, कंट्रोल का अनुरोध भेजें. कंट्रोल अनुरोध, एंडपॉइंट 0 पर है. इसकी ये विशेषताएं हैं:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
ये चरण पूरे करने के बाद, ऐक्सेसरी को कनेक्ट किए गए यूएसबी डिवाइस के, ऐक्सेसरी मोड में बस पर फिर से शामिल होने का इंतज़ार करना चाहिए. इसके बाद, कनेक्ट किए गए डिवाइसों की फिर से गिनती करनी चाहिए. अगर डिवाइस ऐक्सेसरी मोड पर स्विच हो जाता है, तो एल्गोरिदम, वेंडर और प्रॉडक्ट आईडी की जांच करके यह तय करता है कि ऐक्सेसरी मोड काम करेगा या नहीं. ये आईडी सही होने चाहिए. उदाहरण के लिए, डिवाइस बनाने वाली कंपनी के आईडी के बजाय, Google के वेंडर और प्रॉडक्ट आईडी से मेल खाने चाहिए. अगर आईडी और वर्शन सही हैं, तो ऐक्सेसरी डिवाइस से संपर्क करने की प्रोसेस शुरू कर देती है.
ध्यान दें: फ़िलहाल, AOA में एक साथ AOA और MTP कनेक्शन काम नहीं करते. AOA से MTP पर स्विच करने के लिए, ऐक्सेसरी को पहले यूएसबी डिवाइस से डिसकनेक्ट करना होगा. इसके बाद, MTP का इस्तेमाल करके फिर से कनेक्ट करना होगा.
अगर कोई चरण पूरा नहीं होता है, तो ऐक्सेसरी यह तय करती है कि डिवाइस, Android ऐक्सेसरी मोड के साथ काम नहीं करता. इसके बाद, वह अगले डिवाइस के कनेक्ट होने का इंतज़ार करती है.
डिवाइस से संपर्क करना
अगर ऐक्सेसरी को ऐक्सेसरी मोड में Android डिवाइस का पता चलता है, तो ऐक्सेसरी, डिवाइस इंटरफ़ेस और एंडपॉइंट डिस्क्रिप्टर से क्वेरी कर सकती है. इससे, डिवाइस के साथ कम्यूनिकेट करने के लिए, एक साथ कई एंडपॉइंट हासिल किए जा सकते हैं.
इंटरफ़ेस और बड़ी डेटा फ़ीड भेजने के लिए इस्तेमाल होने वाले एंडपॉइंट की संख्या, प्रॉडक्ट आईडी पर निर्भर करती है. Android डिवाइस, जिसका प्रॉडक्ट आईडी यह हो:
0x2D00
में इनपुट और आउटपुट कम्यूनिकेशन के लिए, दो बड़ी डेटा फ़ाइलों वाले एंडपॉइंट वाला एक इंटरफ़ेस होता है.0x2D01
के दो इंटरफ़ेस होते हैं. इनमें इनपुट और आउटपुट, दोनों के लिए दो-दो बल्क एंडपॉइंट होते हैं. पहला इंटरफ़ेस, स्टैंडर्ड कम्यूनिकेशन को मैनेज करता है और दूसरा इंटरफ़ेस, एडीबी कम्यूनिकेशन को मैनेज करता है. इंटरफ़ेस का इस्तेमाल करने के लिए, पहले बल्क इनपुट और आउटपुट एंडपॉइंट ढूंढें. इसके बाद,SET_CONFIGURATION
(0x09
) डिवाइस अनुरोध की मदद से, डिवाइस कॉन्फ़िगरेशन को 1 की वैल्यू पर सेट करें. इसके बाद, एंडपॉइंट का इस्तेमाल करके कम्यूनिकेट करें.