Stwórz urządzenie, aby w pełni wykorzystać możliwości interfejsu WebUSB API.
Z tego artykułu dowiesz się, jak zaprojektować urządzenie, aby w pełni wykorzystać Interfejs WebUSB API. Krótkie wprowadzenie do interfejsu API znajdziesz w artykule Dostęp do urządzeń USB w internecie.
Tło
Uniwersalna magistrala szeregowa (USB) jest najpopularniejszym fizycznym interfejsem dla podłączania urządzeń peryferyjnych do komputerów stacjonarnych i urządzeń mobilnych. Oprócz określić parametry elektryczne autobusu i określić ogólny model w czasie komunikacji z urządzeniem, specyfikacje USB obejmują zestaw klasy urządzenia specyfikacji. To są ogólne modele dla określonych klas urządzeń, takich jak m.in. pamięci, dźwięku, wideo, sieci i innych funkcji. do wdrożenia. Zaletą tych specyfikacji klasy urządzeń jest to, dostawca systemu operacyjnego może wdrożyć pojedynczy sterownik na podstawie klasy („kierowca klasy”) i każde urządzenie z implementacją tej klasy obsługiwane. To była ogromna poprawa w porównaniu z każdym producentem, który musiał pisać sterowniki urządzenia.
Niektóre urządzenia nie pasują jednak do żadnej z tych standardowych klas urządzeń. O producent może zamiast tego oznaczyć swoje urządzenie jako implementujące klasy dostawcy. W tym przypadku to system operacyjny wybiera urządzenie. ładowanie sterownika w oparciu o informacje zawarte w pakiecie sterownika zwykle jest zbiorem identyfikatorów dostawcy i produktu, o których wiadomo, że implementują protokołu określonego dostawcy.
Inną cechą urządzeń USB jest możliwość połączenia z wieloma interfejsami z hostem, z którym są połączone. W każdym interfejsie możesz zaimplementować albo lub być specyficzne dla dostawcy. Gdy system operacyjny wybiera odpowiednie sterowniki do obsługi danego urządzenia mogą być deklarowane przez różne sterownika. Na przykład kamera internetowa USB ma zazwyczaj 2 interfejsy, po jednym implementuje klasę wideo USB (dla kamery) i jedno z klasą interfejsu USB zajęcia audio (dla mikrofonu). System operacyjny nie wczytuje żadnego „sterownik kamery internetowej” ale zamiast tego wczytuje niezależne sterowniki klas wideo i audio które odpowiadają za różne funkcje urządzenia. Ten klas interfejsu zapewnia większą elastyczność.
Podstawowe informacje o interfejsie API
Wiele standardowych klas USB ma odpowiednie interfejsy API. Na przykład plik
strona może rejestrować film z urządzenia do lekcji wideo za pomocą narzędzia getUserMedia()
lub odbierać zdarzenia wejściowe z urządzenia klasy interfejsu HID (HID) przez nasłuchiwanie
dla KeyboardEvents lub PointerEvents albo Gamepad lub
Interfejs API WebHID.
Tak jak nie wszystkie urządzenia mają ustandaryzowaną definicję klasy,
a urządzenia mają stosowanie funkcji odpowiadających istniejącym interfejsom API platformy internetowej. Kiedy
Dzięki temu interfejs WebUSB API może wypełnić tę lukę, udostępniając witrynom
zadeklarowanie interfejsu konkretnego dostawcy i wdrożenie jego obsługi bezpośrednio
na swojej stronie.
Konkretne wymagania dotyczące dostępności urządzenia przez WebUSB nieco się od siebie różnią z powodu różnic w sposobie zarządzania USB przez systemy operacyjne urządzeń, ale podstawowym wymaganiem jest to, aby urządzenie nie miało sterownik zgłaszającego prawa do interfejsu, który ma kontrolować strona. Może to być ogólny sterownik klasy dostarczany przez dostawcę systemu operacyjnego lub sterownik urządzenia dostarczony przez od dostawcy. Urządzenia USB mogą mieć wiele interfejsów, z których każdy może ma własny sterownik, można stworzyć urządzenie, dla którego niektóre interfejsy są zgłaszane przez sterownik, a pozostałe są dostępne dla przeglądarki.
Na przykład zaawansowana klawiatura USB może mieć interfejs klasy HID, który umożliwia będzie zarezerwowany przez podsystem wejściowy systemu operacyjnego i specyficzny dla dostawcy, interfejsu, który pozostaje dostępny dla WebUSB do użycia przez narzędzie konfiguracyjne. Ten może być udostępniany w witrynie producenta, umożliwiając użytkownikowi pewnych aspektów działania urządzenia, takich jak klawisze makro i efekty świetlne, instalowanie jakichkolwiek programów specyficznych dla danej platformy. Taki deskryptor konfiguracji urządzenia wygląda mniej więcej tak:
Wartość | Pole | Opis |
---|---|---|
Deskryptor konfiguracji | ||
0x09 |
bLength | Rozmiar tego deskryptora |
0x02 |
bDescriptorType | Deskryptor konfiguracji |
0x0039 |
wTotalLength | Całkowita długość tej serii deskryptorów |
0x02 |
bNumInterfaces | Liczba interfejsów |
0x01 |
bConfigurationValue | Configuration 1 |
0x00 |
iConfiguration | Nazwa konfiguracji (brak) |
0b1010000 |
bmAttributes | Samodzielnie zasilane urządzenie ze zdalnym wybudzaniem |
0x32 |
bMaxPower | Maksymalna moc jest wyrażana w przyrostach co 2 mA |
Deskryptor interfejsu | ||
0x09 |
bLength | Rozmiar tego deskryptora |
0x04 |
bDescriptorType | Deskryptor interfejsu |
0x00 |
bInterfaceNumber | Interfejs 0 |
0x00 |
bAlternateSetting | Ustawienie alternatywne 0 (domyślne) |
0x01 |
bNumEndpoints | 1 punkt końcowy |
0x03 |
bInterfaceClass | Klasa interfejsu HID |
0x01 |
bInterfaceSubClass | Podklasa interfejsu uruchamiania |
0x01 |
bInterfaceProtocol | Klawiatura |
0x00 |
iInterface | Nazwa interfejsu (brak) |
Deskryptor HID | ||
0x09 |
bLength | Rozmiar tego deskryptora |
0x21 |
bDescriptorType | Deskryptor HID |
0x0101 |
bcdHID | HID w wersji 1.1 |
0x00 |
bCountryCode | Kraj docelowy sprzętu |
0x01 |
bNumDescriptors | Liczba deskryptorów klas HID do sprawdzania |
0x22 |
bDescriptorType | Typ deskryptora raportu |
0x003F |
wDescriptorLength | Całkowita długość deskryptora raportu |
Deskryptor punktu końcowego | ||
0x07 |
bLength | Rozmiar tego deskryptora |
0x05 |
bDescriptorType | Deskryptor punktu końcowego |
0b10000001 |
bEndpointAddress | Punkt końcowy 1 (IN) |
0b00000011 |
bmAttributes | Przerwij |
0x0008 |
wMaxPacketSize | Pakiety 8-bajtowe |
0x0A |
bInterval | Odstęp 10 ms |
Deskryptor interfejsu | ||
0x09 |
bLength | Rozmiar tego deskryptora |
0x04 |
bDescriptorType | Deskryptor interfejsu |
0x01 |
bInterfaceNumber | Interfejs 1 |
0x00 |
bAlternateSetting | Ustawienie alternatywne 0 (domyślne) |
0x02 |
bNumEndpoints | 2 punkty końcowe |
0xFF |
bInterfaceClass | Klasa interfejsu dostawcy |
0x00 |
bInterfaceSubClass | |
0x00 |
bInterfaceProtocol | |
0x00 |
iInterface | Nazwa interfejsu (brak) |
Deskryptor punktu końcowego | ||
0x07 |
bLength | Rozmiar tego deskryptora |
0x05 |
bDescriptorType | Deskryptor punktu końcowego |
0b10000010 |
bEndpointAddress | Punkt końcowy 1 (IN) |
0b00000010 |
bmAttributes | Zbiorczy |
0x0040 |
wMaxPacketSize | Pakiety 64-bajtowe |
0x00 |
bInterval | Nie dotyczy w przypadku zbiorczych punktów końcowych |
Deskryptor punktu końcowego | ||
0x07 |
bLength | Rozmiar tego deskryptora |
0x05 |
bDescriptorType | Deskryptor punktu końcowego |
0b00000011 |
bEndpointAddress | Punkt końcowy 3 (OUT) |
0b00000010 |
bmAttributes | Zbiorczy |
0x0040 |
wMaxPacketSize | Pakiety 64-bajtowe |
0x00 |
bInterval | Nie dotyczy w przypadku zbiorczych punktów końcowych |
Deskryptor konfiguracji składa się z wielu połączonych deskryptorów
razem. Każdy z nich zaczyna się od pól bLength
i bDescriptorType
, dzięki czemu
jak szybko można je zidentyfikować. Pierwszym z nich jest interfejs HID z powiązanym
Deskryptor HID i pojedynczy punkt końcowy używany do dostarczania zdarzeń wejściowych do
systemu operacyjnego. Drugi interfejs to interfejs specyficzny dla dostawcy, z 2 elementami
punkty końcowe, które mogą być używane do wysyłania poleceń do urządzenia i odbierania odpowiedzi
w zamian.
Deskryptory WebUSB
WebUSB może działać z wieloma urządzeniami bez modyfikacji oprogramowania, można włączyć dodatkowe funkcje, oznaczając urządzenie za pomocą deskryptory wskazujące obsługę WebUSB. Możesz na przykład określić parametr URL strony docelowej, na którą przeglądarka może przekierować użytkownika, gdy na podłączonym zasilaniu.
Magazyn obiektów urządzeń binarnych (BOS) to koncepcja wprowadzona w USB 3.0, również zostały przeniesione na urządzenia USB 2.0 w ramach wersji 2.1. Deklarowanie Obsługa WebUSB rozpoczyna się od uwzględnienia następującej funkcji platformy Deskryptor w deskryptorze BOS:
Wartość | Pole | Opis |
---|---|---|
Deskryptor magazynu obiektów urządzenia binarnego | ||
0x05 |
bLength | Rozmiar tego deskryptora |
0x0F |
bDescriptorType | Deskryptor magazynu obiektów urządzenia binarnego |
0x001D |
wTotalLength | Całkowita długość tej serii deskryptorów |
0x01 |
bNumDeviceCaps | Liczba deskryptorów możliwości urządzenia w BOS |
Deskryptor możliwości platformy WebUSB | ||
0x18 |
bLength | Rozmiar tego deskryptora |
0x10 |
bDescriptorType | Deskryptor możliwości urządzenia |
0x05 |
bDevCapabilityType | Deskryptor możliwości platformy |
0x00 |
bReserved | |
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} |
PlatformCapablityUUID | Identyfikator GUID deskryptora funkcji platformy WebUSB w formacie little-endian |
0x0100 |
bcdVersion | Deskryptor WebUSB w wersji 1.0 |
0x01 |
bVendorCode | Wartość bRequest dla WebUSB |
0x01 |
iLandingPage | URL strony docelowej |
Identyfikator UUID funkcji platformy określa to jako obsługę platformy WebUSB
deskryptor, który zawiera podstawowe informacje o urządzeniu. W przeglądarce
aby pobrać więcej informacji o urządzeniu, które używa wartości bVendorCode
do
wysyłać dodatkowe żądania do urządzenia. Obecnie określone jest jedyne żądanie to
GET_URL
, który zwraca deskryptor adresu URL. Są podobne do ciągu znaków
deskryptory, ale zostały zaprojektowane tak, aby kodowały adresy URL o najmniejszej liczbie bajtów. Adres URL
deskryptor dla funkcji "https://google.com"
będzie wyglądać tak:
Wartość | Pole | Opis |
---|---|---|
Deskryptor adresu URL | ||
0x0D |
bLength | Rozmiar tego deskryptora |
0x03 |
bDescriptorType | Deskryptor adresu URL |
0x01 |
bScheme | https:// |
"google.com" |
URL | Treść adresu URL zakodowana w formacie UTF-8 |
Po pierwszym podłączeniu urządzenia przeglądarka odczytuje deskryptor BOS przez
wykonanie tego standardowego przeniesienia kontroli GET_DESCRIPTOR
:
bmRequestType | bRequest | wValue | wIndex | wLength | Dane (odpowiedź) |
---|---|---|---|---|---|
0b10000000 |
0x06 |
0x0F00 |
0x0000 |
* | Deskryptor BOS |
Zwykle żądanie jest wysyłane 2 razy: za pierwszym razem z wystarczająco dużymi danymi w wLength
tak by host mógł określić wartość pola wTotalLength
bez
zobowiązując się do wykonania dużego transferu, a potem znowu, gdy pełna długość deskryptora
nieznane.
Jeśli deskryptor funkcji WebUSB ma pole iLandingPage
ustawione na
wartość różną od 0, a przeglądarka wykonuje następnie związane z WebUSB żądanie GET_URL
przesyłając przekazanie kontroli z wartością bRequest
ustawioną na bVendorCode
z deskryptora możliwości platformy, a pole wValue
jest ustawione na iLandingPage
. Kod żądania w przypadku usługi GET_URL
(0x02
) wpisuje się w skrzynce wIndex
:
bmRequestType | bRequest | wValue | wIndex | wLength | Dane (odpowiedź) |
---|---|---|---|---|---|
0b11000000 |
0x01 |
0x0001 |
0x0002 |
* | Deskryptor adresu URL |
Także w przypadku pierwszej prośby to prośba może zostać wysłana dwa razy, by najpierw sprawdzić jej długość. odczytywanego deskryptora.
Uwagi dotyczące poszczególnych platform
Wprawdzie interfejs WebUSB API stara się zapewnić spójny interfejs dostępu Programiści urządzeń USB powinni znać wymagania dotyczące urządzeń USB np. wymagania dotyczące przeglądarek.
macOS
W systemie macOS nie jest wymagane żadne specjalne działanie. Witryna korzystająca z WebUSB może połączyć się z urządzenia i zgłosić prawa do wszystkich interfejsów, które nie są zarezerwowane przez sterownik jądra, do innej aplikacji.
Linux
Linux jest jak macOS, ale domyślnie w większości dystrybucji
Konta z uprawnieniami do otwierania urządzeń USB. Demon systemu o nazwie udev to
odpowiada za przypisanie użytkownika i grupy z dostępem do urządzenia. Reguła
na przykład przypisać własność urządzenia pasującego do danego dostawcy.
identyfikatorów produktów do grupy plugdev
, która jest wspólną grupą użytkowników mających dostęp
do urządzeń peryferyjnych:
SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="XXXX", GROUP="plugdev"
Zastąp XXXX
szesnastkowymi identyfikatorami dostawcy i produktu urządzenia.
np. ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11"
pasuje do Nexus One
telefonu. Musisz je wpisywać bez zwykłego „0x”. prefiks i małe litery
zostały poprawnie rozpoznane. Aby znaleźć identyfikatory swojego urządzenia, uruchom wiersz poleceń
narzędzie lsusb
.
Reguła ta należy umieścić w pliku w katalogu /etc/udev/rules.d
zostanie zastosowany z chwilą podłączenia urządzenia do zasilania. Nie ma potrzeby ponownego uruchamiania
udev.
Android
Platforma Android opiera się na Linuksie, ale nie wymaga żadnych modyfikacji,
konfiguracji systemu. Domyślnie na każdym urządzeniu bez wbudowanego sterownika
do systemu operacyjnego i będzie dostępna dla przeglądarki. Programiści powinni
pamiętaj jednak, że użytkownicy napotkają dodatkowy krok przy próbie nawiązania połączenia
urządzenia. Gdy użytkownik wybierze urządzenie w odpowiedzi na połączenie z
requestDevice()
, Android wyświetli pytanie o zgodę
Chrome. Ta prośba pojawia się także wtedy, gdy użytkownik wróci na stronę.
które ma już pozwolenie na połączenie się z urządzeniem, a strona wywołuje
open()
Ponadto na urządzeniach z Androidem będzie dostępnych więcej urządzeń niż na komputerach z systemem Linux. bo domyślnie uwzględniamy mniej sterowników. Istotne pominięcie np. to klasa USB CDC-ACM powszechnie wdrażana przez adaptery USB-seryjne, w pakiecie Android SDK nie ma interfejsu API do komunikacji z urządzeniem szeregowym.
ChromeOS
ChromeOS jest oparty także na Linuksie i nie wymaga żadnych modyfikacji. do konfiguracji systemu. Usługa allow_broker kontroluje dostęp do USB urządzeń i pozwoli przeglądarce na dostęp do nich, pod warunkiem, że jest nie zgłoszono praw do interfejsu.
Windows
Model sterownika Windows wprowadza dodatkowe wymaganie. W przeciwieństwie do platformy powyżej możliwości otwarcia urządzenia USB z aplikacji użytkownika nie jest domyślnie, nawet jeśli nie ma załadowanego sterownika. Zamiast tego jest dostępny specjalny atrybut sterownika WinUSB, który musi być załadowany, aby udostępnić interfejs za pomocą których aplikacje uzyskują dostęp do urządzenia. Można to zrobić za pomocą plik informacji o sterowniku (INF) zainstalowany w systemie lub przez zmianę urządzenia co zapewnia deskryptory zgodności systemu operacyjnego Microsoft do wyliczenia.
Plik z informacjami o sterowniku (INF)
Plik z informacjami o sterowniku informuje system Windows, co ma zrobić, gdy napotka urządzenie.
po raz pierwszy. Ponieważ system użytkownika zawiera już sterownik WinUSB
Wystarczy, że plik INF powiąże dostawcę z identyfikatorem produktu
zgodnie z nową zasadą instalacji. Poniższy przykład to podstawowy przykład. Zapisz w
z rozszerzeniem .inf
, zmień sekcje oznaczone symbolem „X”, a potem w prawo
kliknij ją i wybierz „Zainstaluj”. w menu kontekstowym.
[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"
Sekcja [Dev_AddReg]
konfiguruje zestaw identyfikatorów DeviceInterfaceGUID dla interfejsu
urządzenia. Każdy interfejs urządzenia musi mieć identyfikator GUID, aby aplikacja mogła
znaleźć go i połączyć z nim za pomocą interfejsu Windows API. Używanie powłoki PowerShell New-Guid
za pomocą polecenia cmdlet lub narzędzia online do wygenerowania losowego identyfikatora GUID.
Do celów programistycznych narzędzie Zadig udostępnia prosty interfejs zastępując sterownik ładowany dla interfejsu USB sterownikiem WinUSB.
Deskryptory zgodności z systemem operacyjnym Microsoft
Użycie pliku INF jest niewygodne, ponieważ wymaga skonfigurowania wszystkich na komputerze użytkownika. Windows 8.1 i nowszy oferuje alternatywę za pomocą niestandardowych deskryptorów USB. Te deskryptory dostarczają informacji do systemu operacyjnego Windows po pierwszym podłączeniu urządzenia, zazwyczaj są umieszczane w pliku INF.
Po skonfigurowaniu deskryptorów WebUSB możesz łatwo dodać system operacyjny Microsoft
deskryptory zgodności. Najpierw rozszerz deskryptor BOS o
dodatkowego deskryptora funkcji platformy. Pamiętaj, aby zaktualizować aplikację wTotalLength
i bNumDeviceCaps
.
Wartość | Pole | Opis |
---|---|---|
Deskryptor możliwości platformy Microsoft OS 2.0 | ||
0x1C |
bLength | Rozmiar tego deskryptora |
0x10 |
bDescriptorType | Deskryptor możliwości urządzenia |
0x05 |
bDevCapabilityType | Deskryptor możliwości platformy |
0x00 |
bReserved | |
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} |
PlatformCapablityUUID | Identyfikator GUID deskryptora zgodności platformy Microsoft OS 2.0 w formacie little-endian |
0x06030000 |
dwWindowsVersion | Minimalna zgodna wersja Windows (Windows 8.1) |
0x00B2 |
wMSOSDescriptorSetTotalLength | Całkowita długość zestawu deskryptorów |
0x02 |
bMS_VendorCode | Wartość bRequest do pobierania kolejnych deskryptorów Microsoft |
0x00 |
bAltEnumCode | Urządzenie nie obsługuje alternatywnego wyliczenia |
Tak jak w przypadku deskryptorów WebUSB, musisz wybrać wartość bRequest
, która będzie używana przez
i kontroli związane z tymi deskryptorami. W tym przykładzie wybrałem
0x02
0x07
, umieszczony w wIndex
, to polecenie do pobrania systemu operacyjnego Microsoft
2.0 Zestaw deskryptorów z urządzenia.
bmRequestType | bRequest | wValue | wIndex | wLength | Dane (odpowiedź) |
---|---|---|---|---|---|
0b11000000 |
0x02 |
0x0000 |
0x0007 |
* | Zestaw deskryptorów MS OS 2.0 |
Urządzenie USB może pełnić wiele funkcji, więc pierwsza część deskryptora
opisuje funkcję, z którą są powiązane poniższe właściwości.
przykład poniżej konfiguruje interfejs 1 urządzenia złożonego. Deskryptor podaje
dwie ważne informacje o interfejsie. Zgodny
Deskryptor identyfikatora informuje system Windows, że to urządzenie jest zgodne z WinUSB
sterownika. Deskryptor właściwości rejestru działa podobnie jak
[Dev_AddReg]
w przykładzie INF powyżej, ustawiając właściwość rejestru na
przypisać tej funkcji identyfikator GUID interfejsu urządzenia.
Wartość | Pole | Opis |
---|---|---|
Nagłówek zestawu deskryptorów systemu Microsoft OS 2.0 | ||
0x000A |
wLength | Rozmiar tego deskryptora |
0x0000 |
wDescriptorType | Deskryptor zestawu deskryptorów |
0x06030000 |
dwWindowsVersion | Minimalna zgodna wersja Windows (Windows 8.1) |
0x00B2 |
wTotalLength | Całkowita długość zestawu deskryptorów |
Nagłówek podzbioru konfiguracji systemu Microsoft OS 2.0 | ||
0x0008 |
wLength | Rozmiar tego deskryptora |
0x0001 |
wDescriptorType | Opis nagłówka podzbioru konfiguracji. |
0x00 |
bConfigurationValue | Ma zastosowanie do konfiguracji 1 (zindeksowane z wartości 0 pomimo konfiguracji zwykle zindeksowane z 1) |
0x00 |
bReserved | Wartość musi wynosić 0 |
0x00A8 |
wTotalLength | Całkowita długość podzbioru razem z tym nagłówkiem |
Nagłówek podzbioru funkcji systemu Microsoft OS 2.0 | ||
0x0008 |
wLength | Rozmiar tego deskryptora |
0x0002 |
wDescriptorType | Deskryptor nagłówka podzbioru funkcji |
0x01 |
bFirstInterface | Pierwszy interfejs funkcji |
0x00 |
bReserved | Wartość musi wynosić 0 |
0x00A0 |
wSubsetLength | Całkowita długość podzbioru razem z tym nagłówkiem |
Deskryptor identyfikatora zgodny z systemem Microsoft OS 2.0 | ||
0x0014 |
wLength | Rozmiar tego deskryptora |
0x0003 |
wDescriptorType | Zgodny deskryptor identyfikatora |
"WINUSB\0\0" |
CompatibileID | Ciąg ASCII z dopełnieniem do 8 bajtów |
"\0\0\0\0\0\0\0\0" |
SubCompatibleID | Ciąg ASCII z dopełnieniem do 8 bajtów |
Deskryptor właściwości rejestru Microsoft OS 2.0 | ||
0x0084 |
wLength | Rozmiar tego deskryptora |
0x0004 |
wDescriptorType | Deskryptor właściwości rejestru |
0x0007 |
wPropertyDataType | REG_MULTI_SZ |
0x002A |
wPropertyNameLength | Długość nazwy właściwości |
"DeviceInterfaceGUIDs\0" |
PropertyName | Nazwa właściwości z zakończeniem o wartości null zakodowanej w UTF-16LE |
0x0050 |
wPropertyDataLength | Długość wartości właściwości |
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" |
PropertyData | Identyfikator GUID z dwoma zakończeniemi typu null zakodowane w formacie UTF-16LE |
System Windows wyśle zapytanie do urządzenia tylko raz. Jeśli urządzenie nie odpowie z użyciem prawidłowych deskryptorów, nie poprosi ponownie, gdy następnym razem urządzenie jest podłączone. Firma Microsoft udostępniła listę rejestru urządzeń USB Wpisy opisujące wpisy rejestru utworzone podczas wyliczania urządzenia. Kiedy testowanie usuń wpisy utworzone dla urządzenia, aby system Windows próbował je odczytać z deskryptorami.
Więcej informacji o korzystaniu z tych funkcji znajdziesz w poście na blogu firmy Microsoft. deskryptory.
Przykłady
Przykładowy kod implementujący urządzenia obsługujące WebUSB, które zawierają zarówno protokół WebUSB deskryptory i deskryptory systemu operacyjnego Microsoft można znaleźć w następujących projektach: