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 bLength
và bDescriptorType
để 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.
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 wTotalLength
và bNumDeviceCaps
để 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: