Membuat perangkat untuk WebUSB

Bangun perangkat untuk memanfaatkan sepenuhnya WebUSB API.

Artikel ini menjelaskan cara membuat perangkat untuk memanfaatkan sepenuhnya WebUSB API. Untuk pengantar singkat tentang API itu sendiri, lihat Mengakses Perangkat USB di Web.

Latar belakang

{i>Universal Serial Bus<i} (USB) telah menjadi antarmuka fisik yang paling umum untuk menghubungkan periferal ke perangkat komputasi {i>desktop<i} dan seluler. Selain dengan mendefinisikan karakteristik kelistrikan bus dan model umum untuk berkomunikasi dengan perangkat, spesifikasi USB mencakup serangkaian kelas perangkat spesifikasi produk. Ini adalah model umum untuk kelas perangkat tertentu seperti seperti penyimpanan, audio, video, jaringan, dll. yang dapat disediakan oleh produsen perangkat diterapkan. Keuntungan dari spesifikasi kelas perangkat ini adalah bahwa sebuah vendor sistem operasi dapat menerapkan {i>driver<i} tunggal berdasarkan kelas ("driver kelas") dan perangkat apa pun yang menerapkan kelas tersebut didukung. Ini adalah peningkatan besar atas setiap produsen yang perlu menulis {i>driver <i}perangkat mereka sendiri.

Namun, beberapa perangkat tidak sesuai dengan salah satu kelas perangkat standar ini. J Produsen dapat memilih melabeli perangkat mereka sebagai menerapkan kelas khusus vendor. Dalam hal ini sistem operasi memilih perangkat mana {i>driver<i} untuk dimuat berdasarkan informasi yang disediakan dalam paket {i>driver<i} vendor, biasanya seperangkat ID vendor dan produk yang diketahui untuk menerapkan protokol khusus vendor tertentu.

Fitur lain dari USB adalah bahwa perangkat dapat menyediakan beberapa antarmuka untuk {i>host<i} yang terhubung dengan mereka. Setiap antarmuka dapat mengimplementasikan standar atau khusus vendor. Ketika sistem operasi memilih {i>driver<i} yang tepat untuk menangani perangkat. Setiap antarmuka dapat diklaim oleh komputer {i>driver<i}. Misalnya, {i>webcam<i} USB biasanya menyediakan dua antarmuka, satu menerapkan class video USB (untuk kamera) dan satu lagi menerapkan USB kelas audio (untuk mikrofon). Sistem operasinya tidak memuat satu pun "driver webcam" tetapi sebagai gantinya memuat driver kelas video dan audio independen yang bertanggung jawab untuk fungsi perangkat yang terpisah. Ini komposisi class antarmuka memberikan fleksibilitas yang lebih besar.

Dasar-dasar API

Banyak class USB standar memiliki API web yang sesuai. Sebagai contoh, dapat merekam video dari perangkat kelas video menggunakan getUserMedia() atau menerima peristiwa input dari perangkat class antarmuka manusia (HID) dengan memproses untuk KeyboardEvents atau PointerEvents, atau dengan menggunakan Gamepad atau WebHID API. Sama seperti tidak semua perangkat mengimplementasikan definisi kelas yang terstandardisasi, tidak semua perangkat menerapkan fitur yang sesuai dengan API platform web yang ada. Kapan dalam kasus ini, WebUSB API dapat mengisi kesenjangan itu dengan menyediakan cara bagi situs untuk mengklaim antarmuka khusus vendor dan menerapkan dukungannya dari dalam halaman mereka.

Persyaratan khusus agar perangkat dapat diakses melalui WebUSB sedikit berbeda dari platform ke platform karena perbedaan dalam cara sistem operasi mengelola USB perangkat tetapi persyaratan dasarnya adalah perangkat seharusnya tidak sudah memiliki {i>driver<i} yang mengklaim antarmuka yang ingin dikendalikan laman tersebut. Ini bisa berupa {i>driver<i} kelas generik yang disediakan oleh vendor OS atau {i>driver<i} perangkat yang disediakan oleh vendor. Karena perangkat USB dapat menyediakan banyak antarmuka, yang masing-masing dapat memiliki {i>driver<i} sendiri, maka mungkin untuk membuat perangkat dengan beberapa antarmuka diklaim oleh {i>driver<i} dan yang lainnya masih dapat diakses oleh {i>browser<i}.

Misalnya, keyboard USB kelas atas mungkin menyediakan antarmuka kelas HID yang akan diklaim oleh subsistem input sistem operasi dan permintaan yang tetap tersedia bagi WebUSB untuk digunakan oleh alat konfigurasi. Ini dapat ditayangkan di situs web produsen yang memungkinkan pengguna untuk mengubah aspek perilaku perangkat seperti tombol makro dan efek pencahayaan tanpa menginstal perangkat lunak khusus platform. Deskriptor konfigurasi perangkat tersebut akan akan terlihat seperti ini:

Nilai Kolom Deskripsi
Deskriptor konfigurasi
0x09 bLength Ukuran deskriptor ini
0x02 bDescriptorType Deskriptor konfigurasi
0x0039 wTotalLength Panjang total rangkaian deskripsi ini
0x02 bNumInterfaces Jumlah antarmuka
0x01 bConfigurationValue Konfigurasi 1
0x00 iConfiguration Nama konfigurasi (tidak ada)
0b1010000 bmAttributes Perangkat mandiri dengan bangun dari jarak jauh
0x32 bMaxPower Daya Maks dinyatakan dalam kelipatan 2 mA
Deskriptor antarmuka
0x09 bLength Ukuran deskriptor ini
0x04 bDescriptorType Deskriptor antarmuka
0x00 bInterfaceNumber Antarmuka 0
0x00 bAlternateSetting Setelan alternatif 0 (default)
0x01 bNumEndpoints 1 endpoint
0x03 bInterfaceClass Class antarmuka HID
0x01 bInterfaceSubClass Subclass antarmuka booting
0x01 bInterfaceProtocol Keyboard
0x00 iInterface Nama antarmuka (tidak ada)
Deskripsi HID
0x09 bLength Ukuran deskriptor ini
0x21 bDescriptorType Deskripsi HID
0x0101 bcdHID HID versi 1.1
0x00 bCountryCode Negara target hardware
0x01 bNumDescriptors Jumlah deskriptor class HID yang harus diikuti
0x22 bDescriptorType Jenis deskripsi laporan
0x003F wDescriptorLength Panjang total deskripsi Laporan
Deskripsi endpoint
0x07 bLength Ukuran deskriptor ini
0x05 bDescriptorType Deskripsi endpoint
0b10000001 bEndpointAddress Endpoint 1 (IN)
0b00000011 bmAttributes Interupsi
0x0008 wMaxPacketSize Paket 8 byte
0x0A bInterval Interval 10 md
Deskriptor antarmuka
0x09 bLength Ukuran deskriptor ini
0x04 bDescriptorType Deskriptor antarmuka
0x01 bInterfaceNumber Antarmuka 1
0x00 bAlternateSetting Setelan alternatif 0 (default)
0x02 bNumEndpoints 2 endpoint
0xFF bInterfaceClass Class antarmuka khusus vendor
0x00 bInterfaceSubClass
0x00 bInterfaceProtocol
0x00 iInterface Nama antarmuka (tidak ada)
Deskripsi endpoint
0x07 bLength Ukuran deskriptor ini
0x05 bDescriptorType Deskripsi endpoint
0b10000010 bEndpointAddress Endpoint 1 (IN)
0b00000010 bmAttributes Massal
0x0040 wMaxPacketSize Paket 64 byte
0x00 bInterval T/A untuk endpoint massal
Deskripsi endpoint
0x07 bLength Ukuran deskriptor ini
0x05 bDescriptorType Deskripsi endpoint
0b00000011 bEndpointAddress Endpoint 3 (KELUAR)
0b00000010 bmAttributes Massal
0x0040 wMaxPacketSize Paket 64 byte
0x00 bInterval T/A untuk endpoint massal

Deskriptor konfigurasi terdiri dari beberapa deskriptor yang digabungkan secara bersamaan. Setiap tabel diawali dengan kolom bLength dan bDescriptorType sehingga dapat diidentifikasi. Antarmuka pertama adalah antarmuka HID dengan Deskriptor HID dan endpoint tunggal yang digunakan untuk mengirim peristiwa input ke sistem operasi seluler. Antarmuka kedua adalah antarmuka khusus vendor dengan dua endpoint yang dapat digunakan untuk mengirimkan perintah ke perangkat dan menerima respons sebagai hasilnya.

Deskriptor WebUSB

Meskipun WebUSB dapat bekerja dengan banyak perangkat tanpa modifikasi firmware, fungsi tambahan diaktifkan dengan menandai perangkat dengan deskriptor yang menunjukkan dukungan untuk WebUSB. Misalnya, Anda dapat menentukan URL halaman landing yang dapat digunakan browser untuk mengarahkan pengguna saat perangkat Anda dicolokkan.

Screenshot notifikasi WebUSB di Chrome
Notifikasi WebUSB.

{i>Biner device Object Store<i} (BOS) adalah konsep yang diperkenalkan di USB 3.0 tetapi memiliki juga telah di-backport ke perangkat USB 2.0 sebagai bagian dari versi 2.1. Mendeklarasikan untuk WebUSB dimulai dengan menyertakan Kemampuan Platform berikut Deskripsi dalam deskripsi BOS:

Nilai Kolom Deskripsi
Deskriptor Penyimpanan Objek perangkat biner
0x05 bLength Ukuran deskriptor ini
0x0F bDescriptorType Deskriptor Penyimpanan Objek perangkat biner
0x001D wTotalLength Panjang total rangkaian deskripsi ini
0x01 bNumDeviceCaps Jumlah deskriptor kemampuan perangkat dalam BOS
Deskriptor kemampuan platform WebUSB
0x18 bLength Ukuran deskriptor ini
0x10 bDescriptorType Deskriptor kemampuan perangkat
0x05 bDevCapabilityType Deskriptor kemampuan platform
0x00 bReserved
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} PlatformCapablityUUID GUID deskriptor kemampuan platform WebUSB dalam format little-endian
0x0100 bcdVersion Deskriptor WebUSB versi 1.0
0x01 bVendorCode Nilai bRequest untuk WebUSB
0x01 iLandingPage URL untuk halaman landing

UUID kemampuan platform mengidentifikasi ini sebagai Kemampuan WebUSB Platform deskripsi, yang memberikan informasi dasar tentang perangkat. Untuk browser untuk mengambil informasi selengkapnya tentang perangkat, nilai bVendorCode digunakan untuk mengirimkan permintaan tambahan ke perangkat. Satu-satunya permintaan yang saat ini adalah GET_URL yang menampilkan deskripsi URL. Ini mirip dengan {i>string<i} tapi dirancang untuk mengenkode URL dalam byte paling kecil. URL untuk "https://google.com" akan terlihat seperti ini:

Nilai Kolom Deskripsi
Deskriptor URL
0x0D bLength Ukuran deskriptor ini
0x03 bDescriptorType Deskriptor URL
0x01 bScheme https://
"google.com" URL Konten URL berenkode UTF-8

Ketika perangkat Anda pertama kali dicolokkan, browser akan membaca deskriptor BOS dengan menerbitkan transfer kontrol GET_DESCRIPTOR standar ini:

bmRequestType bRequest wValue wIndex wLength Data (respons)
0b10000000 0x06 0x0F00 0x0000 * Deskripsi BOS

Permintaan ini biasanya dibuat dua kali, yaitu untuk pertama kalinya dengan wLength yang cukup besar sehingga host mengetahui nilai kolom wTotalLength tanpa berkomitmen untuk mentransfer besar dan kemudian lagi ketika panjang deskriptor penuh adalah dikenal.

Jika deskriptor WebUSB Platform Capability memiliki kolom iLandingPage yang ditetapkan ke nilai bukan nol, browser kemudian melakukan permintaan GET_URL khusus WebUSB dengan mengeluarkan transfer kontrol dengan bRequest yang disetel ke nilai bVendorCode dari deskriptor kemampuan platform dan wValue ditetapkan ke iLandingPage dengan sejumlah nilai. Kode permintaan untuk GET_URL (0x02) masuk di wIndex:

bmRequestType bRequest wValue wIndex wLength Data (respons)
0b11000000 0x01 0x0001 0x0002 * Deskriptor URL

Sekali lagi, permintaan ini mungkin diajukan dua kali untuk mengetahui terlebih dahulu panjangnya deskriptor yang sedang dibaca.

Pertimbangan khusus platform

Sementara WebUSB API mencoba menyediakan antarmuka yang konsisten untuk mengakses Pengembang perangkat USB harus tetap mengetahui persyaratan yang diberlakukan pada aplikasi seperti persyaratan {i>browser<i} web untuk mengakses perangkat.

macOS

Tidak ada hal khusus yang diperlukan untuk macOS. Situs web yang menggunakan WebUSB dapat terhubung ke perangkat dan mengklaim antarmuka apa pun yang tidak diklaim oleh {i>driver<i} {i>kernel<i} atau aplikasi lain.

Linux

Linux seperti macOS, tetapi secara default sebagian besar distribusi tidak menyiapkan akun yang memiliki izin untuk membuka perangkat USB. {i>Daemon<i} sistem yang disebut {i>udev <i}adalah bertanggung jawab untuk menetapkan pengguna dan grup yang diizinkan untuk mengakses perangkat. Aturan seperti ini akan menetapkan kepemilikan perangkat yang cocok dengan vendor yang diberikan dan ID produk ke grup plugdev yang merupakan grup umum untuk pengguna yang memiliki akses ke periferal:

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

Ganti XXXX dengan ID produk dan vendor heksadesimal untuk perangkat Anda, mis. ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11" akan cocok dengan Nexus One ponsel. Kolom ini harus ditulis tanpa "0x" yang biasa awalan dan huruf kecil semua agar dikenali dengan benar. Untuk menemukan ID perangkat, jalankan command line alat lsusb.

Aturan ini harus ditempatkan dalam file di direktori /etc/udev/rules.d dan berfungsi segera setelah perangkat dicolokkan. Tidak perlu memulai ulang {i>udev<i}.

Android

Platform Android berbasis pada Linux tetapi tidak memerlukan modifikasi apa pun untuk konfigurasi sistem. Secara {i>default<i} setiap perangkat yang tidak memiliki {i>driver<i} ke dalam sistem operasi yang tersedia untuk {i>browser<i}. Pengembang seharusnya namun mengetahui bahwa pengguna akan mengalami langkah tambahan saat terhubung ke perangkat. Setelah pengguna memilih perangkat sebagai respons terhadap panggilan ke requestDevice(), Android akan menampilkan perintah yang menanyakan apakah akan mengizinkan Chrome untuk mengaksesnya. Dialog ini juga akan muncul kembali jika pengguna kembali ke situs yang sudah memiliki izin untuk terhubung ke perangkat dan situs web memanggil open()

Selain itu, lebih banyak perangkat yang akan dapat diakses di Android dibandingkan di desktop Linux karena lebih sedikit {i>driver<i} yang disertakan secara {i>default<i}. Kelalaian yang signifikan, misalnya, adalah kelas USB CDC-ACM yang umumnya diimplementasikan oleh adaptor USB-ke-serial karena ada tidak ada API di Android SDK untuk berkomunikasi dengan perangkat serial.

ChromeOS

ChromeOS juga berbasis Linux dan tidak memerlukan modifikasi apa pun ke konfigurasi sistem. Layanan permissions_broker mengontrol akses ke USB perangkat seluler dan akan mengizinkan browser mengaksesnya selama setidaknya ada satu antarmuka yang tidak diklaim.

Windows

Model {i>driver<i} Windows memperkenalkan persyaratan tambahan. Tidak seperti platform di atas kemampuan untuk membuka perangkat USB dari aplikasi pengguna tidak {i>default-<i}nya, bahkan jika tidak ada {i>driver<i} yang dimuat. Sebagai gantinya, ada {i>driver<i}, WinUSB, yang perlu dimuat untuk menyediakan antarmuka digunakan aplikasi untuk mengakses perangkat. Hal ini dapat dilakukan dengan {i>driver information file<i} (INF) yang diinstal pada sistem atau dengan memodifikasi perangkat untuk memberikan Deskripsi Kompatibilitas Microsoft OS selama enumerasi (enumerasi).

File Informasi Pengemudi (INF)

File informasi {i>driver<i} memberi tahu Windows apa yang harus dilakukan saat bertemu dengan perangkat untuk pertama kalinya. Karena sistem pengguna sudah menyertakan {i>driver<i} WinUSB yang diperlukan hanyalah agar file INF dapat mengaitkan vendor dan ID produk Anda dengan aturan penginstalan baru ini. File di bawah ini adalah contoh dasar. Simpan ke file dengan ekstensi .inf, ubah bagian yang ditandai dengan "X", lalu ke kanan klik dan pilih "{i>Install<i}" dari menu konteks.

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

Bagian [Dev_AddReg] mengonfigurasi kumpulan DeviceInterfaceGUID untuk perangkat seluler. Setiap antarmuka perangkat harus memiliki GUID agar aplikasi menemukan dan menghubungkannya melalui Windows API. Menggunakan PowerShell New-Guid {i>cmdlet<i} atau alat {i>online<i} untuk membuat GUID acak.

Untuk tujuan pengembangan, alat Zadig menyediakan antarmuka yang mudah bagi mengganti {i>driver<i} yang dimuat untuk antarmuka USB dengan {i>driver<i} WinUSB.

Deskriptor kompatibilitas Microsoft OS

Pendekatan file INF di atas rumit karena memerlukan konfigurasi setiap komputer pengguna sebelumnya. Windows 8.1 dan yang lebih tinggi menawarkan alternatif melalui penggunaan deskriptor USB khusus. Deskripsi ini memberikan informasi ke sistem operasi Windows ketika perangkat pertama kali dicolokkan akan biasanya disertakan dalam file INF.

Setelah Anda menyiapkan deskriptor WebUSB, mudah untuk menambahkan OS Microsoft juga deskriptor kompatibilitas. Pertama, perluas deskriptor BOS dengan deskriptor kemampuan platform tambahan. Pastikan untuk mengupdate wTotalLength dan bNumDeviceCaps untuk memperhitungkannya.

Nilai Kolom Deskripsi
Deskriptor kemampuan platform Microsoft OS 2.0
0x1C bLength Ukuran deskriptor ini
0x10 bDescriptorType Deskriptor kemampuan perangkat
0x05 bDevCapabilityType Deskriptor kemampuan platform
0x00 bReserved
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} PlatformCapablityUUID GUID deskriptor kompatibilitas platform Microsoft OS 2.0 dalam format little-endian
0x06030000 dwWindowsVersion Versi Windows minimum yang kompatibel (Windows 8.1)
0x00B2 wMSOSDescriptorSetTotalLength Panjang total kumpulan deskriptor
0x02 bMS_VendorCode Nilai bRequest untuk mengambil deskriptor Microsoft lebih lanjut
0x00 bAltEnumCode Perangkat tidak mendukung enumerasi alternatif

Seperti deskripsi WebUSB, Anda harus memilih nilai bRequest untuk digunakan oleh mengontrol transfer yang terkait dengan deskriptor ini. Dalam contoh ini, saya memilih 0x02. 0x07, yang ditempatkan di wIndex, adalah perintah untuk mengambil Microsoft OS 2.0 Kumpulan Deskripsi dari perangkat.

bmRequestType bRequest wValue wIndex wLength Data (respons)
0b11000000 0x02 0x0000 0x0007 * Kumpulan Deskripsi MS OS 2.0

Perangkat USB dapat memiliki beberapa fungsi dan jadi bagian pertama dari deskriptor {i>set <i}menggambarkan {i>function<i} mana yang terkait dengan properti yang mengikutinya. Tujuan contoh di bawah ini mengonfigurasi antarmuka 1 dari perangkat gabungan. Deskriptor memberi OS dua bagian informasi penting tentang antarmuka ini. ID Deskriptor ID memberi tahu Windows bahwa perangkat ini kompatibel dengan WinUSB {i>driver<i}. Fungsi deskriptor properti registry mirip dengan Bagian [Dev_AddReg] dari contoh INF di atas, menetapkan properti registry ke tetapkan GUID antarmuka perangkat pada fungsi ini.

Nilai Kolom Deskripsi
Header set deskriptor Microsoft OS 2.0
0x000A wLength Ukuran deskriptor ini
0x0000 wDescriptorType Deskriptor header kumpulan deskriptor
0x06030000 dwWindowsVersion Versi Windows minimum yang kompatibel (Windows 8.1)
0x00B2 wTotalLength Panjang total kumpulan deskriptor
Header subset konfigurasi Microsoft OS 2.0
0x0008 wLength Ukuran deskriptor ini
0x0001 wDescriptorType Deskripsi header subset konfigurasi.
0x00 bConfigurationValue Berlaku untuk konfigurasi 1 (diindeks dari 0 meskipun konfigurasi biasanya diindeks dari 1)
0x00 bReserved Harus ditetapkan ke 0
0x00A8 wTotalLength Panjang total {i>subset<i} termasuk {i>header<i} ini
Header subset fungsi Microsoft OS 2.0
0x0008 wLength Ukuran deskriptor ini
0x0002 wDescriptorType Deskriptor header subset fungsi
0x01 bFirstInterface Antarmuka pertama fungsi
0x00 bReserved Harus ditetapkan ke 0
0x00A0 wSubsetLength Panjang total {i>subset<i} termasuk {i>header<i} ini
Deskriptor ID yang kompatibel dengan Microsoft OS 2.0
0x0014 wLength Ukuran deskriptor ini
0x0003 wDescriptorType Deskripsi ID yang kompatibel
"WINUSB\0\0" CompatibileID String ASCII ditambahkan hingga 8 byte
"\0\0\0\0\0\0\0\0" SubCompatibleID String ASCII ditambahkan hingga 8 byte
Deskriptor properti registry Microsoft OS 2.0
0x0084 wLength Ukuran deskriptor ini
0x0004 wDescriptorType Deskriptor properti registry
0x0007 wPropertyDataType REG_MULTI_SZ
0x002A wPropertyNameLength Panjang nama properti
"DeviceInterfaceGUIDs\0" PropertyName Nama properti dengan terminator null yang dienkode dalam UTF-16LE
0x0050 wPropertyDataLength Panjang nilai properti
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" PropertyData GUID ditambah dua terminator null yang dienkode dalam UTF-16LE

Windows hanya akan mengkueri perangkat untuk informasi ini sekali. Jika perangkat Anda tidak merespons dengan keterangan yang valid, maka tidak akan bertanya lagi perangkat terhubung. Microsoft telah menyediakan daftar USB Device Registry Entri yang menjelaskan entri registry yang dibuat saat menghitung perangkat. Kapan pengujian, menghapus entri yang dibuat perangkat untuk memaksa Windows mencoba membaca deskriptor lagi.

Untuk mengetahui informasi selengkapnya, lihat postingan blog Microsoft tentang cara menggunakan fitur ini deskripsi.

Contoh

Contoh kode yang menerapkan perangkat berbasis WebUSB yang menyertakan WebUSB dan deskriptor Microsoft OS dapat ditemukan dalam project ini: