WebUSB için cihaz oluşturma

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

Reilly Grant
Reilly Grant

Bu makalede, WebUSB API'den tam olarak yararlanmak için nasıl cihaz oluşturulacağı açıklanmaktadır. API'nin kendisi hakkında kısa bir tanıtım için Web'deki USB Cihazlara Erişim bölümünü inceleyin.

Arka plan

Evrensel Seri Yol (USB), çevre birimlerini masaüstü ve mobil bilgi işlem cihazlarına bağlamak için kullanılan en yaygın fiziksel arayüz haline gelmiştir. USB özellikleri, bir otobüsün elektriksel özelliklerini ve bir cihazla iletişim için genel bir modeli tanımlamanın yanı sıra bir dizi cihaz sınıfı spesifikasyonu da içerir. Bunlar, cihaz üreticilerinin uygulayabileceği depolama, ses, video, ağ iletişimi gibi belirli cihaz sınıflarına yönelik genel modellerdir. Bu cihaz sınıfı özelliklerinin avantajı, işletim sistemi tedarikçisinin sınıf spesifikasyonuna göre tek bir sürücü uygulayabilmesi ("sınıf sürücüsü") ve bu sınıfı uygulayan tüm cihazların desteklenmesidir. Bu, kendi cihaz sürücülerini yazması gereken her üreticiye göre büyük bir gelişmeydi.

Ancak bazı cihazlar bu standartlaştırılmış cihaz sınıflarından birine dahil değildir. Bunun yerine bir üretici, cihazını tedarikçiye özel sınıfı uyguluyor olarak etiketlemeyi tercih edebilir. Bu durumda işletim sistemi, tedarikçinin sürücü paketinde sağlanan bilgilere (genellikle tedarikçi firmaya özel belirli bir protokol uyguladığı bilinen bir dizi tedarikçi firma ve ürün kimliği) dayanarak hangi cihaz sürücüsünün yükleneceğini seçer.

USB'nin bir başka özelliği de bağlı oldukları ana makineye birden çok arayüz sunabilmesidir. Her arayüz standart bir sınıf uygulayabilir veya sağlayıcıya özel olabilir. Bir işletim sistemi cihazı işlemek için doğru sürücüleri seçtiğinde her bir arayüz farklı bir sürücü tarafından talep edilebilir. Örneğin, bir USB web kamerası genellikle biri USB video sınıfını uygulayan (kamera için) diğeri de USB ses sınıfını uygulayan (mikrofon için) iki arayüz sağlar. İşletim sistemi tek bir "web kamerası sürücüsü" yüklemez. Bunun yerine, cihazın farklı 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ğuna karşılık gelen web API'leri vardır. Örneğin, bir sayfa getUserMedia() kullanarak video sınıfı cihazından video yakalayabilir ya da KeyboardEvents veya PointerEvents dinleyerek ya da Gamepad veya WebHID API kullanarak insan arayüz (HID) sınıf cihazından giriş etkinlikleri alabilir. Tüm cihazlarda standartlaştırılmış bir sınıf tanımı uygulanmadığı gibi tüm cihazlarda da mevcut web platformu API'lerine karşılık gelen özellikler uygulanmayabilir. Böyle bir durumda WebUSB API, sitelerin satıcıya özel bir arayüz talep etmesi ve doğrudan kendi sayfalarından bunun için destek uygulaması için bir yol sağlayarak bu boşluğu doldurabilir.

Bir cihazın WebUSB üzerinden erişilebilir olması için gerekli şartlar, işletim sistemlerinin USB cihazları yönetme biçimindeki farklılıklar nedeniyle platformdan platforma biraz farklılık gösterir. Ancak temel gereksinim, cihazda, sayfanın kontrol etmek istediği arayüzü talep eden bir sürücü bulunmamasıdır. Bu, işletim sistemi satıcısı tarafından sağlanan genel bir sınıf sürücüsü veya tedarikçi firma tarafından sağlanan bir cihaz sürücüsü olabilir. USB cihazları, her biri kendi sürücüsüne sahip olabilen birden çok arayüz sağlayabildiğinden, bazı arayüzleri bir sürücünün talep ettiği, diğerlerinin ise tarayıcı tarafından erişilebilir olduğu bir cihaz oluşturmak mümkündür.

Örneğin, ileri teknoloji bir USB klavye, işletim sisteminin giriş alt sistemi tarafından talep edilecek HID sınıfı bir arayüz ve bir yapılandırma aracı tarafından kullanılmak üzere WebUSB'de kalmaya devam eden satıcıya özel bir arayüz sağlayabilir. Bu araç üreticinin web sitesinde yayınlanabilir. Bu sayede kullanıcı, platforma özel herhangi bir yazılım yüklemeden cihazın makro tuşlar ve ışık efektleri gibi çalışma özelliklerini değiştirebilir. Böyle 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 açıklayıcısı
0x09 bLength Bu açıklayıcının boyutu
0x02 bDescriptorType Yapılandırma açıklayıcısı
0x0039 wTotalLength Bu tanımlayıcı dizisinin toplam uzunluğu
0x02 bNumInterfaces Arayüz sayısı
0x01 bConfigurationValue Yapılandırma 1
0x00 iConfiguration Yapılandırma adı (yok)
0b1010000 bmAttributes Uzaktan uyandırma özelliğine sahip kendi kendine çalışan cihaz
0x32 bMaxPower Maksimum Güç, 2 mA'lık artışlarla ifade edilir
Arayüz açıklayıcısı
0x09 bLength Bu açıklayıcının boyutu
0x04 bDescriptorType Arayüz açıklayı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 açıklayıcı
0x09 bLength Bu açıklayıcının boyutu
0x21 bDescriptorType HID açıklayıcı
0x0101 bcdHID HID 1.1 sürümü
0x00 bCountryCode Donanım hedef ülkesi
0x01 bNumDescriptors Takip edilecek HID sınıfı açıklayıcı sayısı
0x22 bDescriptorType Rapor açıklayıcı türü
0x003F wDescriptorLength Rapor açıklayıcının toplam uzunluğu
Uç nokta açıklayıcı
0x07 bLength Bu açıklayıcının boyutu
0x05 bDescriptorType Uç nokta açıklayıcı
0b10000001 bEndpointAddress Uç nokta 1 (Hindistan)
0b00000011 bmAttributes Kesinti
0x0008 wMaxPacketSize 8 baytlık paketler
0x0A bInterval 10 ms aralık
Arayüz açıklayıcısı
0x09 bLength Bu açıklayıcının boyutu
0x04 bDescriptorType Arayüz açıklayıcısı
0x01 bInterfaceNumber Arayüz 1
0x00 bAlternateSetting Alternatif ayar 0 (varsayılan)
0x02 bNumEndpoints 2 uç nokta
0xFF bInterfaceClass Tedarikçi firmaya özel arayüz sınıfı
0x00 bInterfaceSubClass
0x00 bInterfaceProtocol
0x00 iInterface Arayüz adı (yok)
Uç nokta açıklayıcı
0x07 bLength Bu açıklayıcının boyutu
0x05 bDescriptorType Uç nokta açıklayıcı
0b10000010 bEndpointAddress Uç nokta 1 (Hindistan)
0b00000010 bmAttributes Toplu
0x0040 wMaxPacketSize 64 baytlık paketler
0x00 bInterval Toplu uç noktalar için kullanılamaz
Uç nokta açıklayıcı
0x07 bLength Bu açıklayıcının boyutu
0x05 bDescriptorType Uç nokta açıklayıcı
0b00000011 bEndpointAddress Uç nokta 3 (OUT)
0b00000010 bmAttributes Toplu
0x0040 wMaxPacketSize 64 baytlık paketler
0x00 bInterval Toplu uç noktalar için kullanılamaz

Yapılandırma açıklayıcısı, birleştirilen birden çok tanımlayıcıdan oluşur. Her biri, tanımlanabilmesi için bLength ve bDescriptorType alanlarıyla başlar. İlk arayüz, ilişkili bir HID tanımlayıcısına ve giriş etkinliklerini işletim sistemine 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 buna karşılık yanıt almak için kullanılabilen 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ışabilse de, cihazın WebUSB desteğini belirten belirli tanımlayıcılarla işaretlenmesiyle ek işlevler etkinleştirilir. Örneğin, cihazınız takılı olduğunda 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'da kullanıma sunulan bir kavramdır ancak 2.1 sürümünün bir parçası olarak USB 2.0 cihazlara da geri getirilmiştir. WebUSB desteğinin bildirilmesi, BOS tanımlayıcısına aşağıdaki Platform Yeteneği Tanımlayıcısının eklenmesiyle başlar:

Değer Alan Açıklama
İkili cihaz Nesne Deposu tanımlayıcısı
0x05 bLength Bu açıklayı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'teki cihaz özelliği tanımlayıcılarının sayısı
WebUSB platform özelliği açıklayıcısı
0x18 bLength Bu açıklayıcının boyutu
0x10 bDescriptorType Cihaz özellikleri açıklayıcısı
0x05 bDevCapabilityType Platform özelliği açıklayıcısı
0x00 bReserved
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} PlatformCapablityUUID Small-endian biçimindeki WebUSB platform özelliği açıklayıcısı GUID
0x0100 bcdVersion WebUSB açıklayı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, bunu cihaz hakkında temel bilgiler sağlayan WebUSB Platform Özelliği açıklayıcısı olarak tanımlar. Tarayıcı, cihazla ilgili daha fazla bilgi getirebilmek için bVendorCode değerini kullanarak cihaza ek istekler gönderir. Şu anda belirtilen tek istek, URL açıklayıcı döndüren GET_URL isteğidir. Bunlar dize tanımlayıcılara benzer, ancak URL'leri en az bayt olarak kodlayacak şekilde tasarlanmıştır. "https://google.com" için URL açıklayıcısı şöyle görünür:

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

Cihazınız ilk kez fişe takıldığında, tarayıcı şu standart GET_DESCRIPTOR kontrol aktarımını yayınlayarak BOS açıklayıcısını okur:

bmRequestType bRequest wValue wIndex wLength Veri (yanıt)
0b10000000 0x06 0x0F00 0x0000 * BOS açıklayıcısı

Bu istek genellikle iki kez yapılır. İlkinde ana makinenin büyük bir aktarım yapmadan wTotalLength alanının değerini öğrenmesi için ilk kez yeterince büyük bir wLength ile yapılır. Daha sonra da tam açıklayıcı uzunluğu bilindiğinde istek yapılır.

WebUSB Platform Capability açıklayıcısı, iLandingPage alanı sıfır dışında bir değere ayarlanırsa tarayıcı, bRequest öğesi platform özelliği tanımlayıcıdan bVendorCode değerine ve wValue değeri iLandingPage değerine ayarlanmış şekilde bir kontrol aktarımı yayınlayarak WebUSB'ye özel bir GET_URL isteği gerçekleştirir. GET_URL (0x02) için istek kodu wIndex olur:

bmRequestType bRequest wValue wIndex wLength Veri (yanıt)
0b11000000 0x01 0x0001 0x0002 * URL açıklayıcısı

Yine, ilk olarak okunan tanımlayıcının uzunluğunu kontrol etmek için bu istek iki kez gönderilebilir.

Platforma özgü konular

WebUSB API, USB cihazlarına erişmek için tutarlı bir arayüz sağlamaya çalışsa da geliştiriciler, cihazlara erişmek için web tarayıcısı gereksinimleri gibi uygulamalara uygulanan şartların farkında olmalıdırlar.

macOS

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

Linux

Linux, macOS'e benzer. Ancak varsayılan olarak çoğu dağıtım, USB cihazlarını açma izniyle kullanıcı hesabı oluşturmaz. Udev adlı sistem arka plan programı, bir cihaza erişmesine izin verilen kullanıcı ve grubu atamaktan sorumludur. Bunun gibi bir kural, belirtilen tedarikçi firma ve ürün kimlikleri ile 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 yerine cihazınızın onaltılı tedarikçi firma ve ürün kimliklerini yazın. Örneğin ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11", bir Nexus One telefonla eşleşir. Bunlar, her zamanki "0x" ön eki olmadan yazılmalı ve doğru şekilde tanınması için hepsi küçük harfle yazılmalıdır. Cihazınızın kimliklerini bulmak için lsusb komut satırı aracını çalıştırın.

Bu kural, /etc/udev/rules.d dizinindeki bir dosyaya yerleştirilmelidir ve cihaz fişe takıldığında geçerli olur. Udev'i yeniden başlatmanıza gerek yoktur.

Android

Android platformu Linux tabanlıdır ancak sistem yapılandırmasında herhangi bir değişiklik yapılması gerekmez. Varsayılan olarak, işletim sisteminde 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şacaklarını bilmelidir. Kullanıcı requestDevice() çağrısına yanıt olarak bir cihaz seçtiğinde Android, Chrome'un bu cihaza erişmesine izin verip vermeyeceğinizi soran bir istem görüntüler. Bu istem, bir kullanıcı 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'tan daha fazla cihaza erişilebilir. Örneğin, Android SDK'da seri cihazlarla iletişim kurmak için bir API bulunmadığından, genellikle USB-seri adaptörler tarafından uygulanan USB CDC-ACM sınıfı dikkate değer bir eksikliktir.

ChromeOS

ChromeOS, Linux'a da dayanır ve sistem yapılandırmasında herhangi bir değişiklik gerektirmez. allow_broker hizmeti USB cihazlarına erişimi kontrol eder ve sahiplenilmemiş en az bir arayüz olduğu sürece tarayıcının bu cihazlara erişmesine izin verir.

Windows

Windows sürücü modelinde ek bir gereklilik bulunuyor. USB cihazı, kullanıcı uygulamasından açabilme olanağının üzerindeki platformlardan farklı olarak, sürücü yüklü olmasa bile varsayılan seçenek bu değildir. Bunun yerine, cihaza erişmek üzere kullanılan arayüz uygulamalarının sağlanması amacıyla, WinUSB adlı özel bir sürücünün yüklenmesi gerekir. Bu işlem, sistemde yüklü bir özel sürücü bilgileri dosyası (INF) ile veya numaralandırma sırasında Microsoft OS Uyumluluk Açıklayıcılarını sağlamak için cihazın donanım yazılımı değiştirilerek yapılabilir.

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

Sürücü bilgi dosyası, Windows'a bir cihazla ilk kez karşılaştığında ne yapılacağını bildirir. Kullanıcının sistemi zaten WinUSB sürücüsünü içerdiğinden, INF dosyasının tedarikçi firmanızı ve ürün kimliğinizi bu yeni yükleme kuralıyla ilişkilendirmesi için tek gereken yeterlidir. Aşağıdaki dosya temel bir örnektir. .inf uzantısına sahip bir dosyaya kaydedin, "X" ile işaretli bölümleri değiştirin, ardından sağ tıklayın ve içerik 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ın DeviceInterfaceGUID grubunu yapılandırır. Bir uygulamanın Windows API aracılığıyla kendisini bulması ve ona bağlanması için her cihaz arayüzünün bir GUID'si olmalıdır. Rastgele bir GUID oluşturmak için New-Guid PowerShell cmdlet'ini veya online bir aracı kullanın.

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

Microsoft OS uyumluluğu açıklayıcıları

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

WebUSB açıklayıcılarını ayarladıktan sonra, Microsoft'un işletim sistemi uyumluluk tanımlayıcılarını da kolayca ekleyebilirsiniz. Öncelikle BOS açıklayıcısını bu ek platform özelliği açıklayıcıyla genişletin. wTotalLength ve bNumDeviceCaps öğelerini buna göre güncellediğinizden emin olun.

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

WebUSB açıklayı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 değerini seçtim. wIndex içine yerleştirilen 0x07, cihazdan Microsoft OS 2.0 Açıklayıcı Grubu'nu alma komutudur.

bmRequestType bRequest wValue wIndex wLength Veri (yanıt)
0b11000000 0x02 0x0000 0x0007 * MS OS 2.0 Tanımlayıcı Grubu

Bir USB cihazının birden çok işlevi olabilir. Bu nedenle, açıklayıcı grubunun ilk bölümünde, sonraki özelliklerin hangi işlevle ilişkili olduğu açıklanır. Aşağıdaki örnekte, birleşik bir cihazın 1. arayüzü yapılandırılır. Açıklayı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 özelliği açıklayıcısı, yukarıdaki INF örneğinin [Dev_AddReg] bölümüne benzer şekilde çalışır ve bu işleve cihaz arayüzü GUID'si atayacak bir kayıt defteri özelliği ayarlar.

Değer Alan Açıklama
Microsoft OS 2.0 açıklayıcı kümesi başlığı
0x000A wLength Bu açıklayıcının boyutu
0x0000 wDescriptorType Açıklayıcı grubu üst bilgi açıklayıcı
0x06030000 dwWindowsVersion Minimum uyumlu Windows sürümü (Windows 8.1)
0x00B2 wTotalLength Açıklayıcı grubunun toplam uzunluğu
Microsoft OS 2.0 yapılandırması alt kümesi başlığı
0x0008 wLength Bu açıklayıcının boyutu
0x0001 wDescriptorType Yapılandırma alt kümesi başlığı açıklaması
0x00 bConfigurationValue 1. yapılandırmaya uygulanır (normalde 1'den dizine eklenen yapılandırmalara rağmen 0'dan dizine eklenir)
0x00 bReserved 0 olarak ayarlanmalıdır
0x00A8 wTotalLength Bu başlık da dahil olmak üzere alt grubun toplam uzunluğu
Microsoft OS 2.0 işlev alt kümesi başlığı
0x0008 wLength Bu açıklayıcının boyutu
0x0002 wDescriptorType İşlev alt kümesi başlığı açıklayıcısı
0x01 bFirstInterface İşlevin ilk arayüzü
0x00 bReserved 0 olarak ayarlanmalıdır
0x00A0 wSubsetLength Bu başlık da dahil olmak üzere alt grubun toplam uzunluğu
Microsoft OS 2.0 uyumlu kimlik açıklayıcı
0x0014 wLength Bu açıklayıcının boyutu
0x0003 wDescriptorType Uyumlu kimlik açıklayıcı
"WINUSB\0\0" CompatibileID 8 bayta kadar dolgulu ASCII dizesi
"\0\0\0\0\0\0\0\0" SubCompatibleID 8 bayta kadar dolgulu ASCII dizesi
Microsoft OS 2.0 kayıt defteri özelliği açıklayıcısı
0x0084 wLength Bu açıklayıcının boyutu
0x0004 wDescriptorType Kayıt defteri özelliği açıklayıcısı
0x0007 wPropertyDataType REG_MULTI_SZ
0x002A wPropertyNameLength Mülk adının uzunluğu
"DeviceInterfaceGUIDs\0" PropertyName UTF-16LE olarak kodlanmış boş sonlandırıcıya sahip 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 boş sonlandırıcı

Windows, bu bilgi için cihazı yalnızca bir kez sorgular. Cihaz geçerli tanımlayıcılarla yanıt vermezse cihaz tekrar bağlandığında tekrar sorulmaz. Microsoft, bir cihazı numaralandırırken oluşturulan kayıt defteri girişlerini açıklayan bir USB Cihaz Kaydı Girişleri listesini sağlamıştır. Test sırasında bir cihaz için oluşturulan girişleri silin. Böylece Windows, tanımlayıcıları tekrar okumayı dener.

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 OS tanımlayıcıları içeren WebUSB uyumlu cihazları uygulayan örnek kodlar şu projelerde bulunabilir: