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