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 xây dựng một thiết bị để khai thác tối đa API WebUSB. Để biết giới thiệu ngắn gọn về chính API này, hãy xem Truy cập thiết bị USB trên web.

Thông tin khái quát

Universal Serial Bus (USB) đã trở thành giao diện thực phổ biến nhất cho kết nối thiết bị ngoại vi với máy tính để bàn và thiết bị di động. Ngoài xác định các đặc điểm điện của xe buýt và mô hình chung của giao tiếp với một thiết bị, thông số kỹ thuật USB bao gồm một tập hợp loại thiết bị thông số kỹ thuật. Đây là các mẫu chung cho các loại thiết bị cụ thể như làm 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 những thông số kỹ thuật theo 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 duy nhất dựa trên lớp ("trình điều khiển lớp") và bất kỳ thiết bị nào triển khai lớp đó sẽ được hỗ trợ. Đây là một cải tiến lớn so với mọi nhà sản xuất cần ghi 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. Đáp 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 học của từng nhà cung cấp. Trong trường hợp này, hệ điều hành sẽ chọn thiết bị nào trình điều khiển 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 tập hợp mã nhà cung cấp và mã sản phẩm được biết là để triển khai giao thức cụ thể của nhà cung cấp.

Một tính năng khác của USB là thiết bị có thể cung cấp nhiều giao diện để máy chủ lưu trữ mà chúng được kết nối. Mỗi giao diện có thể triển khai một được chuẩn hoá hoặc theo từng nhà cung cấp. Khi hệ điều hành chọn trình điều khiển bên phải để xử lý thiết bị, mỗi giao diện có thể được xác nhận trình điều khiển. 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 triển khai USB lớp âm thanh (dành cho micrô). Hệ điều hành không tải một trang web nào "trình điều khiển webcam" nhưng thay vào đó, 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 cho các chức năng riêng biệt của thiết bị. Chiến dịch này cấu trúc 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 các sự kiện đầu vào từ thiết bị lớp giao diện người dùng (HID) bằng cách lắng nghe cho KeyboardEvents hoặc PointerEvents hoặc bằng cách sử dụng Gamepad hoặc API WebHID. Giống như việc không phải mọi thiết bị đều triển khai định nghĩa lớp được chuẩn hoá, không phải tất cả thiết bị triển khai các tính năng tương ứng với API nền tảng web hiện có. Thời gian đây là trường hợp API WebUSB có thể lấp đầy khoảng trống đó bằng cách đưa ra một cách cho các trang web để xác nhận giao diện dành riêng cho nhà cung cấp và triển khai hỗ trợ cho giao diện đó trực tiếp trên trang của mình.

Yêu cầu cụ thể đối với một thiết bị có thể truy cập qua WebUSB có sự khác biệt đôi chút từ nền tảng này sang nền tảng khác do sự khác biệt về cách hệ điều hành quản lý USB Tuy nhiên, yêu cầu cơ bản là một thiết bị chưa có người lái xe xác nhận 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 hoặc trình điều khiển thiết bị cung cấp bởi nhà cung cấp. Vì 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, bạn có thể tạo một thiết bị với một số giao diện được xác nhận quyền sở hữu bởi một người lái xe và những người khác có thể truy cập vào trình duyệt.

Ví dụ: bàn phím USB cao cấp có thể cung cấp giao diện lớp HID sẽ được xác nhận quyền sở hữu theo hệ thống con đầu vào của hệ điều hành và quyền sở hữu riêng của nhà cung cấp giao diện vẫn có sẵn cho WebUSB để công cụ cấu hình sử dụng. Chiến dịch này công cụ này có thể được cung cấp 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 hành vi của thiết bị như phím macro và hiệu ứng ánh sáng không có cài đặt bất kỳ phần mềm dành riêng cho nền tảng nào. Bộ mô tả cấu hình của thiết bị như vậy sẽ sẽ có dạng như sau:

Giá trị Trường Mô tả
Chỉ số mô tả cấu hình
0x09 bLength Kích thước của phần mô tả này
0x02 bDescriptorType Chỉ số mô tả cấu hình
0x0039 wTotalLength Tổng chiều dài của loạt nhãn 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ự chạy với tính năng đánh thức từ xa
0x32 bMaxPower Công suất tối đa được biểu thị theo từng 2 mA
Bộ mô tả giao diện
0x09 bLength Kích thước của phần mô tả này
0x04 bDescriptorType Bộ 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 của giao diện khởi động
0x01 bInterfaceProtocol Bàn phím
0x00 iInterface Tên giao diện (không có)
Bộ mô tả HID
0x09 bLength Kích thước của phần mô tả này
0x21 bDescriptorType Bộ 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 mã mô tả lớp HID cần tuân thủ
0x22 bDescriptorType Loại chỉ số mô tả báo cáo
0x003F wDescriptorLength Tổng chiều dài của Mã mô tả báo cáo
Bộ mô tả điểm cuối
0x07 bLength Kích thước của phần mô tả này
0x05 bDescriptorType Bộ mô tả điểm cuối
0b10000001 bEndpointAddress Điểm cuối 1 (IN)
0b00000011 bmAttributes Gián đoạn
0x0008 wMaxPacketSize Gói 8 byte
0x0A bInterval Khoảng thời gian 10 mili giây
Bộ mô tả giao diện
0x09 bLength Kích thước của phần mô tả này
0x04 bDescriptorType Bộ 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ó)
Bộ mô tả điểm cuối
0x07 bLength Kích thước của phần mô tả này
0x05 bDescriptorType Bộ 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 thiết bị đầu cuối hàng loạt
Bộ mô tả điểm cuối
0x07 bLength Kích thước của phần mô tả này
0x05 bDescriptorType Bộ 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 thiết bị đầu cuối hàng loạt

Phần mô tả cấu hình bao gồm nhiều mã mô tả nối với nhau khi kết hợp cùng nhau. Mỗi trường bắt đầu bằng các trường bLengthbDescriptorType để chúng có thể được xác định. Giao diện đầu tiên là giao diện HID với Bộ mô tả HID và một điểm cuối duy nhất dùng để phân phối các sự kiện đầu vào đến 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 của bạn.

Mã 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ở, bật chức năng bổ sung bằng cách đánh dấu thiết bị với mã mô tả cho biết có hỗ trợ WebUSB. Ví dụ: bạn có thể chỉ định một URL trang đích mà trình duyệt có thể hướng người dùng đến khi thiết bị của bạn đã cắm điện.

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

Kho lưu trữ đối tượng của thiết bị nhị phân (BOS) là một khái niệm được giới thiệu trong USB 3.0 nhưng có cũng được điều chỉnh cho phiên bản cũ là USB 2.0. Đang khai báo hỗ trợ cho WebUSB bắt đầu bằng việc bao gồm Khả năng nền tảng sau Phần mô tả trong phần mô tả BOS:

Giá trị Trường Mô tả
Phần mô tả Kho lưu trữ đối tượng của thiết bị nhị phân
0x05 bLength Kích thước của phần mô tả này
0x0F bDescriptorType Phần mô tả Kho lưu trữ đối tượng của thiết bị nhị phân
0x001D wTotalLength Tổng chiều dài của loạt nhãn mô tả này
0x01 bNumDeviceCaps Số lượng bộ mô tả chức năng thiết bị trong BOS
Bộ mô tả chức năng nền tảng WebUSB
0x18 bLength Kích thước của phần mô tả này
0x10 bDescriptorType Bộ mô tả chức năng của thiết bị
0x05 bDevCapabilityType Bộ 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ã mô tả chức năng của nền tảng WebUSB GUID ở định dạng Little-endian
0x0100 bcdVersion Mô tả WebUSB phiên bản 1.0
0x01 bVendorCode Giá trị bRequest cho WebUSB
0x01 iLandingPage URL cho trang đích

Mã nhận dạng duy nhất (UUID) của khả năng nền tảng xác định đây là Khả năng nền tảng WebUSB description [mã_nhận_dạng] cung cấp thông tin cơ bản về thiết bị. Đối với trình duyệt để tìm nạp thêm thông tin về thiết bị, cần sử dụng giá trị bVendorCode để đưa ra 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 trả về phần mô tả URL. Các thông số này tương tự như chuỗi nhưng được thiết kế để mã hoá URL bằng ít byte nhất. Một URL phần mô tả cho "https://google.com" sẽ có dạng như sau:

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

Khi thiết bị của bạn được cắm lần đầu tiên vào trình duyệt, trình duyệt sẽ đọc chỉ số mô tả BOS theo cấp chuyển quyền kiểm soát GET_DESCRIPTOR tiêu chuẩn này:

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

Yêu cầu này thường được thực hiện hai lần, lần đầu là với wLength đủ lớn để máy chủ lưu trữ tìm ra giá trị của trường wTotalLength mà không thực hiện một giao dịch chuyển giao lớn và sau đó thực hiện lại một lần nữa khi độ dài mô tả đầy đủ là đã biết.

Nếu phần mô tả Chức năng nền tảng WebUSB có trường iLandingPage được đặt thành một giá trị khác 0, trình duyệt 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ừ bộ mô tả chức năng của nền tảng và wValue được đặt thành iLandingPage giá trị. 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 * Chỉ số mô tả URL

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

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

Mặc dù WebUSB API cố gắng cung cấp giao diện nhất quán để truy cập Nhà phát triển thiết bị USB vẫn cần nắm được các yêu cầu đặt ra ứng dụng như yêu cầu về trình duyệt web để truy cập vào thiết bị.

macOS

Không có gì đặc biệt cần thiế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 chưa được trình điều khiển nhân hệ điều hành xác nhận quyền sở hữu hoặc một ứng dụng khác.

Linux

Linux giống như macOS nhưng theo mặc định, hầu hết các bản phân phối không thiết lập tài khoản người dùng tài khoản 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 chẳng hạn như thao tác này sẽ gán quyền sở hữu một thiết bị khớp với nhà cung cấp cụ thể và mã sản phẩm vào nhóm plugdev. Đây là một nhóm chung cho những người dùng có quyền truy cập đến thiết bị ngoại vi:

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

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

Bạn phải đặt quy tắc này trong một tệp trong thư mục /etc/udev/rules.d và sẽ có hiệu lực ngay khi bạn cắm thiết bị. 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 sửa đổi cấu hình hệ thống. Theo mặc định, mọi thiết bị không được tích hợp trình điều khiển vào hệ điều hành mà trình duyệt có thể sử dụng. Nhà phát triển phải Tuy nhiên, người dùng sẽ gặp phải một bước bổ sung 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 cuộc gọi đến requestDevice(), Android sẽ hiển thị lời nhắc hỏi xem có cho phép hay không Chrome để sử dụng tính năng này. Lời nhắc này cũng sẽ xuất hiện lại nếu người dùng quay lại một trang web đã có quyền kết nối với một thiết bị và trang web gọi open().

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

ChromeOS

ChromeOS cũng hoạt động dựa trên Linux và cũng không yêu cầu sửa đổi cho cấu hình hệ thống. Dịch vụ permission_broker kiểm soát quyền truy cập vào USB thiết bị 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 cao hơn khả năng mở thiết bị USB từ ứng dụng của người dùng mặc định, ngay cả khi không có trình điều khiển nào được tải. Thay vào đó, có một chương trình khuyến mãi trình điều khiển, WinUSB, cần được tải để cung cấp giao diện 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 sử dụng tệp thông tin trình điều khiển (INF) được cài đặt trên hệ thống hoặc bằng cách sửa đổi thiết bị chương trình cơ sở để cung cấp Mã mô tả khả năng tương thích với Microsoft OS trong thời gian liệt kê.

Tệp thông tin về người lái xe (INF)

Tệp thông tin về trình điều khiển cho Windows biết việc cần làm khi gặp 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 tất cả những gì cần thiết là để tệp INF liên kết mã sản phẩm và nhà cung cấp của bạn bằng quy tắc cài đặt mới này. Tệp dưới đây là một ví dụ cơ bản. Lưu vào tệp có đuôi .inf, hãy thay đổi các phần được đánh dấu bằng "X", rồi thay đổi sang phải hãy nhấp vào ứng dụng đó rồi chọn "Cài đặt" từ 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"

Mục [Dev_AddReg] định cấu hình tập hợp DeviceInterfaceGUIDs cho thiết bị. Mỗi giao diện thiết bị phải có một GUID để ứng dụng tìm và kết nối với ứng dụng đó thông qua API Windows. Sử dụng PowerShell New-Guid cmdlet hoặc 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 giao diện dễ dàng cho 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.

Mã mô tả khả năng tương thích với hệ điều hành của Microsoft

Phương pháp sử dụng tệp INF ở trên rất rườm rà vì nó yêu cầu định cấu hình mọi máy của 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 mã mô tả USB tuỳ chỉnh. Các phần mô tả này cung cấp thông tin vào hệ điều hành Windows khi thiết bị được cắm vào nguồn điện lần đầu. thường được bao gồm trong tệp INF.

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

Giá trị Trường Mô tả
Bộ mô tả chức năng nền tảng Microsoft OS 2.0
0x1C bLength Kích thước của phần mô tả này
0x10 bDescriptorType Bộ mô tả chức năng của thiết bị
0x05 bDevCapabilityType Bộ 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 Mã mô tả khả năng tương thích nền tảng Microsoft OS 2.0 GUID ở đị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 mã mô tả
0x02 bMS_VendorCode Giá trị bRequest để truy xuất thêm mã mô tả Microsoft
0x00 bAltEnumCode Thiết bị không hỗ trợ cách liệt kê thay thế

Tương tự như với phần mô tả WebUSB, bạn phải chọn một giá trị bRequest để sử dụng kiểm soát chuyển giao liên quan đến các chỉ số mô tả này. Trong ví dụ này, tôi đã chọn 0x02. 0x07, đặt trong wIndex, là lệnh để truy xuất Microsoft OS 2.0 Đặt từ thiết bị.

bmRequestType bRequest wValue wIndex wLength Dữ liệu (phản hồi)
0b11000000 0x02 0x0000 0x0007 * Bộ mô tả MS OS 2.0

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

Giá trị Trường Mô tả
Tiêu đề bộ mô tả bộ mô tả Microsoft OS 2.0
0x000A wLength Kích thước của phần mô tả này
0x0000 wDescriptorType Bộ mô tả tiêu đề của bộ 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 mã mô tả
Tiêu đề tập hợp con cấu hình Microsoft OS 2.0
0x0008 wLength Kích thước của phần mô tả này
0x0001 wDescriptorType Nội dung mô tả tiêu đề 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ấu hình thường được lập chỉ mục từ 1)
0x00 bReserved Bạn phải đặt giá trị là 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 của hàm Microsoft OS 2.0
0x0008 wLength Kích thước của phần mô tả này
0x0002 wDescriptorType Bộ mô tả tiêu đề tập hợp con của hàm
0x01 bFirstInterface Giao diện đầu tiên của hàm
0x00 bReserved Bạn phải đặt giá trị là 0
0x00A0 wSubsetLength Tổng chiều dài của tập hợp con bao gồm cả tiêu đề này
Bộ 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 phần mô tả này
0x0003 wDescriptorType Mã mô tả mã nhận dạng tương thích
"WINUSB\0\0" CompatibileID Chuỗi ASCII được đệm thành 8 byte
"\0\0\0\0\0\0\0\0" SubCompatibleID Chuỗi ASCII được đệm thành 8 byte
Bộ mô tả thuộc tính sổ đăng ký Microsoft OS 2.0
0x0084 wLength Kích thước của phần mô tả này
0x0004 wDescriptorType Mã mô tả thuộc tính đăng ký
0x0007 wPropertyDataType REG_MULTI_SZ
0x002A wPropertyNameLength Độ dài của tên cơ sở lưu trú
"DeviceInterfaceGUIDs\0" PropertyName Tên tài sản 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 2 dấu kết thúc rỗng được mã hoá bằng UTF-16LE

Windows sẽ chỉ truy vấn thiết bị về thông tin này một lần. Nếu thiết bị có không trả lời kèm theo nội dung mô tả hợp lệ, ứng dụng sẽ không hỏi lại vào lần tới thiết bị đã được kết nối. Microsoft đã cung cấp danh sách USB Device Registry Các mục nhập mô tả các mục nhập đăng ký được tạo khi liệt kê một thiết bị. Thời gian kiểm thử xoá các mục được tạo cho thiết bị để buộc Windows cố gắng đọc mã mô tả một lần nữa.

Để 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 mã mô tả.

Ví dụ

Mã mẫu triển khai các thiết bị nhận biết WebUSB bao gồm cả WebUSB có thể tìm thấy mã mô tả và mã mô tả Microsoft OS trong các dự án sau: