WebUSB için cihaz oluşturma

WebUSB API'den tam olarak yararlanmak için bir cihaz oluşturun.

Bu makalede, WebUSB API'den tam olarak yararlanmak için nasıl cihaz oluşturulacağı açıklanmaktadır. API'nin kısa bir tanıtımı için Web'de USB Cihazlarına Erişim başlıklı makaleyi inceleyin.

Arka plan

Universal Serial Bus (USB), çevre birimlerini masaüstü ve mobil bilgisayar cihazlarına bağlamak için en yaygın fiziksel arayüz haline geldi. USB spesifikasyonları, veri yolunun elektriksel özelliklerini ve bir cihazla iletişim kurmak için genel bir modeli tanımlamanın yanı sıra bir dizi cihaz sınıfı spesifikasyonu içerir. Bunlar, cihaz üreticilerinin uygulayabileceği depolama, ses, video, ağ vb. belirli cihaz sınıfları için genel modellerdir. Bu cihaz sınıfı özelliklerinin avantajı, işletim sistemi tedarikçisinin sınıf spesifikasyonuna dayalı tek bir sürücü ("sınıf sürücüsü") uygulayabilmesi ve bu sınıfı uygulayan tüm cihazların desteklenmesidir. Bu, her üreticinin kendi cihaz sürücülerini yazması gerekmesine kıyasla büyük bir gelişmeydi.

Ancak bazı cihazlar bu standartlaştırılmış cihaz sınıflarından birine uymaz. Bunun yerine üretici, cihazını tedarikçiye özel sınıfı uygulayan olarak etiketlemeyi tercih edebilir. Bu durumda işletim sistemi, tedarikçi firmanın sürücü paketinde sağlanan bilgilere göre hangi cihaz sürücüsünün yükleneceğini seçer. Bu bilgiler genellikle, belirli bir tedarikçiye özgü protokolü uyguladığı bilinen bir dizi tedarikçi firma ve ürün kimliğidir.

USB'nin bir diğer özelliği de cihazların bağlı oldukları ana makineye birden fazla arayüz sağlayabilmesidir. Her arayüz standart bir sınıf uygulayabilir veya tedarikçiye özel olabilir. Bir işletim sistemi, cihazı yönetmek için doğru sürücüleri seçtiğinde her arayüz için farklı bir sürücü hak talebinde bulunabilir. Örneğin, bir USB web kamerası genellikle biri USB video sınıfını (kamera için) diğeri USB ses sınıfını (mikrofon için) uygulayan iki arayüz sağlar. İşletim sistemi tek bir "web kamerası sürücüsü" yüklemez. Bunun yerine, cihazın ayrı işlevlerinden sorumlu olan bağımsız video ve ses sınıfı sürücüleri yükler. Arayüz sınıflarının bu bileşimi daha fazla esneklik sağlar.

API temel bilgileri

Standart USB sınıflarının çoğu, ilgili web API'lerine sahiptir. Örneğin, bir sayfa getUserMedia() kullanarak video sınıfı bir cihazdan video yakalayabilir veya KeyboardEvents ya da PointerEvents'i dinleyerek ya da Gamepad'i ya da WebHID API'yi kullanarak insan arayüzü (HID) sınıfı bir cihazdan giriş etkinlikleri alabilir. Tüm cihazlar standartlaştırılmış bir sınıf tanımı uygulamadığı gibi, tüm cihazlar mevcut web platformu API'lerine karşılık gelen özellikleri de uygulamaz. Bu durumda WebUSB API, sitelerin tedarikçiye özel bir arayüz için hak talebinde bulunmasına ve doğrudan kendi sayfalarından bu arayüz için destek uygulamasına olanak tanıyarak bu boşluğu doldurabilir.

Bir cihazın WebUSB üzerinden erişilebilir olması için gereken belirli koşullar, işletim sistemlerinin USB cihazları yönetme biçimindeki farklılıklar nedeniyle platformdan platforma biraz farklılık gösterir. Ancak temel koşul, cihazda sayfanın kontrol etmek istediği arayüzü talep eden bir sürücü olmamasıdır. Bu, işletim sistemi tedarikçisi tarafından sağlanan genel sınıf sürücüsü veya tedarikçi firma tarafından sağlanan cihaz sürücüsü olabilir. USB cihazlar, her biri kendi sürücüsüne sahip olabilecek birden fazla arayüz sağlayabileceğinden, bazı arayüzlerin bir sürücü tarafından talep edildiği ve diğerlerinin tarayıcıya erişilebilir bırakıldığı bir cihaz oluşturmak mümkündür.

Örneğin, üst düzey bir USB klavye, işletim sisteminin giriş alt sistemi tarafından talep edilecek bir HID sınıfı arayüzü ve bir yapılandırma aracı tarafından kullanılması için WebUSB'nin erişimine açık kalan tedarikçiye özgü bir arayüz sağlayabilir. Bu araç, üreticinin web sitesinde sunulabilir. Böylece kullanıcı, platforma özgü bir yazılım yüklemeden cihazın davranışıyla ilgili makro tuşlar ve ışık efektleri gibi özellikleri değiştirebilir. Bu tür bir cihazın yapılandırma tanımlayıcısı aşağıdaki gibi görünür:

Değer Alan Açıklama
Yapılandırma tanımlayıcısı
0x09 bLength Bu tanımlayıcının boyutu
0x02 bDescriptorType Yapılandırma tanımlayıcısı
0x0039 wTotalLength Bu tanımlayıcı dizisinin toplam uzunluğu
0x02 bNumInterfaces Arayüz sayısı
0x01 bConfigurationValue 1. yapılandırma
0x00 iConfiguration Yapılandırma adı (yok)
0b1010000 bmAttributes Uzaktan uyandırma özelliğine sahip kendinden güç alan cihaz
0x32 bMaxPower Maksimum güç, 2 mA artışlarla ifade edilir.
Arayüz tanımlayıcısı
0x09 bLength Bu tanımlayıcının boyutu
0x04 bDescriptorType Arayüz tanımlayıcısı
0x00 bInterfaceNumber Arayüz 0
0x00 bAlternateSetting Alternatif ayar 0 (varsayılan)
0x01 bNumEndpoints 1 uç nokta
0x03 bInterfaceClass HID arayüz sınıfı
0x01 bInterfaceSubClass Önyükleme arayüzü alt sınıfı
0x01 bInterfaceProtocol Klavye
0x00 iInterface Arayüz adı (yok)
HID tanımlayıcısı
0x09 bLength Bu tanımlayıcının boyutu
0x21 bDescriptorType HID tanımlayıcısı
0x0101 bcdHID HID 1.1 sürümü
0x00 bCountryCode Donanım hedef ülkesi
0x01 bNumDescriptors Takip edilecek HID sınıf tanımlayıcılarının sayısı
0x22 bDescriptorType Rapor tanımlayıcı türü
0x003F wDescriptorLength Rapor tanımlayıcının toplam uzunluğu
Uç nokta tanımlayıcısı
0x07 bLength Bu tanımlayıcının boyutu
0x05 bDescriptorType Uç nokta tanımlayıcısı
0b10000001 bEndpointAddress 1. uç nokta (IN)
0b00000011 bmAttributes Araya gir
0x0008 wMaxPacketSize 8 baytlık paketler
0x0A bInterval 10 ms aralık
Arayüz tanımlayıcısı
0x09 bLength Bu tanımlayıcının boyutu
0x04 bDescriptorType Arayüz tanımlayıcısı
0x01 bInterfaceNumber Arayüz 1
0x00 bAlternateSetting Alternatif ayar 0 (varsayılan)
0x02 bNumEndpoints 2 uç nokta
0xFF bInterfaceClass Tedarikçi firmaya özgü arayüz sınıfı
0x00 bInterfaceSubClass
0x00 bInterfaceProtocol
0x00 iInterface Arayüz adı (yok)
Uç nokta tanımlayıcısı
0x07 bLength Bu tanımlayıcının boyutu
0x05 bDescriptorType Uç nokta tanımlayıcısı
0b10000010 bEndpointAddress 1. uç nokta (IN)
0b00000010 bmAttributes Toplu
0x0040 wMaxPacketSize 64 baytlık paketler
0x00 bInterval Toplu uç noktalar için geçerli değildir.
Uç nokta tanımlayıcısı
0x07 bLength Bu tanımlayıcının boyutu
0x05 bDescriptorType Uç nokta tanımlayıcısı
0b00000011 bEndpointAddress 3. uç nokta (OUT)
0b00000010 bmAttributes Toplu
0x0040 wMaxPacketSize 64 baytlık paketler
0x00 bInterval Toplu uç noktalar için geçerli değildir.

Yapılandırma tanımlayıcısı, birbirine bağlanmış birden fazla tanımlayıcıdan oluşur. Her biri, tanımlanabilmeleri için bLength ve bDescriptorType alanlarıyla başlar. İlk arayüz, ilişkili bir HID tanımlayıcısı ve işletim sistemine giriş etkinlikleri yayınlamak için kullanılan tek bir uç noktaya sahip bir HID arayüzüdür. İkinci arayüz, cihaza komut göndermek ve yanıt almak için kullanılabilecek iki uç noktaya sahip, tedarikçi firmaya özel bir arayüzdür.

WebUSB tanımlayıcılar

WebUSB, donanım yazılımı değişiklikleri olmadan birçok cihazla çalışabilir. Ancak cihaz, WebUSB desteğini belirten belirli tanımlayıcılarla işaretlenerek ek işlevler etkinleştirilir. Örneğin, cihazınız prize takılıyken tarayıcının kullanıcıyı yönlendirebileceği bir açılış sayfası URL'si belirtebilirsiniz.

Chrome'daki WebUSB bildiriminin ekran görüntüsü
WebUSB bildirimi.

İkili cihaz nesne deposu (BOS), USB 3.0'ta kullanıma sunulan ancak 2.1 sürümü kapsamında USB 2.0 cihazlara da geriye dönük olarak uygulanan bir kavramdır. WebUSB desteğini beyan etmek, BOS tanımlayıcısı içine aşağıdaki Platform Yeteneği Tanımlayıcısının eklenmesi ile başlar:

Değer Alan Açıklama
İkili cihaz nesne deposu tanımlayıcısı
0x05 bLength Bu tanımlayıcının boyutu
0x0F bDescriptorType İkili cihaz nesne deposu tanımlayıcısı
0x001D wTotalLength Bu tanımlayıcı dizisinin toplam uzunluğu
0x01 bNumDeviceCaps BOS'taki cihaz özelliği tanımlayıcıların sayısı
WebUSB platform özelliği tanımlayıcısı
0x18 bLength Bu tanımlayıcının boyutu
0x10 bDescriptorType Cihaz işlevi tanımlayıcısı
0x05 bDevCapabilityType Platform özelliği tanımlayıcısı
0x00 bReserved
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} PlatformCapablityUUID Küçük endian biçiminde WebUSB platform özelliği tanımlayıcısı GUID'si
0x0100 bcdVersion WebUSB tanımlayıcı sürümü 1.0
0x01 bVendorCode WebUSB için bRequest değeri
0x01 iLandingPage Açılış sayfası URL'si

Platform özelliği UUID'si, bunu cihazla ilgili temel bilgiler sağlayan bir WebUSB Platform Özelliği tanımlayıcısı olarak tanımlar. Tarayıcı, cihaz hakkında daha fazla bilgi almak için cihaza ek istek göndermek üzere bVendorCode değerini kullanır. Şu anda belirtilen tek istek, URL tanımlayıcısı döndüren GET_URL isteğidir. Bunlar dize tanımlayıcılarına benzer ancak URL'leri en az baytla kodlayacak şekilde tasarlanmıştır. "https://google.com" için URL tanımlayıcısı şöyle görünür:

Değer Alan Açıklama
URL tanımlayıcısı
0x0D bLength Bu tanımlayıcının boyutu
0x03 bDescriptorType URL tanımlayıcısı
0x01 bScheme https://
"google.com" URL UTF-8 kodlamalı URL içeriği

Cihazınız ilk kez prize takıldığında tarayıcı, bu standart GET_DESCRIPTOR kontrol aktarımını yayınlayarak BOS tanımlayıcısını okur:

bmRequestType bRequest wValue wIndex wLength Veriler (yanıt)
0b10000000 0x06 0x0F00 0x0000 * BOS tanımlayıcısı

Bu istek genellikle iki kez yapılır. İlk kez, barındırıcının büyük bir aktarım taahhüt etmeden wTotalLength alanının değerini öğrenebilmesi için yeterince büyük bir wLength ile, ardından tam tanımlayıcı uzunluğu bilindiğinde tekrar yapılır.

WebUSB Platform Özelliği tanımlayıcısı iLandingPage alanını sıfır olmayan bir değere ayarlarsa tarayıcı, bRequest'yi platform özelliği tanımlayıcısı bVendorCode değerine ve wValue'yi iLandingPage değerine ayarlayarak bir kontrol aktarımı yayınlayarak WebUSB'ye özgü bir GET_URL isteği gerçekleştirir. GET_URL (0x02) için istek kodu wIndex alanına girilir:

bmRequestType bRequest wValue wIndex wLength Veriler (yanıt)
0b11000000 0x01 0x0001 0x0002 * URL tanımlayıcısı

Yine de bu istek, önce okunan tanımlayıcı uzunluğunu araştırmak için iki kez gönderilebilir.

Platforma özgü hususlar

WebUSB API, USB cihazlara erişmek için tutarlı bir arayüz sağlamaya çalışırken geliştiricilerin, cihazlara erişmek için web tarayıcıları gibi uygulamalara uygulanan şartlardan haberdar olması gerekir.

macOS

macOS için özel bir işlem yapmanız gerekmez. WebUSB kullanan bir web sitesi, cihaza bağlanabilir ve bir çekirdek sürücüsü veya başka bir uygulama tarafından hak talebinde bulunulmayan tüm arayüzler için hak talebinde bulunabilir.

Linux

Linux, macOS'e benzer ancak çoğu dağıtım, varsayılan olarak kullanıcı hesaplarını USB cihazlarını açma izniyle oluşturmaz. Bir cihaza erişmesine izin verilen kullanıcıyı ve grubu atamaktan udev adlı bir sistem hizmet programı sorumludur. Bu tür bir kural, belirli tedarikçi ve ürün kimlikleriyle eşleşen bir cihazın sahipliğini, çevre birimlerine erişimi olan kullanıcılar için ortak bir grup olan plugdev grubuna atar:

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

XXXX değerini, cihazınızın onaltılık tedarikçi ve ürün kimlikleriyle değiştirin. Örneğin, ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11" bir Nexus One telefonuyla eşleşir. Doğru şekilde tanınmaları için bu değerler, normal "0x" ön ekiyle yazılmamalı ve tümüyle küçük harflerle yazılmalıdır. Cihazınızın kimliklerini bulmak için komut satırı aracı lsusb'ü çalıştırın.

Bu kural, /etc/udev/rules.d dizininde bir dosyaya yerleştirilmelidir ve cihaz prize takıldığı anda geçerlilik kazanır. udev'i yeniden başlatmanız gerekmez.

Yapay Zeka

Android platformu Linux'a dayanır ancak sistem yapılandırmasında herhangi bir değişiklik yapılmasını gerektirmez. Varsayılan olarak, işletim sistemine yerleşik sürücü bulunmayan tüm cihazlar tarayıcı tarafından kullanılabilir. Ancak geliştiriciler, kullanıcıların cihaza bağlanırken ek bir adımla karşılaşacağını bilmelidir. Kullanıcı requestDevice() çağrısına yanıt olarak bir cihaz seçtikten sonra Android, Chrome'un bu cihaza erişmesine izin verilip verilmeyeceğini soran bir istem görüntüler. Bu istem, kullanıcı bir cihaza bağlanma izni olan bir web sitesine geri döndüğünde ve web sitesi open()'i çağrdığında da yeniden görünür.

Ayrıca, varsayılan olarak daha az sürücü dahil edildiğinden Android'de masaüstü Linux'a kıyasla daha fazla cihaza erişilebilir. Örneğin, Android SDK'sında seri cihazla iletişim kurmak için API olmadığından, USB'den seri bağdaştırıcılar tarafından yaygın olarak uygulanan USB CDC-ACM sınıfı önemli bir eksikliktir.

ChromeOS

ChromeOS de Linux tabanlı olduğundan sistem yapılandırmasında herhangi bir değişiklik yapılması gerekmez. permission_broker hizmeti, USB cihazlarına erişimi kontrol eder ve hak talebinde bulunulmamış en az bir arayüz olduğu sürece tarayıcıya bu cihazlara erişmesine izin verir.

Windows

Windows sürücü modeli ek bir şart getirir. Yukarıdaki platformların aksine, sürücü yüklü olmasa bile bir USB cihazını kullanıcı uygulamasından açma özelliği varsayılan olarak etkin değildir. Bunun yerine, uygulamaların cihaza erişmek için kullandığı arayüzü sağlamak amacıyla WinUSB adlı özel bir sürücünün yüklenmesi gerekir. Bu işlem, sisteme yüklenen özel bir sürücü bilgi dosyası (INF) ile veya cihaz donanım yazılımını, numaralandırma sırasında Microsoft OS Compatibility Descriptors'ı sağlayacak şekilde değiştirerek yapılabilir.

Sürücü Bilgi Dosyası (INF)

Sürücü bilgileri dosyası, Windows'a bir cihazla ilk kez karşılaştığında ne yapacağını söyler. Kullanıcının sisteminde WinUSB sürücüsü zaten bulunduğundan, INF dosyasının tedarikçiniz ve ürün kimliğinizi bu yeni yükleme kuralıyla ilişkilendirmesi yeterlidir. Aşağıdaki dosya temel bir örnektir. Dosyayı .inf uzantılı bir dosyaya kaydedin, "X" ile işaretlenmiş bölümleri değiştirin, ardından dosyayı sağ tıklayıp bağlam menüsünden "Yükle"yi seçin.

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

[Dev_AddReg] bölümü, cihaz için DeviceInterfaceGUIDs grubunu yapılandırır. Bir uygulamanın Windows API üzerinden cihaz arayüzünü bulup bağlayabilmesi için her cihaz arayüzünde bir GUID bulunmalıdır. Rastgele bir GUID oluşturmak için New-Guid PowerShell cmdlet'ini veya çevrimiçi bir aracı kullanın.

Geliştirme amacıyla Zadig aracı, USB arayüzü için yüklenen sürücüyü WinUSB sürücüsüyle değiştirmek için kolay bir arayüz sağlar.

Microsoft işletim sistemi uyumluluk tanımlayıcıları

Yukarıdaki INF dosyası yaklaşımı, her kullanıcının makinesinin önceden yapılandırılmasını gerektirdiği için zahmetli bir yöntemdir. Windows 8.1 ve sonraki sürümler, özel USB tanımlayıcıları kullanarak alternatif bir yöntem sunar. Bu tanımlayıcı, cihaz ilk kez takıldığında Windows işletim sistemine normalde INF dosyasına dahil edilecek bilgileri sağlar.

WebUSB tanımlayıcılarını ayarladıktan sonra Microsoft'un işletim sistemi uyumluluk tanımlayıcılarını da eklemek kolaydır. Öncelikle BOS tanımlayıcısı bu ek platform özelliği tanımlayıcısı ile genişletilmelidir. Bu durumu hesaba katacak şekilde wTotalLength ve bNumDeviceCaps öğelerini güncellediğinizden emin olun.

Değer Alan Açıklama
Microsoft OS 2.0 platform özelliği tanımlayıcısı
0x1C bLength Bu tanımlayıcının boyutu
0x10 bDescriptorType Cihaz işlevi tanımlayıcısı
0x05 bDevCapabilityType Platform özelliği tanımlayıcısı
0x00 bReserved
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} PlatformCapablityUUID Küçük endian biçiminde Microsoft OS 2.0 platform uyumluluğu tanımlayıcısı GUID'si
0x06030000 dwWindowsVersion Uyumlu minimum Windows sürümü (Windows 8.1)
0x00B2 wMSOSDescriptorSetTotalLength Tanımlayıcı grubunun toplam uzunluğu
0x02 bMS_VendorCode Daha fazla Microsoft tanımlayıcısını almak için bRequest değeri
0x00 bAltEnumCode Cihaz, alternatif numaralandırmayı desteklemiyor

WebUSB tanımlayıcılarında olduğu gibi, bu tanımlayıcılarla ilgili kontrol aktarımlarında kullanılacak bir bRequest değeri seçmeniz gerekir. Bu örnekte 0x02 seçeneğini belirledim. wIndex içine yerleştirilen 0x07, Microsoft OS 2.0 Tanımlayıcı Kümesi'ni cihazdan alma komutudur.

bmRequestType bRequest wValue wIndex wLength Veriler (yanıt)
0b11000000 0x02 0x0000 0x0007 * MS OS 2.0 Tanımlayıcı Kümesi

USB cihazların birden fazla işlevi olabilir. Bu nedenle, tanımlayıcı grubunun ilk kısmı, sonraki özelliklerin hangi işlevle ilişkili olduğunu açıklar. Aşağıdaki örnekte, karma bir cihazın 1. arayüzü yapılandırılmaktadır. Tanımlayıcı, işletim sistemine bu arayüzle ilgili iki önemli bilgi verir. Uyumlu kimlik tanımlayıcısı, Windows'a bu cihazın WinUSB sürücüsüyle uyumlu olduğunu bildirir. Kayıt defteri mülk tanımlayıcısı, yukarıdaki INF örneğindeki [Dev_AddReg] bölümüne benzer şekilde çalışır ve bu işleve bir cihaz arayüzü GUID'si atamak için bir kayıt defteri mülkü ayarlar.

Değer Alan Açıklama
Microsoft OS 2.0 tanımlayıcı grubu başlığı
0x000A wLength Bu tanımlayıcının boyutu
0x0000 wDescriptorType Açıklayıcı grubu başlık açıklayıcısı
0x06030000 dwWindowsVersion Uyumlu minimum Windows sürümü (Windows 8.1)
0x00B2 wTotalLength Tanımlayıcı grubunun toplam uzunluğu
Microsoft OS 2.0 yapılandırma alt kümesi başlığı
0x0008 wLength Bu tanımlayıcının boyutu
0x0001 wDescriptorType Yapılandırma alt kümesi başlığı açıklaması.
0x00 bConfigurationValue 1. yapılandırma için geçerlidir (yapılandırmalar normalde 1'den dizine eklenmesine rağmen 0'dan dizine eklenir)
0x00 bReserved 0 olarak ayarlanmalıdır
0x00A8 wTotalLength Bu başlık dahil olmak üzere alt kümenin toplam uzunluğu
Microsoft OS 2.0 işlev alt kümesi başlığı
0x0008 wLength Bu tanımlayıcının boyutu
0x0002 wDescriptorType İşlev alt kümesi başlık tanımlayıcısı
0x01 bFirstInterface İşlevin ilk arayüzü
0x00 bReserved 0 olarak ayarlanmalıdır
0x00A0 wSubsetLength Bu başlık dahil olmak üzere alt kümenin toplam uzunluğu
Microsoft OS 2.0 uyumlu kimlik tanımlayıcısı
0x0014 wLength Bu tanımlayıcının boyutu
0x0003 wDescriptorType Uyumlu kimlik tanımlayıcısı
"WINUSB\0\0" CompatibileID 8 bayta kadar doldurulmuş ASCII dizesi
"\0\0\0\0\0\0\0\0" SubCompatibleID 8 bayta kadar doldurulmuş ASCII dizesi
Microsoft OS 2.0 kayıt defteri mülk tanımlayıcısı
0x0084 wLength Bu tanımlayıcının boyutu
0x0004 wDescriptorType Kayıt mülkü tanımlayıcısı
0x0007 wPropertyDataType REG_MULTI_SZ
0x002A wPropertyNameLength Tesis adının uzunluğu
"DeviceInterfaceGUIDs\0" PropertyName UTF-16LE olarak kodlanmış null sonlandırıcı içeren mülk adı
0x0050 wPropertyDataLength Özellik değerinin uzunluğu
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" PropertyData GUID ve UTF-16LE olarak kodlanmış iki null sonlandırıcı

Windows, bu bilgiler için cihazı yalnızca bir kez sorgular. Cihaz geçerli tanımlayıcılarla yanıt vermezse cihaz bir sonraki bağlanışında bu soru tekrar sorulmaz. Microsoft, bir cihazı numaralandırırken oluşturulan kayıt defteri girişlerini açıklayan USB Cihaz Kayıt Defteri Girişlerinin listesini sağlamıştır. Test ederken Windows'u tanımlayıcıları tekrar okumaya zorlamak için bir cihaz için oluşturulan girişleri silin.

Daha fazla bilgi için Microsoft'un bu tanımlayıcıların nasıl kullanılacağıyla ilgili blog yayınına göz atın.

Örnekler

Hem WebUSB tanımlayıcıları hem de Microsoft işletim sistemi tanımlayıcıları içeren WebUSB uyumlu cihazları uygulayan örnek kodu şu projelerde bulabilirsiniz: