WebUSB के लिए डिवाइस बनाना

WebUSB API का पूरा फ़ायदा पाने के लिए, कोई डिवाइस बनाएं.

Reilly Grant
Reilly Grant

इस लेख में 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 के साथ काम कर सकता है. उदाहरण के लिए, आपके पास उस लैंडिंग पेज का यूआरएल तय करने का विकल्प होता है जिस पर ब्राउज़र, उपयोगकर्ता को डिवाइस के प्लग इन होने पर ले जा सके.

Chrome में 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 डिस्क्रिप्टर, दोनों शामिल होते हैं: