Xây dựng thiết bị cho WebUSB

Tạo một thiết bị để khai thác tối đa API WebUSB.

Bài viết này giải thích cách tạo một thiết bị để khai thác tối đa API WebUSB. Để biết thông tin giới thiệu ngắn gọn về chính API này, hãy xem phần Truy cập vào thiết bị USB trên web.

Thông tin khái quát

Bus nối tiếp đa năng (USB) đã trở thành giao diện vật lý phổ biến nhất để kết nối thiết bị ngoại vi với máy tính để bàn và thiết bị điện toán di động. Ngoài việc xác định các đặc tính điện của bus và mô hình chung để giao tiếp với thiết bị, thông số kỹ thuật USB còn bao gồm một bộ thông số kỹ thuật của lớp thiết bị. Đây là các mô hình chung cho các lớp thiết bị cụ thể như bộ nhớ, âm thanh, video, kết nối mạng, v.v. mà nhà sản xuất thiết bị có thể triển khai. Ưu điểm của các thông số kỹ thuật về lớp thiết bị này là nhà cung cấp hệ điều hành có thể triển khai một trình điều khiển dựa trên thông số kỹ thuật về lớp (một "trình điều khiển lớp") và mọi thiết bị triển khai lớp đó sẽ được hỗ trợ. Đây là một điểm cải tiến lớn so với việc mọi nhà sản xuất đều cần phải viết trình điều khiển thiết bị của riêng họ.

Tuy nhiên, một số thiết bị không phù hợp với một trong các lớp thiết bị được chuẩn hoá này. Thay vào đó, nhà sản xuất có thể chọn gắn nhãn thiết bị của họ là triển khai lớp dành riêng cho nhà cung cấp. Trong trường hợp này, hệ điều hành sẽ chọn trình điều khiển thiết bị nào sẽ tải dựa trên thông tin được cung cấp trong gói trình điều khiển của nhà cung cấp, thường là một nhóm mã nhận dạng sản phẩm và nhà cung cấp được biết là triển khai một giao thức cụ thể dành riêng cho nhà cung cấp.

Một tính năng khác của USB là các thiết bị có thể cung cấp nhiều giao diện cho máy chủ mà chúng được kết nối. Mỗi giao diện có thể triển khai một lớp được chuẩn hoá hoặc dành riêng cho nhà cung cấp. Khi hệ điều hành chọn trình điều khiển phù hợp để xử lý thiết bị, mỗi giao diện có thể được một trình điều khiển khác nhau xác nhận quyền sở hữu. Ví dụ: webcam USB thường cung cấp hai giao diện, một giao diện triển khai lớp video USB (dành cho máy ảnh) và một giao diện triển khai lớp âm thanh USB (dành cho micrô). Hệ điều hành không tải một "trình điều khiển webcam" duy nhất mà thay vào đó sẽ tải các trình điều khiển lớp âm thanh và video độc lập chịu trách nhiệm về các chức năng riêng biệt của thiết bị. Cấu trúc này của các lớp giao diện giúp tăng tính linh hoạt.

Kiến thức cơ bản về API

Nhiều lớp USB tiêu chuẩn có API web tương ứng. Ví dụ: một trang có thể quay video từ thiết bị lớp video bằng getUserMedia() hoặc nhận sự kiện đầu vào từ thiết bị lớp giao diện người dùng (HID) bằng cách theo dõi KeyboardEvents hoặc PointerEvents, hoặc bằng cách sử dụng Gamepad hoặc API WebHID. Cũng giống như không phải thiết bị nào cũng triển khai định nghĩa lớp được chuẩn hoá, không phải thiết bị nào cũng triển khai các tính năng tương ứng với API nền tảng web hiện có. Trong trường hợp này, API WebUSB có thể lấp đầy khoảng trống đó bằng cách cung cấp cách để các trang web xác nhận quyền sở hữu giao diện dành riêng cho nhà cung cấp và triển khai tính năng hỗ trợ cho giao diện đó ngay trong trang của họ.

Các yêu cầu cụ thể để có thể truy cập vào một thiết bị thông qua WebUSB sẽ khác nhau một chút giữa các nền tảng do sự khác biệt trong cách hệ điều hành quản lý các thiết bị USB, nhưng yêu cầu cơ bản là thiết bị không được có trình điều khiển xác nhận quyền sở hữu giao diện mà trang muốn kiểm soát. Đây có thể là trình điều khiển lớp chung do nhà cung cấp hệ điều hành cung cấp hoặc trình điều khiển thiết bị do nhà cung cấp cung cấp. Vì các thiết bị USB có thể cung cấp nhiều giao diện, mỗi giao diện có thể có trình điều khiển riêng, nên bạn có thể tạo một thiết bị mà một số giao diện được trình điều khiển xác nhận quyền sở hữu và các giao diện khác được trình duyệt truy cập.

Ví dụ: bàn phím USB cao cấp có thể cung cấp giao diện lớp HID sẽ được hệ thống con đầu vào của hệ điều hành xác nhận quyền sở hữu và giao diện dành riêng cho nhà cung cấp vẫn có sẵn cho WebUSB để sử dụng bằng một công cụ định cấu hình. Công cụ này có thể được phân phát trên trang web của nhà sản xuất, cho phép người dùng thay đổi các khía cạnh của hành vi của thiết bị, chẳng hạn như các phím macro và hiệu ứng ánh sáng mà không cần cài đặt bất kỳ phần mềm nào dành riêng cho nền tảng. Trình mô tả cấu hình của thiết bị như vậy sẽ có dạng như sau:

Giá trị Trường Mô tả
Tệp mô tả cấu hình
0x09 bLength Kích thước của chỉ số mô tả này
0x02 bDescriptorType Tệp mô tả cấu hình
0x0039 wTotalLength Tổng thời lượng của loạt chỉ số mô tả này
0x02 bNumInterfaces Số lượng giao diện
0x01 bConfigurationValue Cấu hình 1
0x00 iConfiguration Tên cấu hình (không có)
0b1010000 bmAttributes Thiết bị tự cấp nguồn có tính năng đánh thức từ xa
0x32 bMaxPower Công suất tối đa được thể hiện theo mức tăng 2 mA
Chỉ số mô tả giao diện
0x09 bLength Kích thước của chỉ số mô tả này
0x04 bDescriptorType Chỉ số mô tả giao diện
0x00 bInterfaceNumber Giao diện 0
0x00 bAlternateSetting Chế độ cài đặt thay thế 0 (mặc định)
0x01 bNumEndpoints 1 điểm cuối
0x03 bInterfaceClass Lớp giao diện HID
0x01 bInterfaceSubClass Lớp con giao diện khởi động
0x01 bInterfaceProtocol Bàn phím
0x00 iInterface Tên giao diện (không có)
Phần mô tả HID
0x09 bLength Kích thước của chỉ số mô tả này
0x21 bDescriptorType Phần mô tả HID
0x0101 bcdHID HID phiên bản 1.1
0x00 bCountryCode Quốc gia mục tiêu của phần cứng
0x01 bNumDescriptors Số lượng chỉ số mô tả lớp HID cần theo sau
0x22 bDescriptorType Loại chỉ số mô tả báo cáo
0x003F wDescriptorLength Tổng chiều dài của chỉ số mô tả Báo cáo
Trình mô tả điểm cuối
0x07 bLength Kích thước của chỉ số mô tả này
0x05 bDescriptorType Trình mô tả điểm cuối
0b10000001 bEndpointAddress Điểm cuối 1 (IN)
0b00000011 bmAttributes Tạm dừng
0x0008 wMaxPacketSize Gói 8 byte
0x0A bInterval Khoảng thời gian 10 mili giây
Chỉ số mô tả giao diện
0x09 bLength Kích thước của chỉ số mô tả này
0x04 bDescriptorType Chỉ số mô tả giao diện
0x01 bInterfaceNumber Giao diện 1
0x00 bAlternateSetting Chế độ cài đặt thay thế 0 (mặc định)
0x02 bNumEndpoints 2 điểm cuối
0xFF bInterfaceClass Lớp giao diện dành riêng cho nhà cung cấp
0x00 bInterfaceSubClass
0x00 bInterfaceProtocol
0x00 iInterface Tên giao diện (không có)
Trình mô tả điểm cuối
0x07 bLength Kích thước của chỉ số mô tả này
0x05 bDescriptorType Trình mô tả điểm cuối
0b10000010 bEndpointAddress Điểm cuối 1 (IN)
0b00000010 bmAttributes Hàng loạt
0x0040 wMaxPacketSize Gói 64 byte
0x00 bInterval Không áp dụng cho các điểm cuối hàng loạt
Trình mô tả điểm cuối
0x07 bLength Kích thước của chỉ số mô tả này
0x05 bDescriptorType Trình mô tả điểm cuối
0b00000011 bEndpointAddress Điểm cuối 3 (OUT)
0b00000010 bmAttributes Hàng loạt
0x0040 wMaxPacketSize Gói 64 byte
0x00 bInterval Không áp dụng cho các điểm cuối hàng loạt

Trình mô tả cấu hình bao gồm nhiều trình mô tả được nối với nhau. Mỗi phần tử bắt đầu bằng các trường bLengthbDescriptorType để có thể xác định được. Giao diện đầu tiên là giao diện HID có mô tả HID liên kết và một điểm cuối duy nhất dùng để phân phối sự kiện đầu vào cho hệ điều hành. Giao diện thứ hai là giao diện dành riêng cho nhà cung cấp với hai điểm cuối có thể dùng để gửi lệnh đến thiết bị và nhận phản hồi.

Trình mô tả WebUSB

Mặc dù WebUSB có thể hoạt động với nhiều thiết bị mà không cần sửa đổi chương trình cơ sở, nhưng bạn có thể bật chức năng bổ sung bằng cách đánh dấu thiết bị bằng các chỉ số mô tả cụ thể cho biết khả năng hỗ trợ WebUSB. Ví dụ: bạn có thể chỉ định một URL trang đích mà trình duyệt có thể chuyển hướng người dùng đến khi thiết bị của bạn được cắm sạc.

Ảnh chụp màn hình thông báo WebUSB trong Chrome
Thông báo WebUSB.

BOS (Thư mục đối tượng thiết bị nhị phân) là một khái niệm được giới thiệu trong USB 3.0 nhưng cũng được điều chỉnh cho phiên bản cũ để hỗ trợ các thiết bị USB 2.0 trong phiên bản 2.1. Việc khai báo tính năng hỗ trợ WebUSB bắt đầu bằng cách đưa Trình mô tả chức năng của nền tảng sau đây vào chỉ số mô tả BOS:

Giá trị Trường Mô tả
Trình mô tả Cửa hàng đối tượng của thiết bị nhị phân
0x05 bLength Kích thước của chỉ số mô tả này
0x0F bDescriptorType Trình mô tả Cửa hàng đối tượng của thiết bị nhị phân
0x001D wTotalLength Tổng thời lượng của loạt chỉ số mô tả này
0x01 bNumDeviceCaps Số lượng chỉ số mô tả chức năng của thiết bị trong BOS
Trình mô tả chức năng của nền tảng WebUSB
0x18 bLength Kích thước của chỉ số mô tả này
0x10 bDescriptorType Phần mô tả chức năng của thiết bị
0x05 bDevCapabilityType Chỉ số mô tả chức năng của nền tảng
0x00 bReserved
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} PlatformCapablityUUID Mã nhận dạng duy nhất (GUID) của mô tả chức năng nền tảng WebUSB ở định dạng little-endian
0x0100 bcdVersion Trình mô tả WebUSB phiên bản 1.0
0x01 bVendorCode Giá trị bRequest cho WebUSB
0x01 iLandingPage URL của trang đích

UUID chức năng nền tảng xác định đây là trình mô tả chức năng nền tảng WebUSB, cung cấp thông tin cơ bản về thiết bị. Để trình duyệt tìm nạp thêm thông tin về thiết bị, trình duyệt sẽ sử dụng giá trị bVendorCode để đưa ra các yêu cầu bổ sung cho thiết bị. Yêu cầu duy nhất hiện được chỉ định là GET_URL. Yêu cầu này trả về một trình mô tả URL. Các chỉ số này tương tự như chỉ số mô tả chuỗi nhưng được thiết kế để mã hoá URL trong số ít byte nhất. Chỉ số mô tả URL cho "https://google.com" sẽ có dạng như sau:

Giá trị Trường Mô tả
Chỉ số mô tả URL
0x0D bLength Kích thước của chỉ số mô tả này
0x03 bDescriptorType Chỉ số mô tả URL
0x01 bScheme https://
"google.com" URL Nội dung URL được mã hoá UTF-8

Khi bạn cắm thiết bị lần đầu tiên, trình duyệt sẽ đọc chỉ số mô tả BOS bằng cách phát lệnh chuyển đổi điều khiển GET_DESCRIPTOR tiêu chuẩn này:

bmRequestType bRequest wValue wIndex wLength Dữ liệu (phản hồi)
0b10000000 0x06 0x0F00 0x0000 * Chỉ số mô tả BOS

Yêu cầu này thường được thực hiện hai lần, lần đầu tiên với wLength đủ lớn để máy chủ tìm ra giá trị của trường wTotalLength mà không cần cam kết chuyển một lượng lớn dữ liệu, sau đó thực hiện lại khi biết được toàn bộ chiều dài chỉ số mô tả.

Nếu chỉ số mô tả Khả năng của nền tảng WebUSB có trường iLandingPage được đặt thành giá trị khác 0, thì trình duyệt sẽ thực hiện yêu cầu GET_URL dành riêng cho WebUSB bằng cách chuyển giao quyền kiểm soát với bRequest được đặt thành giá trị bVendorCode từ chỉ số mô tả khả năng của nền tảng và wValue được đặt thành giá trị iLandingPage. Mã yêu cầu cho GET_URL (0x02) nằm trong wIndex:

bmRequestType bRequest wValue wIndex wLength Dữ liệu (phản hồi)
0b11000000 0x01 0x0001 0x0002 * Nội dung mô tả URL

Xin nhắc lại, yêu cầu này có thể được đưa ra hai lần để trước tiên thăm dò độ dài của chỉ số mô tả đang được đọc.

Những điểm cần cân nhắc theo nền tảng

Mặc dù API WebUSB cố gắng cung cấp một giao diện nhất quán để truy cập vào các thiết bị USB, nhưng nhà phát triển vẫn phải lưu ý đến các yêu cầu đối với ứng dụng, chẳng hạn như yêu cầu của trình duyệt web để truy cập vào thiết bị.

macOS

Bạn không cần làm gì đặc biệt đối với macOS. Một trang web sử dụng WebUSB có thể kết nối với thiết bị và xác nhận quyền sở hữu mọi giao diện không do trình điều khiển hạt nhân hoặc ứng dụng khác xác nhận quyền sở hữu.

Linux

Linux giống như macOS, nhưng theo mặc định, hầu hết các bản phân phối đều không thiết lập tài khoản người dùng có quyền mở thiết bị USB. Một trình nền hệ thống có tên là udev chịu trách nhiệm chỉ định người dùng và nhóm được phép truy cập vào một thiết bị. Một quy tắc như vậy sẽ chỉ định quyền sở hữu của một thiết bị khớp với mã nhà cung cấp và mã sản phẩm đã cho cho nhóm plugdev. Đây là một nhóm chung cho những người dùng có quyền truy cập vào thiết bị ngoại vi:

SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="XXXX", GROUP="plugdev"

Thay thế XXXX bằng mã nhận dạng sản phẩm và nhà cung cấp thập lục phân cho thiết bị của bạn, ví dụ: ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11" sẽ khớp với điện thoại Nexus One. Bạn phải viết các giá trị này mà không có tiền tố "0x" thông thường và tất cả đều phải viết bằng chữ thường để được nhận dạng chính xác. Để tìm mã nhận dạng cho thiết bị, hãy chạy công cụ dòng lệnh lsusb.

Bạn nên đặt quy tắc này trong một tệp trong thư mục /etc/udev/rules.d và quy tắc này sẽ có hiệu lực ngay khi thiết bị được cắm điện. Bạn không cần khởi động lại udev.

Android

Nền tảng Android dựa trên Linux nhưng không yêu cầu bất kỳ sửa đổi nào đối với cấu hình hệ thống. Theo mặc định, trình duyệt có thể truy cập vào mọi thiết bị không có trình điều khiển được tích hợp vào hệ điều hành. Tuy nhiên, nhà phát triển cần lưu ý rằng người dùng sẽ gặp thêm một bước khi kết nối với thiết bị. Sau khi người dùng chọn một thiết bị để phản hồi lệnh gọi đến requestDevice(), Android sẽ hiển thị lời nhắc hỏi xem có cho phép Chrome truy cập vào thiết bị đó hay không. Lời nhắc này cũng xuất hiện trở lại nếu người dùng quay lại một trang web đã có quyền kết nối với thiết bị và trang web đó gọi open().

Ngoài ra, bạn có thể truy cập nhiều thiết bị hơn trên Android so với Linux trên máy tính vì theo mặc định, Android có ít trình điều khiển hơn. Ví dụ: một thiếu sót đáng chú ý là lớp USB CDC-ACM thường được triển khai bằng bộ chuyển đổi USB sang nối tiếp vì không có API nào trong SDK Android để giao tiếp với thiết bị nối tiếp.

ChromeOS

ChromeOS cũng dựa trên Linux và cũng không yêu cầu sửa đổi cấu hình hệ thống. Dịch vụ permission_broker kiểm soát quyền truy cập vào các thiết bị USB và sẽ cho phép trình duyệt truy cập vào các thiết bị đó miễn là có ít nhất một giao diện chưa được xác nhận quyền sở hữu.

Windows

Mô hình trình điều khiển Windows đưa ra một yêu cầu bổ sung. Không giống như các nền tảng ở trên, khả năng mở thiết bị USB từ ứng dụng người dùng không phải là chế độ mặc định, ngay cả khi không có trình điều khiển nào được tải. Thay vào đó, bạn cần tải một trình điều khiển đặc biệt, WinUSB, để cung cấp giao diện mà các ứng dụng sử dụng để truy cập vào thiết bị. Bạn có thể thực hiện việc này bằng cách cài đặt tệp thông tin trình điều khiển (INF) tuỳ chỉnh trên hệ thống hoặc bằng cách sửa đổi phần mềm cơ sở của thiết bị để cung cấp Nội dung mô tả khả năng tương thích với hệ điều hành Microsoft trong quá trình liệt kê.

Tệp thông tin trình điều khiển (INF)

Tệp thông tin trình điều khiển cho Windows biết cần làm gì khi gặp một thiết bị lần đầu tiên. Vì hệ thống của người dùng đã bao gồm trình điều khiển WinUSB, nên tất cả những gì cần thiết là tệp INF liên kết nhà cung cấp và mã sản phẩm của bạn với quy tắc cài đặt mới này. Tệp bên dưới là một ví dụ cơ bản. Lưu tệp đó vào một tệp có đuôi .inf, thay đổi các phần được đánh dấu bằng "X", sau đó nhấp chuột phải vào tệp đó rồi chọn "Cài đặt" trong trình đơn theo bối cảnh.

[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"

Phần [Dev_AddReg] định cấu hình tập hợp DeviceInterfaceGUIDs cho thiết bị. Mọi giao diện thiết bị đều phải có GUID để ứng dụng tìm và kết nối với giao diện đó thông qua API Windows. Sử dụng cmdlet PowerShell New-Guid hoặc một công cụ trực tuyến để tạo GUID ngẫu nhiên.

Đối với mục đích phát triển, công cụ Zadig cung cấp một giao diện dễ dàng để thay thế trình điều khiển được tải cho giao diện USB bằng trình điều khiển WinUSB.

Nội dung mô tả khả năng tương thích với hệ điều hành Microsoft

Phương pháp tệp INF ở trên khá rườm rà vì yêu cầu phải định cấu hình trước máy của mọi người dùng. Windows 8.1 trở lên cung cấp một giải pháp thay thế thông qua việc sử dụng chỉ số mô tả USB tuỳ chỉnh. Các chỉ số mô tả này cung cấp thông tin cho hệ điều hành Windows khi thiết bị được cắm lần đầu tiên. Thông tin này thường có trong tệp INF.

Sau khi thiết lập chỉ số mô tả WebUSB, bạn cũng có thể dễ dàng thêm chỉ số mô tả khả năng tương thích với hệ điều hành của Microsoft. Trước tiên, hãy mở rộng chỉ số mô tả BOS bằng chỉ số mô tả chức năng bổ sung của nền tảng này. Hãy nhớ cập nhật wTotalLengthbNumDeviceCaps để tính đến điều này.

Giá trị Trường Mô tả
Trình mô tả chức năng nền tảng Microsoft OS 2.0
0x1C bLength Kích thước của chỉ số mô tả này
0x10 bDescriptorType Phần mô tả chức năng của thiết bị
0x05 bDevCapabilityType Chỉ số mô tả chức năng của nền tảng
0x00 bReserved
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} PlatformCapablityUUID GUID chỉ số mô tả khả năng tương thích của nền tảng Microsoft OS 2.0 ở định dạng little-endian
0x06030000 dwWindowsVersion Phiên bản Windows tương thích tối thiểu (Windows 8.1)
0x00B2 wMSOSDescriptorSetTotalLength Tổng chiều dài của tập hợp đặc tả
0x02 bMS_VendorCode Giá trị bRequest để truy xuất thêm chỉ số mô tả của Microsoft
0x00 bAltEnumCode Thiết bị không hỗ trợ tính năng liệt kê thay thế

Cũng giống như các chỉ số mô tả WebUSB, bạn phải chọn một giá trị bRequest để các lượt chuyển đổi điều khiển liên quan đến các chỉ số mô tả này sử dụng. Trong ví dụ này, tôi đã chọn 0x02. 0x07, được đặt trong wIndex, là lệnh để truy xuất Tập hợp chỉ số mô tả Microsoft OS 2.0 từ thiết bị.

bmRequestType bRequest wValue wIndex wLength Dữ liệu (phản hồi)
0b11000000 0x02 0x0000 0x0007 * Tập hợp chỉ số mô tả MS OS 2.0

Một thiết bị USB có thể có nhiều chức năng, vì vậy, phần đầu tiên của tập hợp mô tả mô tả chức năng mà các thuộc tính theo sau được liên kết. Ví dụ bên dưới định cấu hình giao diện 1 của một thiết bị tổng hợp. Chỉ số mô tả cung cấp cho hệ điều hành hai thông tin quan trọng về giao diện này. Chỉ số mô tả mã nhận dạng tương thích cho Windows biết rằng thiết bị này tương thích với trình điều khiển WinUSB. Trình mô tả thuộc tính đăng ký hoạt động tương tự như phần [Dev_AddReg] của ví dụ INF ở trên, thiết lập một thuộc tính đăng ký để gán cho hàm này một GUID giao diện thiết bị.

Giá trị Trường Mô tả
Tiêu đề tập hợp chỉ số mô tả Microsoft OS 2.0
0x000A wLength Kích thước của chỉ số mô tả này
0x0000 wDescriptorType Mô tả tiêu đề tập hợp mô tả
0x06030000 dwWindowsVersion Phiên bản Windows tương thích tối thiểu (Windows 8.1)
0x00B2 wTotalLength Tổng chiều dài của tập hợp đặc tả
Tiêu đề tập hợp con cấu hình Microsoft OS 2.0
0x0008 wLength Kích thước của chỉ số mô tả này
0x0001 wDescriptorType Nội dung mô tả tiêu đề của tập hợp con cấu hình.
0x00 bConfigurationValue Áp dụng cho cấu hình 1 (được lập chỉ mục từ 0 mặc dù các cấu hình thường được lập chỉ mục từ 1)
0x00 bReserved Phải được đặt thành 0
0x00A8 wTotalLength Tổng chiều dài của tập hợp con bao gồm cả tiêu đề này
Tiêu đề tập hợp con hàm Microsoft OS 2.0
0x0008 wLength Kích thước của chỉ số mô tả này
0x0002 wDescriptorType Tiêu đề mô tả tập hợp con hàm
0x01 bFirstInterface Giao diện đầu tiên của hàm
0x00 bReserved Phải được đặt thành 0
0x00A0 wSubsetLength Tổng chiều dài của tập hợp con bao gồm cả tiêu đề này
Nội dung mô tả mã nhận dạng tương thích với Microsoft OS 2.0
0x0014 wLength Kích thước của chỉ số mô tả này
0x0003 wDescriptorType Phần mô tả mã nhận dạng tương thích
"WINUSB\0\0" CompatibileID Chuỗi ASCII được thêm vào 8 byte
"\0\0\0\0\0\0\0\0" SubCompatibleID Chuỗi ASCII được thêm vào 8 byte
Trình mô tả thuộc tính sổ đăng ký Microsoft OS 2.0
0x0084 wLength Kích thước của chỉ số mô tả này
0x0004 wDescriptorType Phần mô tả thuộc tính sổ đăng ký
0x0007 wPropertyDataType REG_MULTI_SZ
0x002A wPropertyNameLength Độ dài của tên thuộc tính
"DeviceInterfaceGUIDs\0" PropertyName Tên thuộc tính có ký tự kết thúc rỗng được mã hoá bằng UTF-16LE
0x0050 wPropertyDataLength Độ dài của giá trị thuộc tính
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" PropertyData GUID cộng với hai ký tự kết thúc rỗng được mã hoá bằng UTF-16LE

Windows sẽ chỉ truy vấn thiết bị để lấy thông tin này một lần. Nếu thiết bị không phản hồi bằng các chỉ số mô tả hợp lệ, thì thiết bị sẽ không hỏi lại vào lần tiếp theo khi thiết bị được kết nối. Microsoft đã cung cấp danh sách các mục nhập đăng ký thiết bị USB mô tả các mục nhập đăng ký được tạo khi liệt kê một thiết bị. Khi kiểm thử, hãy xoá các mục đã tạo cho một thiết bị để buộc Windows cố gắng đọc lại các chỉ số mô tả.

Để biết thêm thông tin, hãy xem bài đăng trên blog của Microsoft về cách sử dụng các chỉ số mô tả này.

Ví dụ

Bạn có thể tìm thấy mã ví dụ triển khai các thiết bị nhận biết WebUSB bao gồm cả chỉ số mô tả WebUSB và chỉ số mô tả hệ điều hành Microsoft trong các dự án sau: