การสร้างอุปกรณ์สำหรับ WebUSB

สร้างอุปกรณ์เพื่อใช้ประโยชน์จาก WebUSB API อย่างเต็มที่

บทความนี้อธิบายวิธีสร้างอุปกรณ์เพื่อใช้ประโยชน์จาก WebUSB API สำหรับข้อมูลเบื้องต้นเกี่ยวกับ API เอง โปรดดูที่เข้าถึงอุปกรณ์ USB บนเว็บ

ที่มา

Universal Serial Bus (USB) ได้กลายมาเป็นอินเทอร์เฟซที่ใช้กันมากที่สุดสำหรับ เชื่อมต่ออุปกรณ์ต่อพ่วงกับอุปกรณ์คอมพิวเตอร์เดสก์ท็อปและอุปกรณ์เคลื่อนที่ นอกจาก การกำหนดลักษณะทางไฟฟ้าของรถบัสและรุ่นทั่วไปของ ในการสื่อสารกับอุปกรณ์ ข้อมูลจำเพาะของ USB จะรวมชุดคลาสของอุปกรณ์ นี่เป็นโมเดลทั่วไปสำหรับอุปกรณ์บางประเภท เช่น เป็นพื้นที่เก็บข้อมูล เสียง วิดีโอ เครือข่าย และอื่นๆ ที่ผู้ผลิตอุปกรณ์สามารถ สำหรับการใช้งานจริง ข้อดีของข้อกำหนดจำเพาะระดับอุปกรณ์เหล่านี้คือ ผู้ให้บริการระบบปฏิบัติการ สามารถติดตั้งใช้งานไดรเวอร์เดี่ยวโดยพิจารณาจากคลาส ("ไดรเวอร์คลาส") และอุปกรณ์ใดๆ ที่นำคลาสดังกล่าวไปใช้ ที่รองรับ นี่เป็นการพัฒนาที่ยอดเยี่ยมสำหรับผู้ผลิตทุกรายที่ต้องเขียน ไดรเวอร์อุปกรณ์ของตนเอง

แต่อุปกรณ์บางเครื่องไม่เข้ากับคลาสอุปกรณ์มาตรฐานเหล่านี้ ต ผู้ผลิตอาจเลือกที่จะติดป้ายกำกับอุปกรณ์ของตนว่า คลาสเฉพาะผู้ให้บริการ ในกรณีนี้ ระบบปฏิบัติการจะเลือกอุปกรณ์ ไดรเวอร์ที่จะโหลดโดยอิงจากข้อมูลที่ให้ไว้ในแพ็กเกจคนขับของผู้ให้บริการ โดยปกติเป็นชุดผู้ให้บริการและรหัสผลิตภัณฑ์ซึ่งเป็นที่ทราบว่าควรใช้ โปรโตคอลเฉพาะผู้ให้บริการ

ฟีเจอร์อีกอย่างหนึ่งของ USB คืออุปกรณ์อาจมีอินเทอร์เฟซที่หลากหลาย โฮสต์ที่อุปกรณ์เชื่อมต่ออยู่ แต่ละอินเทอร์เฟซสามารถใช้ คลาสที่เป็นมาตรฐานหรือเจาะจงผู้ให้บริการ เมื่อระบบปฏิบัติการเลือก ในการจัดการอุปกรณ์ อินเทอร์เฟซแต่ละแบบสามารถอ้างสิทธิ์ คนขับ ตัวอย่างเช่น เว็บแคม USB มักมีอินเทอร์เฟซ 2 แบบ ได้แก่ ใช้คลาสวิดีโอ USB (สำหรับกล้อง) และอีกชุดหนึ่งใช้ USB คลาสเสียง (สำหรับไมโครโฟน) ระบบปฏิบัติการไม่ได้โหลด "ไดรเวอร์เว็บแคม" แต่จะโหลดไดรเวอร์คลาสวิดีโอและเสียงอิสระแทน ซึ่งทำหน้าที่แยกฟังก์ชันต่างๆ ของอุปกรณ์ ช่วงเวลานี้ องค์ประกอบของคลาสอินเทอร์เฟซมีความยืดหยุ่นมากขึ้น

ข้อมูลเบื้องต้นเกี่ยวกับ API

คลาส USB มาตรฐานจำนวนมากมี API ของเว็บที่สอดคล้องกัน ตัวอย่างเช่น หน้าสามารถบันทึกวิดีโอจากอุปกรณ์คลาสวิดีโอโดยใช้ getUserMedia() หรือได้รับเหตุการณ์อินพุตจากอุปกรณ์คลาสที่มนุษย์สร้างขึ้น (HID) ด้วยการฟัง สำหรับ KeyboardEvents หรือ PointerEvents หรือใช้เกมแพดหรือ WebHID API เช่นเดียวกับอุปกรณ์บางประเภทที่ใช้คำจำกัดความคลาสมาตรฐาน ไม่ใช่ทุกอุปกรณ์ จะใช้ฟีเจอร์ที่สอดคล้องกับ API ของแพลตฟอร์มเว็บที่มีอยู่ วันและเวลา ในกรณีนี้ WebUSB API สามารถเติมเต็มช่องว่างดังกล่าวโดยมอบวิธีสำหรับเว็บไซต์ เพื่ออ้างสิทธิ์อินเทอร์เฟซเฉพาะผู้ให้บริการ และใช้การสนับสนุนโดยตรงจาก ภายในหน้าเว็บ

ข้อกำหนดเฉพาะสำหรับอุปกรณ์ที่เข้าถึงได้ผ่าน WebUSB จะแตกต่างกันไปเล็กน้อย จากแต่ละแพลตฟอร์ม เพราะวิธีที่ระบบปฏิบัติการจัดการ USB แตกต่างกัน อุปกรณ์ แต่ข้อกำหนดเบื้องต้นคือ อุปกรณ์ไม่ควรมี ไดรเวอร์ที่อ้างสิทธิ์อินเทอร์เฟซที่หน้าเว็บต้องการควบคุม ซึ่งอาจเป็น ไดรเวอร์คลาสทั่วไปที่จัดหาให้โดยผู้ให้บริการระบบปฏิบัติการหรือไดรเวอร์อุปกรณ์ที่จัดหาให้ ผู้ให้บริการ เนื่องจากอุปกรณ์ USB สามารถให้บริการได้หลายอินเทอร์เฟซ ซึ่งแต่ละอินเทอร์เฟซอาจ มีไดรเวอร์ของตัวเอง คุณสามารถสร้างอุปกรณ์สำหรับอินเทอร์เฟซบางรายการได้ ถูกอ้างสิทธิ์โดยคนขับและบุคคลอื่นๆ สามารถเข้าถึงได้โดยเบราว์เซอร์

ตัวอย่างเช่น แป้นพิมพ์ USB ระดับไฮเอนด์อาจมีอินเทอร์เฟซคลาส HID ที่ จะถูกอ้างสิทธิ์โดยระบบย่อยของระบบปฏิบัติการและข้อมูลเฉพาะผู้ให้บริการ ที่ยังคงพร้อมใช้งานกับ 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 คลาสอินเทอร์เฟซ HID
0x01 bInterfaceSubClass คลาสย่อยของอินเทอร์เฟซการเปิดเครื่อง
0x01 bInterfaceProtocol แป้นพิมพ์
0x00 iInterface ชื่ออินเทอร์เฟซ (ไม่มี)
ข้อบ่งชี้ HID
0x09 bLength ขนาดของข้อบ่งชี้นี้
0x21 bDescriptorType ข้อบ่งชี้ HID
0x0101 bcdHID HID เวอร์ชัน 1.1
0x00 bCountryCode ประเทศเป้าหมายของฮาร์ดแวร์
0x01 bNumDescriptors จำนวนข้อบ่งชี้คลาส HID ที่จะติดตาม
0x22 bDescriptorType ประเภทข้อบ่งชี้รายงาน
0x003F wDescriptorLength ความยาวรวมของข้อบ่งชี้รายงาน
ข้อบ่งชี้ปลายทาง
0x07 bLength ขนาดของข้อบ่งชี้นี้
0x05 bDescriptorType ข้อบ่งชี้ปลายทาง
0b10000001 bEndpointAddress ปลายทาง 1 (IN)
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 (IN)
0b00000010 bmAttributes เป็นกลุ่ม
0x0040 wMaxPacketSize แพ็กเก็ต 64 ไบต์
0x00 bInterval ไม่มีสําหรับปลายทางจำนวนมาก
ข้อบ่งชี้ปลายทาง
0x07 bLength ขนาดของข้อบ่งชี้นี้
0x05 bDescriptorType ข้อบ่งชี้ปลายทาง
0b00000011 bEndpointAddress ปลายทาง 3 (OUT)
0b00000010 bmAttributes เป็นกลุ่ม
0x0040 wMaxPacketSize แพ็กเก็ต 64 ไบต์
0x00 bInterval ไม่มีสําหรับปลายทางจำนวนมาก

ข้อบ่งชี้การกำหนดค่าประกอบด้วยข้อบ่งชี้หลายข้อที่ต่อกัน แต่ละรายการจะขึ้นต้นด้วย bLength และ bDescriptorType สามารถระบุได้ อินเทอร์เฟซแรกคืออินเทอร์เฟซ HID ที่เชื่อมโยงกับ ใช้ข้อบ่งชี้ HID และปลายทางเดี่ยวเพื่อส่งเหตุการณ์อินพุตไปยัง ระบบปฏิบัติการ อินเทอร์เฟซที่ 2 เป็นอินเทอร์เฟซเฉพาะผู้ให้บริการ โดยมี ปลายทางที่สามารถใช้เพื่อส่งคำสั่งไปยังอุปกรณ์และรับการตอบสนอง เป็นการตอบแทน

ตัวบอก WebUSB

แม้ว่า WebUSB จะทำงานกับอุปกรณ์จำนวนมากได้โดยไม่ต้องแก้ไขเฟิร์มแวร์ ใช้ฟังก์ชันเพิ่มเติมได้ด้วยการทำเครื่องหมายอุปกรณ์ด้วย ซึ่งบ่งชี้ถึงการรองรับ WebUSB เช่น คุณสามารถระบุ URL ของหน้า Landing Page ที่เบราว์เซอร์ สามารถนำผู้ใช้ไปได้เมื่ออุปกรณ์ของคุณคือ เสียบปลั๊กอยู่

วันที่ ภาพหน้าจอของการแจ้งเตือน WebUSB ใน Chrome
การแจ้งเตือน WebUSB

The Branch Device Object Store (BOS) เป็นแนวคิดที่เปิดตัวใน USB 3.0 แต่มี ยังได้รับการพอร์ตไปยังอุปกรณ์ USB 2.0 เนื่องจากเป็นส่วนหนึ่งของเวอร์ชัน 2.1 การประกาศ การสนับสนุนสำหรับ WebUSB เริ่มต้นด้วยความสามารถของแพลตฟอร์มดังต่อไปนี้ ตัวบอกลักษณะในข้อบ่งชี้ BOS

ค่า ช่อง คำอธิบาย
ข้อบ่งชี้ Object Store ของอุปกรณ์ไบนารี
0x05 bLength ขนาดของข้อบ่งชี้นี้
0x0F bDescriptorType ข้อบ่งชี้ Object Store ของอุปกรณ์ไบนารี
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 GUID ความสามารถของแพลตฟอร์ม WebUSB ในรูปแบบ Little-endian
0x0100 bcdVersion WebUSB Descriptor เวอร์ชัน 1.0
0x01 bVendorCode ค่า bRequest สำหรับ WebUSB
0x01 iLandingPage URL สำหรับหน้า Landing Page

UUID ความสามารถของแพลตฟอร์มระบุว่าเป็นความสามารถของแพลตฟอร์ม WebUSB ข้อบ่งชี้ ซึ่งให้ข้อมูลพื้นฐานเกี่ยวกับอุปกรณ์ สำหรับเบราว์เซอร์ เพื่อดึงข้อมูลเพิ่มเติมเกี่ยวกับอุปกรณ์ที่ใช้ค่า bVendorCode เพื่อ ส่งคำขอเพิ่มเติมไปยังอุปกรณ์ คำขอเดียวที่ระบุในปัจจุบันคือ GET_URL ซึ่งแสดงผลข้อบ่งชี้ URL ข้อความเหล่านี้คล้ายกับสตริง แต่ได้รับการออกแบบมาเพื่อเข้ารหัส URL โดยใช้จำนวนไบต์น้อยที่สุด URL ตัวบ่งชี้สำหรับ "https://google.com" จะมีลักษณะดังนี้

ค่า ช่อง คำอธิบาย
ข้อบ่งชี้ URL
0x0D bLength ขนาดของข้อบ่งชี้นี้
0x03 bDescriptorType ข้อบ่งชี้ URL
0x01 bScheme https://
"google.com" URL เนื้อหา URL ที่เข้ารหัสแบบ UTF-8

เมื่ออุปกรณ์เสียบเบราว์เซอร์เป็นครั้งแรก ให้อ่านข้อบ่งชี้ BOS ตาม ออกการโอนการควบคุม GET_DESCRIPTOR แบบมาตรฐานนี้

bmRequestType bRequest wValue wIndex wLength ข้อมูล (คำตอบ)
0b10000000 0x06 0x0F00 0x0000 * ข้อบ่งชี้ BOS

โดยปกติแล้วคำขอนี้จะเกิดขึ้น 2 ครั้ง ครั้งแรกที่มี wLength มีขนาดใหญ่พอ เพื่อให้โฮสต์ทราบค่าในช่อง wTotalLength โดยไม่มี กำลังทำการโอนขนาดใหญ่ แล้วดำเนินการอีกครั้งเมื่อความยาวของข้อบ่งชี้แบบเต็มคือ รู้จัก

หากตัวบ่งชี้ความสามารถของแพลตฟอร์ม WebUSB มีการตั้งค่าช่อง iLandingPage เป็น ค่าที่ไม่ใช่ 0 เบราว์เซอร์จะส่งคำขอ GET_URL สำหรับ WebUSB โดยเฉพาะ GET_URL ด้วยการโอนการควบคุมโดยตั้งค่า bRequest เป็นค่า bVendorCode จากข้อบ่งชี้ความสามารถของแพลตฟอร์มและตั้งค่า wValue เป็น iLandingPage รหัสคำขอสำหรับ GET_URL (0x02) จะอยู่ใน wIndex

bmRequestType bRequest wValue wIndex wLength ข้อมูล (คำตอบ)
0b11000000 0x01 0x0001 0x0002 * ข้อบ่งชี้ URL

ขอย้ำอีกครั้งว่าอาจมีการออกคำขอนี้ 2 ครั้งเพื่อตรวจสอบความยาวครั้งแรก ของข้อบ่งชี้ที่กำลังอ่านอยู่

ข้อควรพิจารณาเฉพาะแพลตฟอร์ม

แม้ว่า WebUSB API จะพยายามทําให้มีอินเทอร์เฟซที่สอดคล้องกันสําหรับการเข้าถึง นักพัฒนาอุปกรณ์ USB ยังควรตระหนักถึงข้อกำหนดที่บังคับใช้ แอปพลิเคชัน เช่น ข้อกำหนดของเว็บเบราว์เซอร์เพื่อเข้าถึงอุปกรณ์

macOS

ไม่จำเป็นต้องมีสิ่งใดเป็นพิเศษสำหรับ macOS เว็บไซต์ที่ใช้ WebUSB สามารถเชื่อมต่อกับ อุปกรณ์และอ้างสิทธิ์อินเทอร์เฟซใดๆ ที่ไม่ได้อ้างสิทธิ์โดยไดรเวอร์เคอร์เนลหรือ แอปพลิเคชันอื่น

Linux

Linux คล้ายกับ macOS แต่โดยค่าเริ่มต้นแล้ว ดิสทริบิวชันส่วนใหญ่ไม่ได้ตั้งค่าผู้ใช้ บัญชีที่มีสิทธิ์เปิดอุปกรณ์ USB Daemon ของระบบที่ชื่อ 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 บนเดสก์ท็อป เพราะจะรวมคนขับน้อยลงโดยค่าเริ่มต้น การละเว้นที่เห็นได้ชัด เช่น คลาส USB CDC-ACM ที่โดยทั่วไปใช้โดยอะแดปเตอร์แปลง USB เป็นซีเรียล ไม่มี API ใน Android SDK สำหรับสื่อสารกับอุปกรณ์ซีเรียล

ChromeOS

ChromeOS ที่ใช้ระบบปฏิบัติการ Linux เช่นกัน และไม่จำเป็นต้องมีการปรับเปลี่ยนใดๆ กับการกำหนดค่าระบบ บริการ permission_broker ควบคุมการเข้าถึง USB อุปกรณ์ และจะอนุญาตให้เบราว์เซอร์เข้าถึงได้ ตราบใดที่ยังมี อินเทอร์เฟซที่ไม่มีการอ้างสิทธิ์หนึ่งรายการ

Windows

ไดรเวอร์รุ่น Windows มีข้อกำหนดเพิ่มเติม แตกต่างจาก แพลตฟอร์มที่เหนือกว่าความสามารถในการเปิดอุปกรณ์ USB จากแอปพลิเคชันของผู้ใช้ไม่สามารถ เป็นค่าเริ่มต้นแม้ว่าจะไม่มีการโหลดไดรเวอร์ก็ตาม มีป้ายพิเศษ WinUSB ซึ่งจำเป็นต้องโหลดเพื่อให้อินเทอร์เฟซ ที่แอปพลิเคชันต่างๆ ใช้เพื่อเข้าถึงอุปกรณ์ ซึ่งสามารถดำเนินการได้ด้วย ไฟล์ข้อมูลไดรเวอร์ (INF) ที่ติดตั้งในระบบหรือโดยการดัดแปลงอุปกรณ์ เพื่อจัดหาคำอธิบายความเข้ากันได้ของ Microsoft OS ระหว่าง การแจงนับ

ไฟล์ข้อมูลผู้ขับขี่ (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] จะกำหนดค่าชุด DeviceInterfaceGUID สำหรับ อุปกรณ์ อินเทอร์เฟซอุปกรณ์ทุกเครื่องต้องมี GUID เพื่อให้แอปพลิเคชัน ค้นหาและเชื่อมต่อกับโดเมน ผ่าน Windows API ใช้ PowerShell ของ New-Guid cmdlet หรือเครื่องมือออนไลน์เพื่อสร้าง GUID แบบสุ่ม

เพื่อวัตถุประสงค์ในการพัฒนา เครื่องมือ Zadig มีอินเทอร์เฟซที่ใช้งานง่ายสำหรับ เปลี่ยนไดรเวอร์ที่โหลดสำหรับอินเทอร์เฟซ USB ด้วยไดรเวอร์ WinUSB

ข้อบ่งชี้ความเข้ากันได้ของ Microsoft OS

วิธีการไฟล์ INF ข้างต้นค่อนข้างยุ่งยากเพราะต้องมีการกำหนดค่า เครื่องของผู้ใช้ล่วงหน้า Windows 8.1 ขึ้นไปเสนอทางเลือก ผ่านการใช้ข้อบ่งชี้ USB ที่กำหนดเอง ข้อบ่งชี้เหล่านี้จะให้ข้อมูล กับระบบปฏิบัติการ 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 GUID ของความเข้ากันได้แพลตฟอร์ม Microsoft OS 2.0 ในรูปแบบ Little-endian
0x06030000 dwWindowsVersion เวอร์ชัน Windows ที่เข้ากันได้ขั้นต่ำ (Windows 8.1)
0x00B2 wMSOSDescriptorSetTotalLength ความยาวรวมของชุดข้อบ่งชี้
0x02 bMS_VendorCode ค่า bRequest สำหรับการเรียกข้อมูลข้อบ่งชี้ของ Microsoft เพิ่มเติม
0x00 bAltEnumCode อุปกรณ์ไม่รองรับการแจกแจงสำรอง

คุณต้องเลือกค่า bRequest ที่จะใช้ในข้อบ่งชี้ WebUSB ควบคุมการโอนที่เกี่ยวข้องกับข้อบ่งชี้เหล่านี้ ในตัวอย่างนี้ฉันเลือก 0x02 0x07 ที่วางไว้ใน wIndex เป็นคำสั่งในการเรียก Microsoft OS 2.0 การตั้งค่าข้อบ่งชี้จากอุปกรณ์

bmRequestType bRequest wValue wIndex wLength ข้อมูล (คำตอบ)
0b11000000 0x02 0x0000 0x0007 * ชุดข้อบ่งชี้ MS OS 2.0

อุปกรณ์ USB สามารถมีหลายฟังก์ชัน ดังนั้นส่วนแรกของข้อบ่งชี้ set จะอธิบายว่าพร็อพเพอร์ตี้ต่อไปนี้เชื่อมโยงกับฟังก์ชันใด ตัวอย่างด้านล่างกำหนดค่าอินเทอร์เฟซ 1 ของอุปกรณ์ผสม คำอธิบายจะให้ ข้อมูลสำคัญสองประการของระบบปฏิบัติการเกี่ยวกับอินเทอร์เฟซนี้ ฟิลด์ ตัวบอกรหัสบอก Windows ว่าอุปกรณ์นี้ใช้งานได้กับ WinUSB คนขับ ข้อบ่งชี้พร็อพเพอร์ตี้รีจิสทรีจะทำงานคล้ายกับ [Dev_AddReg] ของตัวอย่าง INF ด้านบน การตั้งค่าพร็อพเพอร์ตี้รีจิสทรีเป็น กำหนด 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 (จัดทำดัชนีจาก 0 แม้จะมีการกำหนดค่า โดยปกติได้รับการจัดทำดัชนีจาก 1)
0x00 bReserved ต้องตั้งค่าเป็น 0
0x00A8 wTotalLength ความยาวรวมของเซตย่อยซึ่งรวมส่วนหัวนี้
ส่วนหัวย่อยของฟังก์ชัน Microsoft OS 2.0
0x0008 wLength ขนาดของข้อบ่งชี้นี้
0x0002 wDescriptorType ตัวบอกส่วนหัวของชุดย่อยของฟังก์ชัน
0x01 bFirstInterface อินเทอร์เฟซแรกของฟังก์ชัน
0x00 bReserved ต้องตั้งค่าเป็น 0
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 ชื่อพร็อพเพอร์ตี้ที่มีตัวระบุค่า Null ที่เข้ารหัสเป็น UTF-16LE
0x0050 wPropertyDataLength ความยาวของค่าพร็อพเพอร์ตี้
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" PropertyData GUID บวกเครื่องหมายสิ้นสุดที่เป็นค่าว่าง 2 ตัวที่เข้ารหัสเป็น UTF-16LE

Windows จะค้นหาข้อมูลจากอุปกรณ์ดังกล่าวเพียงครั้งเดียว หากอุปกรณ์รองรับ ไม่ตอบกลับด้วยข้อบ่งชี้ที่ถูกต้อง ระบบจะไม่ถามซ้ำในคราวต่อไป เชื่อมต่ออุปกรณ์แล้ว Microsoft ได้จัดเตรียมรายการรีจิสทรีอุปกรณ์ USB แล้ว รายการที่อธิบายรายการรีจิสทรีที่สร้างขึ้นเมื่อแจกแจงอุปกรณ์ วันและเวลา การทดสอบลบรายการที่สร้างขึ้นสำหรับอุปกรณ์เพื่อบังคับให้ Windows พยายามอ่าน คำอธิบายอีกครั้ง

สำหรับข้อมูลเพิ่มเติม โปรดดูบล็อกโพสต์ของ Microsoft เกี่ยวกับวิธีใช้ ข้อบ่งชี้

ตัวอย่าง

โค้ดตัวอย่างการใช้อุปกรณ์ WebUSB-Aware ที่มีทั้ง WebUSB คุณจะพบข้อบ่งชี้และข้อบ่งชี้ Microsoft OS ในโปรเจ็กต์ต่อไปนี้