WebUSB API का पूरा फ़ायदा पाने के लिए, कोई डिवाइस बनाएं.
इस लेख में WebUSB API का पूरा फ़ायदा पाने के लिए, डिवाइस बनाने का तरीका बताया गया है. एपीआई के बारे में कम शब्दों में जानकारी पाने के लिए, वेब पर यूएसबी डिवाइस ऐक्सेस करना देखें.
बैकग्राउंड
यूनिवर्सल सीरियल बस (यूएसबी), सहायक डिवाइसों को डेस्कटॉप और मोबाइल कंप्यूटिंग डिवाइसों से जोड़ने के लिए सबसे आम इंटरफ़ेस बन गया है. किसी डिवाइस से कम्यूनिकेट करने के लिए बस की इलेक्ट्रिकल खासियत और सामान्य मॉडल तय करने के अलावा, यूएसबी की खास बातों में डिवाइस की क्लास से जुड़ी खास जानकारी भी शामिल होती है. खास तरह के डिवाइसों के लिए ये सामान्य मॉडल हैं. जैसे, स्टोरेज, ऑडियो, वीडियो, नेटवर्किंग वगैरह. इन्हें डिवाइस बनाने वाली कंपनियां लागू कर सकती हैं. इन डिवाइस क्लास स्पेसिफ़िकेशन का फ़ायदा यह है कि एक ऑपरेटिंग सिस्टम वेंडर ("क्लास ड्राइवर") के हिसाब से एक ड्राइवर को लागू कर सकता है और उस क्लास को लागू करने वाले किसी भी डिवाइस पर यह काम करेगा. यह हर उस मैन्युफ़ैक्चरर के लिए एक बहुत अच्छा सुधार था जिसे अपने डिवाइस ड्राइवर बनाने की ज़रूरत थी.
हालांकि, कुछ डिवाइस, स्टैंडर्ड डिवाइस की इन क्लास में फ़िट नहीं होते. इसके बजाय, मैन्युफ़ैक्चरर अपने डिवाइस को, वेंडर के लिए तय की गई क्लास के तौर पर लेबल कर सकता है. इस मामले में, ऑपरेटिंग सिस्टम यह चुनता है कि वेंडर के ड्राइवर पैकेज में दी गई जानकारी के आधार पर, किस डिवाइस को लोड करना है. आम तौर पर, यह वेंडर और प्रॉडक्ट आईडी का एक सेट होता है, जिन्हें किसी खास वेंडर के लिए प्रोटोकॉल लागू करने के लिए जाना जाता है.
यूएसबी की एक और सुविधा है कि वे जिस होस्ट से जुड़े हैं, डिवाइस उसे कई इंटरफ़ेस उपलब्ध करा सकते हैं. हर इंटरफ़ेस में या तो एक स्टैंडर्ड क्लास या वेंडर के हिसाब से क्लास लागू की जा सकती है. जब कोई ऑपरेटिंग सिस्टम डिवाइस को हैंडल करने के लिए सही ड्राइवर चुनता है, तब अलग-अलग ड्राइवर के ज़रिए हर इंटरफ़ेस पर दावा किया जा सकता है. उदाहरण के लिए, एक यूएसबी वेबकैम आम तौर पर दो इंटरफ़ेस देता है. पहला इंटरफ़ेस यूएसबी वीडियो क्लास (कैमरे के लिए) और दूसरा यूएसबी ऑडियो क्लास (माइक्रोफ़ोन के लिए) लागू करता है. ऑपरेटिंग सिस्टम एक "वेबकैम ड्राइवर" को लोड नहीं करता है. इसके बजाय, यह स्वतंत्र वीडियो और ऑडियो क्लास ड्राइवर लोड करता है जो डिवाइस के अलग-अलग काम करने की ज़िम्मेदारी लेते हैं. इंटरफ़ेस क्लास के इस कंपोज़िशन से ज़्यादा आसानी से काम किया जा सकता है.
एपीआई की बुनियादी बातें
कई स्टैंडर्ड यूएसबी क्लास के पास वेब एपीआई होते हैं. उदाहरण के लिए, कोई पेज getUserMedia()
का इस्तेमाल करके, वीडियो क्लास डिवाइस से वीडियो कैप्चर कर सकता है या किसी इंसान के इंटरफ़ेस (एचआईडी) क्लास डिवाइस से इनपुट इवेंट पा सकता है. इसके लिए, वह KeyboardEvents या PointerEvents का इस्तेमाल कर सकता है या Gamepad या WebHID एपीआई का इस्तेमाल कर सकता है.
सभी डिवाइस, स्टैंडर्ड क्लास डेफ़िनिशन को लागू नहीं करते. इसी तरह, सभी डिवाइस मौजूदा वेब प्लैटफ़ॉर्म एपीआई से जुड़ी सुविधाएं लागू नहीं करते. ऐसे मामलों में WebUSB API, साइटों को वेंडर के हिसाब से इंटरफ़ेस पर दावा करने और इसके लिए सीधे उनके पेज से सहायता लागू करने का तरीका उपलब्ध कराएगा.
अलग-अलग ऑपरेटिंग सिस्टम, यूएसबी डिवाइसों को मैनेज करने के तरीके में अंतर की वजह से किसी डिवाइस को WebUSB से ऐक्सेस करने की शर्तें अलग-अलग होंगी. हालांकि, इसके लिए डिवाइस में पहले से कोई ऐसा ड्राइवर नहीं होना चाहिए जिसे पेज कंट्रोल करना है. यह काम, ओएस वेंडर की ओर से उपलब्ध कराया गया सामान्य क्लास ड्राइवर हो सकता है या वेंडर से मिला डिवाइस ड्राइवर हो सकता है. यूएसबी डिवाइस कई इंटरफ़ेस उपलब्ध करा सकते हैं और हर इंटरफ़ेस का अपना ड्राइवर हो सकता है. इसलिए, ऐसा डिवाइस बनाया जा सकता है जिसके लिए कुछ इंटरफ़ेस पर ड्राइवर का दावा होता है और कुछ पर ब्राउज़र ऐक्सेस कर पाता है.
उदाहरण के लिए, एक बेहतर यूएसबी कीबोर्ड ऐसा एचआईडी क्लास इंटरफ़ेस दे सकता है जिसका दावा ऑपरेटिंग सिस्टम के इनपुट सबसिस्टम से किया जाएगा. साथ ही, वेंडर के हिसाब से बनाया गया एक इंटरफ़ेस भी इस पर काम करेगा जो कॉन्फ़िगरेशन टूल के लिए WebUSB के लिए उपलब्ध रहेगा. यह टूल मैन्युफ़ैक्चरर की वेबसाइट पर दिखाया जा सकता है. इससे उपयोगकर्ता, प्लैटफ़ॉर्म के हिसाब से सॉफ़्टवेयर इंस्टॉल किए बिना, डिवाइस के काम करने से जुड़े पहलुओं में बदलाव कर सकता है, जैसे कि मैक्रो बटन और लाइटिंग इफ़ेक्ट. ऐसे डिवाइस का कॉन्फ़िगरेशन डिस्क्रिप्टर कुछ ऐसा दिखेगा:
वैल्यू | फ़ील्ड | ब्यौरा |
---|---|---|
कॉन्फ़िगरेशन डिस्क्रिप्टर | ||
0x09 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x02 |
bDescriptorType | कॉन्फ़िगरेशन डिस्क्रिप्टर |
0x0039 |
wTotalLength | डिस्क्रिप्टर की इस सीरीज़ की कुल लंबाई |
0x02 |
bNumInterfaces | इंटरफ़ेस की संख्या |
0x01 |
bConfigurationValue | कॉन्फ़िगरेशन 1 |
0x00 |
iConfiguration | कॉन्फ़िगरेशन का नाम (कोई नहीं) |
0b1010000 |
bmAttributes | रिमोट वेकअप की सुविधा वाला डिवाइस |
0x32 |
bMaxPower | ज़्यादा से ज़्यादा पावर को 2 mA की बढ़ोतरी के साथ दिखाया जाता है |
इंटरफ़ेस डिस्क्रिप्टर | ||
0x09 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x04 |
bDescriptorType | इंटरफ़ेस डिस्क्रिप्टर |
0x00 |
bInterfaceNumber | इंटरफ़ेस 0 |
0x00 |
bAlternateSetting | वैकल्पिक सेटिंग 0 (डिफ़ॉल्ट) |
0x01 |
bNumEndpoints | 1 एंडपॉइंट |
0x03 |
bInterfaceClass | एचआईडी इंटरफ़ेस क्लास |
0x01 |
bInterfaceSubClass | बूट इंटरफ़ेस सब-क्लास |
0x01 |
bInterfaceProtocol | कीबोर्ड |
0x00 |
iInterface | इंटरफ़ेस का नाम (कोई नहीं) |
एचआईडी डिस्क्रिप्टर | ||
0x09 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x21 |
bDescriptorType | एचआईडी डिस्क्रिप्टर |
0x0101 |
bcdHID | एचआईडी वर्शन 1.1 |
0x00 |
bCountryCode | हार्डवेयर के लिए टारगेट किया गया देश |
0x01 |
bNumDescriptors | फ़ॉलो किए जाने वाले एचआईडी क्लास डिस्क्रिप्टर की संख्या |
0x22 |
bDescriptorType | रिपोर्ट डिस्क्रिप्टर का टाइप |
0x003F |
wDescriptorLength | रिपोर्ट डिस्क्रिप्टर की कुल लंबाई |
एंडपॉइंट डिस्क्रिप्टर | ||
0x07 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x05 |
bDescriptorType | एंडपॉइंट डिस्क्रिप्टर |
0b10000001 |
bEndpointAddress | एंडपॉइंट 1 (भारत) |
0b00000011 |
bmAttributes | रोकें |
0x0008 |
wMaxPacketSize | 8 बाइट पैकेट |
0x0A |
bInterval | 10 मिलीसेकंड का अंतराल |
इंटरफ़ेस डिस्क्रिप्टर | ||
0x09 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x04 |
bDescriptorType | इंटरफ़ेस डिस्क्रिप्टर |
0x01 |
bInterfaceNumber | इंटरफ़ेस 1 |
0x00 |
bAlternateSetting | वैकल्पिक सेटिंग 0 (डिफ़ॉल्ट) |
0x02 |
bNumEndpoints | 2 एंडपॉइंट |
0xFF |
bInterfaceClass | वेंडर के लिए खास इंटरफ़ेस क्लास |
0x00 |
bInterfaceSubClass | |
0x00 |
bInterfaceProtocol | |
0x00 |
iInterface | इंटरफ़ेस का नाम (कोई नहीं) |
एंडपॉइंट डिस्क्रिप्टर | ||
0x07 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x05 |
bDescriptorType | एंडपॉइंट डिस्क्रिप्टर |
0b10000010 |
bEndpointAddress | एंडपॉइंट 1 (भारत) |
0b00000010 |
bmAttributes | बल्क |
0x0040 |
wMaxPacketSize | 64 बाइट पैकेट |
0x00 |
bInterval | एक साथ कई सारे एंडपॉइंट पर लागू नहीं |
एंडपॉइंट डिस्क्रिप्टर | ||
0x07 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x05 |
bDescriptorType | एंडपॉइंट डिस्क्रिप्टर |
0b00000011 |
bEndpointAddress | एंडपॉइंट 3 (आउट) |
0b00000010 |
bmAttributes | बल्क |
0x0040 |
wMaxPacketSize | 64 बाइट पैकेट |
0x00 |
bInterval | एक साथ कई सारे एंडपॉइंट पर लागू नहीं |
कॉन्फ़िगरेशन डिस्क्रिप्टर में एक साथ जोड़े गए कई डिस्क्रिप्टर होते हैं. हर फ़ील्ड bLength
और bDescriptorType
फ़ील्ड से शुरू होता है, ताकि उन्हें
पहचाना जा सके. पहला इंटरफ़ेस एक एचआईडी इंटरफ़ेस है, जिसमें एचआईडी डिस्क्रिप्टर और एक एंडपॉइंट होता है. इसका इस्तेमाल, ऑपरेटिंग सिस्टम को इनपुट इवेंट डिलीवर करने के लिए किया जाता है. दूसरा इंटरफ़ेस, वेंडर के लिए खास तौर पर बना इंटरफ़ेस है, जिसमें दो एंडपॉइंट होते हैं. इनका इस्तेमाल डिवाइस को निर्देश भेजने और बदले में जवाब पाने के लिए किया जा सकता है.
WebUSB डिस्क्रिप्टर
WebUSB, फ़र्मवेयर में बदलाव किए बिना भी कई डिवाइसों पर काम कर सकता है. हालांकि, कुछ अन्य फ़ंक्शन को चालू करने के लिए, डिवाइस को खास जानकारी देने वाले डिस्क्रिप्टर से मार्क किया जाता है. इससे पता चलता है कि यह सुविधा WebUSB के साथ काम कर सकता है. उदाहरण के लिए, आपके पास उस लैंडिंग पेज का यूआरएल तय करने का विकल्प होता है जिस पर ब्राउज़र, उपयोगकर्ता को डिवाइस के प्लग इन होने पर ले जा सके.
बाइनरी डिवाइस ऑब्जेक्ट स्टोर (बीओएस), यूएसबी 3.0 में शुरू किया गया एक कॉन्सेप्ट है. हालांकि, इसे वर्शन 2.1 के हिस्से के तौर पर यूएसबी 2.0 डिवाइसों पर भी बैकपोर्ट किया गया है. WebUSB के लिए सहायता का एलान करने की प्रक्रिया, BOS डिस्क्रिप्टर में नीचे दी गई प्लैटफ़ॉर्म की क्षमता के ब्यौरे को शामिल करने से शुरू होती है:
वैल्यू | फ़ील्ड | ब्यौरा |
---|---|---|
बाइनरी डिवाइस के ऑब्जेक्ट स्टोर डिस्क्रिप्टर | ||
0x05 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x0F |
bDescriptorType | बाइनरी डिवाइस के ऑब्जेक्ट स्टोर डिस्क्रिप्टर |
0x001D |
wTotalLength | डिस्क्रिप्टर की इस सीरीज़ की कुल लंबाई |
0x01 |
bNumDeviceCaps | बीओएस में डिवाइस की क्षमता के डिस्क्रिप्टर की संख्या |
WebUSB प्लैटफ़ॉर्म की क्षमता का डिस्क्रिप्टर | ||
0x18 |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x10 |
bDescriptorType | डिवाइस की क्षमता का डिस्क्रिप्टर |
0x05 |
bDevCapabilityType | प्लैटफ़ॉर्म की क्षमता का डिस्क्रिप्टर |
0x00 |
bReserved | |
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} |
PlatformCapablityUUID | लिटिल-एंडियन फ़ॉर्मैट में WebUSB प्लैटफ़ॉर्म की क्षमता के बारे में जानकारी देने वाला जीयूआईडी |
0x0100 |
bcdVersion | WebUSB डिस्क्रिप्टर का वर्शन 1.0 |
0x01 |
bVendorCode | WebUSB के लिए bRequest वैल्यू |
0x01 |
iLandingPage | लैंडिंग पेज का यूआरएल |
प्लैटफ़ॉर्म क्षमता यूयूआईडी, इसकी पहचान WebUSB Platform की क्षमता का ब्यौरा देने वाले के तौर पर करती है, जिससे डिवाइस के बारे में बुनियादी जानकारी मिलती है. ब्राउज़र, डिवाइस के बारे में ज़्यादा जानकारी फ़ेच कर सके, इसके लिए यह bVendorCode
वैल्यू का इस्तेमाल करता है. इससे डिवाइस को और अनुरोध भेजने में मदद मिलती है. फ़िलहाल, सिर्फ़ GET_URL
अनुरोध के बारे में बताया गया है, जो यूआरएल डिस्क्रिप्टर दिखाता है. ये, स्ट्रिंग डिस्क्रिप्टर की तरह होते हैं. हालांकि, इन्हें कम से कम बाइट में यूआरएल को कोड में बदलने के लिए डिज़ाइन किया गया है. "https://google.com"
का यूआरएल
डिस्क्रिप्टर कुछ ऐसा दिखेगा:
वैल्यू | फ़ील्ड | ब्यौरा |
---|---|---|
यूआरएल डिस्क्रिप्टर | ||
0x0D |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x03 |
bDescriptorType | यूआरएल डिस्क्रिप्टर |
0x01 |
bScheme | https:// |
"google.com" |
यूआरएल | UTF-8 से एन्कोड किया गया यूआरएल कॉन्टेंट |
जब आपके डिवाइस को ब्राउज़र में पहली बार प्लग किया जाता है, तो इस स्टैंडर्ड GET_DESCRIPTOR
कंट्रोल ट्रांसफ़र को जारी करके, BOS डिस्क्रिप्टर को पढ़ा जाता है:
bmRequestType | bRequest | wValue | wIndex | wLength | डेटा (जवाब) |
---|---|---|---|---|---|
0b10000000 |
0x06 |
0x0F00 |
0x0000 |
* | बीओएस डिस्क्रिप्टर |
आम तौर पर यह अनुरोध दो बार किया जाता है. पहली बार, जब पहली बार काफ़ी बड़े wLength
का इस्तेमाल किया जाता है, ताकि होस्ट को बहुत ज़्यादा डेटा ट्रांसफ़र किए बिना, wTotalLength
फ़ील्ड की वैल्यू का पता चल सके. इसके बाद, तब अनुरोध किया जाता है, जब डेटा की पूरी जानकारी पता चल जाती है.
अगर WebUSB Platform की क्षमता की जानकारी देने वाले डिस्क्रिप्टर ने iLandingPage
फ़ील्ड को ज़ीरो वैल्यू पर सेट किया है, तो ब्राउज़र WebUSB के लिए खास GET_URL
अनुरोध करेगा. इसके लिए, वह कंट्रोल ट्रांसफ़र जारी करेगा, जिसमें bRequest
को प्लैटफ़ॉर्म क्षमता डिस्क्रिप्टर से bVendorCode
वैल्यू पर और iLandingPage
वैल्यू पर सेट किया गया wValue
होगा. GET_URL
(0x02
) के लिए अनुरोध कोड wIndex
में चलेगा:
bmRequestType | bRequest | wValue | wIndex | wLength | डेटा (जवाब) |
---|---|---|---|---|---|
0b11000000 |
0x01 |
0x0001 |
0x0002 |
* | यूआरएल डिस्क्रिप्टर |
फिर से, डिस्क्रिप्टर की लंबाई की पहली जांच करने के लिए, यह अनुरोध दो बार जारी किया जा सकता है.
प्लैटफ़ॉर्म के हिसाब से ध्यान देने वाली बातें
WebUSB API, यूएसबी डिवाइस को ऐक्सेस करने के लिए एक जैसा इंटरफ़ेस उपलब्ध कराने की कोशिश करता है. हालांकि, इसके डेवलपर को ऐप्लिकेशन के लिए लागू होने वाली ज़रूरी शर्तों की जानकारी होनी चाहिए. जैसे, डिवाइस ऐक्सेस करने के लिए वेब ब्राउज़र की ज़रूरी शर्तें.
macOS
macOS के लिए, कुछ भी खास करने की ज़रूरत नहीं होती है. WebUSB का इस्तेमाल करने वाली वेबसाइट, डिवाइस से कनेक्ट हो सकती है. साथ ही, ऐसे इंटरफ़ेस पर दावा कर सकती है जिस पर किसी कर्नेल ड्राइवर या दूसरे ऐप्लिकेशन ने दावा नहीं किया है.
Linux
Linux, macOS की तरह है. हालांकि, ज़्यादातर डिस्ट्रिब्यूशन, डिफ़ॉल्ट रूप से यूएसबी डिवाइसों को खोलने की अनुमति वाले उपयोगकर्ता खाते सेट अप नहीं करते. udev नाम के सिस्टम डीमन की ज़िम्मेदारी होती है कि वह उपयोगकर्ता और ग्रुप को डिवाइस ऐक्सेस करने की अनुमति दे. इसी तरह, वेंडर और प्रॉडक्ट आईडी से मेल खाने वाले डिवाइस का मालिकाना हक, plugdev
ग्रुप को असाइन किया जाएगा. यह ग्रुप, सहायक डिवाइस (जैसे, कीबोर्ड, माउस, मॉनिटर, वेबकैम वगैरह) का ऐक्सेस रखने वाले उपयोगकर्ताओं का ही है:
SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="XXXX", GROUP="plugdev"
XXXX
को अपने डिवाइस के हेक्साडेसिमल वेंडर और प्रॉडक्ट आईडी से बदलें
उदाहरण के लिए, ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11"
किसी Nexus One फ़ोन से मेल खाएगा. इन्हें सामान्य "0x" प्रीफ़िक्स के बिना लिखा जाना चाहिए और सभी छोटे अक्षरों
की सही पहचान की जानी चाहिए. अपने डिवाइस के आईडी ढूंढने के लिए, कमांड लाइन
टूल lsusb
चलाएं.
यह नियम /etc/udev/rules.d
डायरेक्ट्री की किसी फ़ाइल में रखा जाना चाहिए.
जैसे ही डिवाइस प्लग इन किया जाएगा, यह नियम लागू हो जाएगा. आपको Udev को रीस्टार्ट करने की ज़रूरत नहीं है.
Android
Android प्लैटफ़ॉर्म, Linux पर आधारित है, लेकिन इसके लिए सिस्टम कॉन्फ़िगरेशन में किसी बदलाव की ज़रूरत नहीं होती. डिफ़ॉल्ट रूप से, जिस डिवाइस में ऑपरेटिंग सिस्टम में ड्राइवर नहीं होता वह ब्राउज़र में काम कर सकता है. डेवलपर को जानकारी होनी चाहिए
हालांकि, डिवाइस से कनेक्ट करते समय उपयोगकर्ताओं को एक और चरण पूरा करना
चाहिए. जब कोई उपयोगकर्ता
requestDevice()
को कॉल करने के जवाब में डिवाइस चुनता है, तो Android एक प्रॉम्प्ट दिखेगा. इसमें पूछा जाएगा कि Chrome को इसे ऐक्सेस करने की अनुमति देनी है या नहीं. अगर उपयोगकर्ता किसी ऐसी वेबसाइट पर वापस लौटता है जिसे पहले से ही किसी डिवाइस से कनेक्ट करने की अनुमति है और वेबसाइट open()
कॉल करती है, तब भी यह प्रॉम्प्ट फिर से दिखता है.
इसके अलावा, डेस्कटॉप Linux के मुकाबले Android पर ज़्यादा डिवाइसों को ऐक्सेस किया जा सकेगा क्योंकि डिफ़ॉल्ट रूप से, कम ड्राइवर शामिल किए जाते हैं. उदाहरण के लिए, एक बड़ी गलती, यूएसबी सीडीसी-एसीएम क्लास है, जिसे आम तौर पर यूएसबी-टू-सीरियल अडैप्टर से लागू किया जाता है. ऐसा इसलिए होता है, क्योंकि Android SDK में सीरियल डिवाइस से कम्यूनिकेट करने के लिए कोई एपीआई नहीं होता.
ChromeOS
ChromeOS भी Linux पर आधारित होता है. इसके लिए, सिस्टम के कॉन्फ़िगरेशन में कोई बदलाव करने की ज़रूरत नहीं होती. अनुमति देने वाली सेवा, यूएसबी डिवाइसों के ऐक्सेस को कंट्रोल करती है और ब्राउज़र को उन्हें तब तक ऐक्सेस करने देती है, जब तक कम से कम एक ऐसा इंटरफ़ेस हो जिस पर दावा नहीं किया गया है.
Windows
Windows ड्राइवर के मॉडल में एक अतिरिक्त शर्त शामिल की गई है. उपयोगकर्ता ऐप्लिकेशन से यूएसबी डिवाइस खोलने की सुविधा, डिफ़ॉल्ट रूप से काम नहीं करती. भले ही, कोई ड्राइवर लोड न हो. इसके बजाय, एक खास ड्राइव, WinUSB होता है, जिसे लोड करने की ज़रूरत होती है, ताकि डिवाइस ऐक्सेस करने के लिए इस्तेमाल किए जाने वाले इंटरफ़ेस ऐप्लिकेशन को उपलब्ध कराया जा सके. ऐसा, सिस्टम पर इंस्टॉल की गई कस्टम ड्राइवर जानकारी फ़ाइल (आईएनएफ़) की मदद से किया जा सकता है. इसके अलावा, गिनती के दौरान Microsoft OS कंपैटिबिलिटी डिस्क्रिप्टर देने के लिए, डिवाइस फ़र्मवेयर में बदलाव करके भी ऐसा किया जा सकता है.
ड्राइवर की जानकारी देने वाली फ़ाइल (आईएनएफ़)
ड्राइवर की जानकारी वाली फ़ाइल, Windows को यह बताती है कि किसी डिवाइस का पहली बार सामना करने पर क्या करना चाहिए. उपयोगकर्ता के सिस्टम में पहले से ही WinUSB ड्राइवर शामिल होता है, जो
आईएनएफ़ फ़ाइल को इंस्टॉल करने के इस नए नियम के साथ आपके वेंडर और प्रॉडक्ट आईडी से जोड़ने के लिए ज़रूरी है. नीचे दी गई फ़ाइल में इसका एक सामान्य उदाहरण दिया गया है. इसे .inf
एक्सटेंशन वाली फ़ाइल में सेव करें, "X" से मार्क किए गए सेक्शन को बदलें, फिर इस पर राइट क्लिक करें और संदर्भ मेन्यू से "इंस्टॉल करें" चुनें.
[Version]
Signature = "$Windows NT$"
Class = USBDevice
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer = 09/04/2012,13.54.20.543
; ========== Manufacturer/Models sections ===========
[Manufacturer]
%ManufacturerName% = Standard,NTx86,NTia64,NTamd64
[Standard.NTx86]
%USB\MyCustomDevice.DeviceDesc% = USB_Install,USB\VID_XXXX&PID_XXXX
[Standard.NTia64]
%USB\MyCustomDevice.DeviceDesc% = USB_Install,USB\VID_XXXX&PID_XXXX
[Standard.NTamd64]
%USB\MyCustomDevice.DeviceDesc% = USB_Install,USB\VID_XXXX&PID_XXXX
; ========== Class definition ===========
[ClassInstall32]
AddReg = ClassInstall_AddReg
[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2
; =================== Installation ===================
[USB_Install]
Include = winusb.inf
Needs = WINUSB.NT
[USB_Install.Services]
Include = winusb.inf
Needs = WINUSB.NT.Services
[USB_Install.HW]
AddReg = Dev_AddReg
[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
; =================== Strings ===================
[Strings]
ManufacturerName = "Your Company Name Here"
ClassName = "Your Company Devices"
USB\MyCustomDevice.DeviceDesc = "Your Device Name Here"
[Dev_AddReg]
सेक्शन, डिवाइस के लिए DeviceInterfaceGUID के सेट को कॉन्फ़िगर करता है. हर डिवाइस इंटरफ़ेस में GUID होना ज़रूरी है, ताकि कोई ऐप्लिकेशन उसे Windows API के ज़रिए
ढूंढ सके और उससे कनेक्ट कर सके. रैंडम जीयूआईडी जनरेट करने के लिए, New-Guid
PowerShell cmdlet या किसी ऑनलाइन टूल का इस्तेमाल करें.
गेम को डेवलप करने के लिए, Zadig टूल एक आसान इंटरफ़ेस उपलब्ध कराता है. इसकी मदद से, यूएसबी इंटरफ़ेस के लिए लोड किए गए ड्राइवर को WinUSB ड्राइवर से बदला जा सकता है.
Microsoft OS के साथ काम करने वाले डिस्क्रिप्टर
ऊपर दी गई INF फ़ाइल प्रोसेस मुश्किल है, क्योंकि इसके लिए हर उपयोगकर्ता की मशीन को समय से पहले कॉन्फ़िगर करना ज़रूरी होता है. Windows 8.1 और उसके बाद के वर्शन में, कस्टम यूएसबी डिस्क्रिप्टर इस्तेमाल करके, इसके विकल्प मिलते हैं. जब डिवाइस को पहली बार प्लग-इन किया जाता है, तब Windows ऑपरेटिंग सिस्टम को ये जानकारी मिलती है, जिसे आम तौर पर INF फ़ाइल में शामिल किया जाता है.
WebUSB डिस्क्रिप्टर को सेट अप करने के बाद, Microsoft के ओएस के साथ काम करने वाले डिस्क्रिप्टर को जोड़ना आसान होता है. पहले इस अतिरिक्त प्लैटफ़ॉर्म क्षमता डिस्क्रिप्टर
की मदद से BOS डिस्क्रिप्टर को बढ़ाएं. इसे असाइन करने के लिए, wTotalLength
और bNumDeviceCaps
को अपडेट करना न भूलें.
वैल्यू | फ़ील्ड | ब्यौरा |
---|---|---|
Microsoft OS 2.0 प्लैटफ़ॉर्म की क्षमता का डिस्क्रिप्टर | ||
0x1C |
bLength | इस डिस्क्रिप्टर का साइज़ |
0x10 |
bDescriptorType | डिवाइस की क्षमता का डिस्क्रिप्टर |
0x05 |
bDevCapabilityType | प्लैटफ़ॉर्म की क्षमता का डिस्क्रिप्टर |
0x00 |
bReserved | |
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} |
PlatformCapablityUUID | लिटिल-एंडियन फ़ॉर्मैट में, Microsoft OS 2.0 प्लैटफ़ॉर्म के साथ काम करने के बारे में बताने वाला जीयूआईडी |
0x06030000 |
dwWindowsVersion | कम से कम संगत Windows वर्शन (Windows 8.1) |
0x00B2 |
wMSOSDescriptorSetTotalLength | डिस्क्रिप्टर सेट की कुल लंबाई |
0x02 |
bMS_VendorCode | आगे Microsoft डिस्क्रिप्टर को वापस पाने के लिए bRequest वैल्यू |
0x00 |
bAltEnumCode | डिवाइस पर वैकल्पिक सूची का इस्तेमाल नहीं किया जा सकता |
WebUSB डिस्क्रिप्टर की तरह ही, आपको एक bRequest
वैल्यू चुननी होगी, ताकि इन डिस्क्रिप्टर से जुड़े कंट्रोल ट्रांसफ़र में उसका इस्तेमाल किया जा सके. इस उदाहरण में, मैंने
0x02
को चुना है. wIndex
में रखा गया 0x07
, डिवाइस से Microsoft OS 2.0 डिस्क्रिप्टर सेट को वापस लाने का निर्देश है.
bmRequestType | bRequest | wValue | wIndex | wLength | डेटा (जवाब) |
---|---|---|---|---|---|
0b11000000 |
0x02 |
0x0000 |
0x0007 |
* | MS OS 2.0 जानकारी का सेट |
किसी यूएसबी डिवाइस में कई फ़ंक्शन हो सकते हैं. इसलिए, डिस्क्रिप्टर सेट का पहला हिस्सा यह बताता है कि इसके बाद आने वाली प्रॉपर्टी किस फ़ंक्शन से जुड़ी हैं. नीचे दिया गया उदाहरण, कंपोज़िट डिवाइस के इंटरफ़ेस 1 को कॉन्फ़िगर करता है. डिस्क्रिप्टर, ओएस को इस इंटरफ़ेस के बारे में दो अहम जानकारी देता है. साथ काम करने वाले आईडी डिस्क्रिप्टर से, Windows को पता चलता है कि यह डिवाइस WinUSBdriver के साथ काम करता है. रजिस्ट्री प्रॉपर्टी डिस्क्रिप्टर, ऊपर दिए गए INF के उदाहरण के [Dev_AddReg]
सेक्शन की तरह ही काम करता है. इसमें, इस फ़ंक्शन को डिवाइस इंटरफ़ेस GUID असाइन करने के लिए, रजिस्ट्री प्रॉपर्टी सेट की गई है.
वैल्यू | फ़ील्ड | ब्यौरा |
---|---|---|
Microsoft OS 2.0 डिस्क्रिप्टर सेट हेडर | ||
0x000A |
wLength | इस डिस्क्रिप्टर का साइज़ |
0x0000 |
wDescriptorType | डिस्क्रिप्टर सेट हेडर डिस्क्रिप्टर |
0x06030000 |
dwWindowsVersion | कम से कम संगत Windows वर्शन (Windows 8.1) |
0x00B2 |
wTotalLength | डिस्क्रिप्टर सेट की कुल लंबाई |
Microsoft OS 2.0 कॉन्फ़िगरेशन के सबसेट का हेडर | ||
0x0008 |
wLength | इस डिस्क्रिप्टर का साइज़ |
0x0001 |
wDescriptorType | कॉन्फ़िगरेशन सबसेट हेडर का ब्यौरा |
0x00 |
bConfigurationValue | कॉन्फ़िगरेशन 1 पर लागू होता है (आम तौर पर 1 से इंडेक्स किए गए कॉन्फ़िगरेशन के बावजूद, 0 से इंडेक्स किया जाता है) |
0x00 |
bReserved | शून्य पर सेट होना चाहिए |
0x00A8 |
wTotalLength | इस हेडर सहित सबसेट की कुल लंबाई |
Microsoft OS 2.0 फ़ंक्शन के सबसेट का हेडर | ||
0x0008 |
wLength | इस डिस्क्रिप्टर का साइज़ |
0x0002 |
wDescriptorType | फ़ंक्शन के सबसेट का हेडर डिस्क्रिप्टर |
0x01 |
bFirstInterface | फ़ंक्शन का पहला इंटरफ़ेस |
0x00 |
bReserved | शून्य पर सेट होना चाहिए |
0x00A0 |
wSubsetLength | इस हेडर सहित सबसेट की कुल लंबाई |
Microsoft OS 2.0 के साथ काम करने वाला आईडी डिस्क्रिप्टर | ||
0x0014 |
wLength | इस डिस्क्रिप्टर का साइज़ |
0x0003 |
wDescriptorType | काम करने वाला आईडी डिस्क्रिप्टर |
"WINUSB\0\0" |
CompatibileID | ASCII स्ट्रिंग, 8 बाइट की पैड की गई |
"\0\0\0\0\0\0\0\0" |
SubCompatibleID | ASCII स्ट्रिंग, 8 बाइट की पैड की गई |
Microsoft OS 2.0 रजिस्ट्री प्रॉपर्टी डिस्क्रिप्टर | ||
0x0084 |
wLength | इस डिस्क्रिप्टर का साइज़ |
0x0004 |
wDescriptorType | रजिस्ट्री प्रॉपर्टी डिस्क्रिप्टर |
0x0007 |
wPropertyDataType | REG_MULTI_SZ |
0x002A |
wPropertyNameLength | प्रॉपर्टी के नाम की वर्ण सीमा |
"DeviceInterfaceGUIDs\0" |
PropertyName | UTF-16LE में एन्कोड किए गए शून्य टर्मिनेटर के साथ प्रॉपर्टी का नाम |
0x0050 |
wPropertyDataLength | प्रॉपर्टी वैल्यू की वर्ण सीमा |
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" |
PropertyData | GUID और UTF-16LE में एन्कोड किए गए दो शून्य टर्मिनेटर |
Windows इस जानकारी के लिए डिवाइस से सिर्फ़ एक बार क्वेरी करेगा. अगर डिवाइस सही जानकारी देने के साथ जवाब नहीं देता है, तो अगली बार डिवाइस कनेक्ट होने पर फिर से नहीं पूछा जाएगा. Microsoft ने यूएसबी डिवाइस रजिस्ट्री की एक सूची दी है. इसमें उन रजिस्ट्री एंट्री के बारे में बताया गया है जो किसी डिवाइस की जानकारी को कैलकुलेट करते समय बनाई गई थीं. जांच करते समय, किसी डिवाइस के लिए बनाई गई एंट्री मिटाएं. इससे Windows को डिस्क्रिप्टर को फिर से पढ़ने की कोशिश करनी होगी.
इन डिस्क्रिप्टर को इस्तेमाल करने के तरीके के बारे में ज़्यादा जानकारी के लिए, Microsoft की ब्लॉग पोस्ट देखें.
उदाहरण
इन प्रोजेक्ट में ऐसे कोड का उदाहरण दिया गया है जिसे लागू करने के लिए, WebUSB जानकारी वाले डिवाइसों का इस्तेमाल किया जाता है. इनमें WebUSB की जानकारी देने वाले और Microsoft OS डिस्क्रिप्टर, दोनों शामिल होते हैं: