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.
İ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: