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

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

इस लेख में बताया गया है कि किस तरह एक डिवाइस बनाया जा सकता है. WebUSB API. API के बारे में कम शब्दों में जानने के लिए, यूएसबी डिवाइसों को ऐक्सेस करना देखें वेब पर.

बैकग्राउंड

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

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

USB की एक अन्य सुविधा यह है कि डिवाइस होस्ट करता है, जिससे वे कनेक्ट होते हैं. हर इंटरफ़ेस इनमें से किसी एक स्टैंडर्ड क्लास हो या वेंडर के हिसाब से हो. जब कोई ऑपरेटिंग सिस्टम डिवाइस को संभालने के लिए अधिकार रखने वाले ड्राइवर हों. हर इंटरफ़ेस के लिए अलग-अलग ड्राइवर. उदाहरण के लिए, यूएसबी वेबकैम की सुविधा में आम तौर पर दो इंटरफ़ेस होते हैं. यूएसबी वीडियो क्लास लागू करना (कैमरे के लिए) और एक यूएसबी वीडियो क्लास लागू करना ऑडियो क्लास (माइक्रोफ़ोन के लिए). ऑपरेटिंग सिस्टम एक बार में भी "वेबकैम ड्राइवर" हालांकि, यह अलग-अलग वीडियो और ऑडियो क्लास ड्राइवर को लोड करता है जो डिवाइस के अलग-अलग फ़ंक्शन की ज़िम्मेदारी लेते हैं. यह इंटरफ़ेस क्लास की कंपोज़िशन में आपको ज़्यादा सुविधाएं मिलती हैं.

एपीआई की बुनियादी बातें

कई स्टैंडर्ड यूएसबी क्लास में, उनसे जुड़े वेब एपीआई होते हैं. उदाहरण के लिए, पेज getUserMedia() का इस्तेमाल करके वीडियो क्लास डिवाइस से वीडियो कैप्चर कर सकता है इसके अलावा, मानवीय इंटरफ़ेस (एचआईडी) क्लास डिवाइस की मदद से इनपुट इवेंट पा सकते हैं के लिए, KeyboardEvents या PointerEvents के लिए या गेमपैड या WebHID एपीआई. जिस तरह सभी डिवाइसों में स्टैंडर्ड क्लास डेफ़िनिशन लागू नहीं की जाती उसी तरह डिवाइस, मौजूदा वेब प्लैटफ़ॉर्म एपीआई से जुड़ी सुविधाएं लागू करते हैं. टास्क कब शुरू होगा तब WebUSB API, साइटों को किसी वेंडर के लिए खास इंटरफ़ेस का दावा करने और इसके लिए सीधे तौर पर विज्ञापन की जानकारी मिलती है.

किसी डिवाइस को WebUSB की मदद से ऐक्सेस करने की ज़रूरी शर्तें थोड़ी अलग होती हैं एक प्लैटफ़ॉर्म से दूसरे प्लैटफ़ॉर्म पर जाने के लिए किया जा सकता है, क्योंकि ऑपरेटिंग सिस्टम यूएसबी को कैसे मैनेज करते हैं हालांकि, बुनियादी शर्त यह है कि डिवाइस में पहले से ही उस इंटरफ़ेस पर दावा करने वाला ड्राइवर जिसे पेज कंट्रोल करना चाहता है. यह इवेंट, ओएस वेंडर या डिवाइस ड्राइवर की ओर से दिया गया सामान्य क्लास ड्राइवर . यूएसबी डिवाइस में कई इंटरफ़ेस हो सकते हैं, जिनमें से हर एक इंटरफ़ेस का अपना ड्राइवर हो, तो ऐसा डिवाइस बनाना संभव है जिसके लिए कुछ इंटरफ़ेस ड्राइवर ने दावा किया हुआ है और बाकी लोगों को ब्राउज़र से ऐक्सेस किया जा सकता है.

उदाहरण के लिए, एक हाई-एंड यूएसबी कीबोर्ड ऐसा एचआईडी क्लास इंटरफ़ेस दे सकता है जो फिर, ऑपरेटिंग सिस्टम के इनपुट सबसिस्टम और वेंडर के हिसाब से ऐसा इंटरफ़ेस जो कॉन्फ़िगरेशन टूल के ज़रिए इस्तेमाल करने के लिए WebUSB के लिए उपलब्ध रहता है. यह टूल को मैन्युफ़ैक्चरर की वेबसाइट पर चलाया जा सकता है, ताकि उपयोगकर्ता अपने डिवाइस पर कुछ सुविधाएं काम करती हैं. जैसे, मैक्रो बटन और लाइटिंग इफ़ेक्ट किसी प्लैटफ़ॉर्म के लिए खास सॉफ़्टवेयर इंस्टॉल करना. ऐसे डिवाइस का कॉन्फ़िगरेशन डिस्क्रिप्टर कुछ ऐसा दिखाई देगा:

मान फ़ील्ड ब्यौरा
कॉन्फ़िगरेशन डिस्क्रिप्टर
0x09 bLength इस डिस्क्रिप्टर का साइज़
0x02 bDescriptorType कॉन्फ़िगरेशन डिस्क्रिप्टर
0x0039 wTotalLength डिस्क्रिप्टर की इस सीरीज़ की कुल लंबाई
0x02 bNumInterfaces इंटरफ़ेस की संख्या
0x01 bConfigurationValue कॉन्फ़िगरेशन 1
0x00 iConfiguration कॉन्फ़िगरेशन का नाम (कोई नहीं)
0b1010000 bmAttributes रिमोट वेकअप की सुविधा वाला सेल्फ़-पावर्ड डिवाइस
0x32 bMaxPower ज़्यादा से ज़्यादा पावर की जानकारी दो 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 पहला इंटरफ़ेस
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 में पेश किया गया एक सिद्धांत है. हालांकि, इसमें भी बैकपोर्ट किया गया हो. एलान किया जा रहा है WebUSB की सुविधा, नीचे दी गई प्लैटफ़ॉर्म की क्षमता को शामिल करने से शुरू होती है BOS डिस्क्रिप्टर में जानकारी:

मान फ़ील्ड ब्यौरा
बाइनरी डिवाइस ऑब्जेक्ट स्टोर डिस्क्रिप्टर
0x05 bLength इस डिस्क्रिप्टर का साइज़
0x0F bDescriptorType बाइनरी डिवाइस ऑब्जेक्ट स्टोर डिस्क्रिप्टर
0x001D wTotalLength डिस्क्रिप्टर की इस सीरीज़ की कुल लंबाई
0x01 bNumDeviceCaps BOS में डिवाइस की क्षमता के डिस्क्रिप्टर की संख्या
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 लैंडिंग पेज का यूआरएल

प्लैटफ़ॉर्म की क्षमता के UUID की मदद से, यह पता लगाया जाता है कि WebUSB प्लैटफ़ॉर्म की क्षमता क्या है डिस्क्रिप्टर, जो डिवाइस के बारे में बुनियादी जानकारी देता है. ब्राउज़र के लिए उस डिवाइस के बारे में ज़्यादा जानकारी फ़ेच करने के लिए, जिसके लिए यह bVendorCode वैल्यू का इस्तेमाल करता है डिवाइस को दूसरे अनुरोध भेज सकता है. फ़िलहाल, सिर्फ़ यह अनुरोध किया गया है GET_URL, जो यूआरएल डिस्क्रिप्टर दिखाता है. ये स्ट्रिंग के जैसे हैं डिस्क्रिप्टर का इस्तेमाल किया जाता है, लेकिन उन्हें सबसे कम बाइट में यूआरएल को कोड में बदलने के लिए डिज़ाइन किया गया है. यूआरएल "https://google.com" के लिए डिस्क्रिप्टर ऐसा दिखेगा:

मान फ़ील्ड ब्यौरा
यूआरएल डिस्क्रिप्टर
0x0D bLength इस डिस्क्रिप्टर का साइज़
0x03 bDescriptorType यूआरएल डिस्क्रिप्टर
0x01 bScheme https://
"google.com" यूआरएल UTF-8 में एन्कोड किया गया यूआरएल का कॉन्टेंट

ब्राउज़र में पहली बार प्लग-इन होने पर, BOS डिस्क्रिप्टर के हिसाब से इस स्टैंडर्ड GET_DESCRIPTOR कंट्रोल ट्रांसफ़र को जारी किया जा रहा है:

bmRequestType bRequest wValue wIndex wLength डेटा (रिस्पॉन्स)
0b10000000 0x06 0x0F00 0x0000 * BOS डिस्क्रिप्टर

आम तौर पर, यह अनुरोध दो बार किया जाता है. पहली बार wLength ज़रूरत के मुताबिक ताकि होस्ट को wTotalLength फ़ील्ड की वैल्यू का पता बिना बड़े पैमाने पर ट्रांसफ़र करते हैं और फिर जब पूरे डिस्क्रिप्टर की लंबाई होती है जाना जाता है.

अगर WebUSB Platform की क्षमता के डिस्क्रिप्टर में iLandingPage फ़ील्ड को इस पर सेट किया गया है ब्राउज़र कोई ऐसी वैल्यू दिखाता है जो शून्य नहीं होती. इसके बाद, वह WebUSB के लिए खास GET_URL अनुरोध करता है कंट्रोल ट्रांसफ़र जारी करके, bRequest की वैल्यू को bVendorCode पर सेट किया गया प्लैटफ़ॉर्म की क्षमता के डिस्क्रिप्टर और wValue से iLandingPage पर सेट किया गया वैल्यू. 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().

इसके अलावा, Android पर डेस्कटॉप Linux के मुकाबले और भी डिवाइस ऐक्सेस किए जा सकेंगे क्योंकि कम ड्राइवर शामिल होते हैं. एक अहम चूक, उदाहरण के लिए, क्या यूएसबी सीडीसी-एसीएम क्लास आम तौर पर यूएसबी-टू-सीरियल अडैप्टर के ज़रिए लागू की जाती है सीरियल डिवाइस से कम्युनिकेट करने के लिए, Android SDK में कोई एपीआई नहीं है.

ChromeOS

ChromeOS, Linux पर आधारित है. साथ ही, इसमें किसी बदलाव की ज़रूरत नहीं है से लिंक करें. अनुमति_ब्रोकर की सेवा, यूएसबी के ऐक्सेस को कंट्रोल करती है इससे ब्राउज़र ऐक्सेस कर सकता है, बशर्ते कम से कम एक दावा न किया गया इंटरफ़ेस.

Windows

Windows के ड्राइवर वाले मॉडल में एक अतिरिक्त शर्त शामिल की गई है. इसे नापसंद करें जिन प्लेटफ़ॉर्म को उपयोगकर्ता ऐप्लिकेशन से USB डिवाइस खोलने की क्षमता से बेहतर बनाया गया है, वे सभी को डिफ़ॉल्ट बनाया जा सकता है, भले ही कोई ड्राइवर लोड न किया गया हो. इसके बजाय, यहां एक खास WinUSB, ड्राइवर, जिसे इंटरफ़ेस उपलब्ध कराने के लिए लोड करना पड़ता है जिनका इस्तेमाल ऐप्लिकेशन, डिवाइस को ऐक्सेस करने के लिए करते हैं. ऐसा करने के लिए, ड्राइवर जानकारी फ़ाइल (INF) को सिस्टम पर या डिवाइस में बदलाव करके इंस्टॉल किया गया ताकि 3D मॉडल के साथ गिनती.

ड्राइवर की जानकारी वाली फ़ाइल (INF)

ड्राइवर की जानकारी वाली फ़ाइल से, Windows को यह पता चलता है कि डिवाइस मिलने पर क्या करना चाहिए पहली बार इस्तेमाल कर रहे हैं. उपयोगकर्ता के सिस्टम में पहले से ही WinUSB ड्राइवर शामिल होता है आपके वेंडर और प्रॉडक्ट आईडी को जोड़ने के लिए, INF फ़ाइल को अपने इंस्टॉल करने के इस नए नियम के साथ. नीचे दी गई फ़ाइल बुनियादी उदाहरण है. इसे .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] सेक्शन, डिवाइस. हर डिवाइस इंटरफ़ेस में एक जीयूआईडी (ग्लोबली यूनीक आइडेंटिफ़ायर) होना चाहिए, ताकि ऐप्लिकेशन Windows API का इस्तेमाल करके, उस खाते को ढूंढना और उससे कनेक्ट करना. New-Guid PowerShell का इस्तेमाल करना cmdlet या रैंडम जीयूआईडी जनरेट करने के लिए कोई ऑनलाइन टूल.

Zadig टूल को डेवलप करने के लिए, यह टूल आसान इंटरफ़ेस उपलब्ध कराता है यूएसबी इंटरफ़ेस के लिए लोड किए गए ड्राइवर को WinUSB ड्राइवर से बदल देता है.

Microsoft OS के साथ काम करने वाले डिस्क्रिप्टर

ऊपर दी गई INF फ़ाइल को समझना मुश्किल है, क्योंकि इसके लिए हर उपयोगकर्ता को एक कॉन्फ़िगरेशन की ज़रूरत होती है उपयोगकर्ता को मशीन से सुरक्षित रखने में मदद मिलती है. विकल्प के तौर पर, Windows 8.1 और उसके बाद के वर्शन यूएसबी डिस्क्रिप्टर का इस्तेमाल करता है. ये डिस्क्रिप्टर जानकारी देते हैं कि डिवाइस को पहली बार प्लग-इन करने पर, Windows ऑपरेटिंग सिस्टम में को सामान्य रूप से INF फ़ाइल में शामिल किया जाना चाहिए.

WebUSB डिस्क्रिप्टर सेट अप हो जाने के बाद, Microsoft के OS को जोड़ना आसान हो जाता है साथ काम करने वाले डिस्क्रिप्टर का भी इस्तेमाल करें. सबसे पहले, इसकी मदद से 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. Microsoft OS को वापस लाने का निर्देश 0x07 है, जो wIndex में दिया गया है डिवाइस से 2.0 विवरण सेट किया गया.

bmRequestType bRequest wValue wIndex wLength डेटा (रिस्पॉन्स)
0b11000000 0x02 0x0000 0x0007 * MS OS 2.0 विवरण सेट

यूएसबी डिवाइस में कई फ़ंक्शन हो सकते हैं, इसलिए डिस्क्रिप्टर का पहला हिस्सा सेट से पता चलता है कि फ़ॉलो की जाने वाली प्रॉपर्टी किस फ़ंक्शन से जुड़ी हैं. कॉन्टेंट बनाने नीचे दिए गए उदाहरण में कंपोज़िट डिवाइस के इंटरफ़ेस 1 को कॉन्फ़िगर किया गया है. डिस्क्रिप्टर बताता है कि ओएस से जुड़ी दो ज़रूरी जानकारी है. काम करने वाले आईडी डिस्क्रिप्टर से Windows को पता चलता है कि यह डिवाइस WinUSB के साथ काम करता है ड्राइवर. रजिस्ट्री प्रॉपर्टी डिस्क्रिप्टर, ऊपर दिए गए INF उदाहरण का [Dev_AddReg] सेक्शन. रजिस्ट्री प्रॉपर्टी को इस फ़ंक्शन को डिवाइस इंटरफ़ेस जीयूआईडी असाइन करें.

मान फ़ील्ड ब्यौरा
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 पर लागू होता है (कॉन्फ़िगरेशन के बावजूद, 0 से इंडेक्स किया गया) सामान्य रूप से 1 से इंडेक्स किया जाता है)
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 8 बाइट वाली ASCII स्ट्रिंग
"\0\0\0\0\0\0\0\0" SubCompatibleID 8 बाइट वाली ASCII स्ट्रिंग
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 जीयूआईडी (ग्लोबली यूनीक आइडेंटिफ़ायर) के साथ-साथ, UTF-16LE में एन्कोड किए गए दो शून्य टर्मिनेटर

Windows इस जानकारी के लिए डिवाइस पर सिर्फ़ एक बार क्वेरी करेगा. अगर डिवाइस मान्य डिस्क्रिप्टर के साथ जवाब नहीं देता, तो यह अगली बार डिवाइस कनेक्ट है. Microsoft ने यूएसबी डिवाइस रजिस्ट्री की सूची उपलब्ध कराई है किसी डिवाइस की गिनती करते समय बनाई गई रजिस्ट्री एंट्री के बारे में जानकारी देने वाली एंट्री. टास्क कब शुरू होगा Windows को ज़बरदस्ती पढ़ने के लिए किसी डिवाइस के लिए बनाई गई एंट्री मिटाएं ब्यौरे को फिर से शामिल कर सकते हैं.

ज़्यादा जानकारी के लिए, Microsoft की ब्लॉग पोस्ट देखें. इसमें बताया गया है कि इन सोर्स का इस्तेमाल कैसे किया जा सकता है डिस्क्रिप्टर शामिल करें.

उदाहरण

WebUSB की जानकारी वाले डिवाइसों को लागू करने वाले कोड का उदाहरण, जिनमें WebUSB दोनों शामिल हैं डिस्क्रिप्टर और Microsoft OS डिस्क्रिप्टर को इन प्रोजेक्ट में देखा जा सकता है: