בנה מכשיר כדי לנצל את מלוא היתרונות של WebUSB API.
במאמר הזה נסביר איך לבנות מכשיר כדי להפיק את המקסימום מ-WebUSB API. להצגת מבוא קצר על ה-API עצמו, ראו גישה להתקני USB באינטרנט.
רקע
האפיק הטורי האוניברסלי (USB) הפך לממשק הפיזי הנפוץ ביותר לחיבור ציוד היקפי למחשב ולמכשירים ניידים. בנוסף להגדרת המאפיינים החשמליים של האוטובוס ומודל כללי לתקשורת עם מכשיר, מפרטי ה-USB כוללים מפרטים של סיווג מכשיר. אלו מודלים כלליים לסוגים מסוימים של מכשירים, כמו אחסון, אודיו, וידאו, רשתות וכו', שיצרני מכשירים יכולים להטמיע. היתרון של מפרטים אלה של סיווג מכשיר הוא שספק של מערכת הפעלה יכול להטמיע מנהל התקן יחיד על סמך מפרט המחלקה ("מנהל התקן של מחלקה") ולכל מכשיר שמטמיע את המחלקה הזו. זה היה שיפור משמעותי לעומת כל יצרן שהיה צריך לכתוב מנהלי התקן משלו.
עם זאת, חלק מהמכשירים לא מתאימים לאחת מסיווגי המכשירים הסטנדרטיים האלה. במקום זאת, היצרן יכול לבחור לתייג את המכשיר שלו ככזה שמטמיע את המחלקה הספציפית לספק. במקרה כזה, מערכת ההפעלה בוחרת את מנהל ההתקן של המכשיר לטעינה על סמך מידע שמסופק בחבילת מנהלי ההתקנים של הספק, בדרך כלל קבוצה של מזהי ספק ומזהי מוצר שידועים כיישום של פרוטוקול ספציפי לספק.
תכונה נוספת של ה-USB היא שהמכשירים עשויים לספק מספר ממשקים למארח שאליו הם מחוברים. בכל ממשק אפשר להטמיע מחלקה סטנדרטית או מחלקה ספציפית לספק. כשמערכת הפעלה בוחרת את מנהלי ההתקנים המתאימים לטיפול במכשיר, מנהל התקן אחר יכול לתבוע בעלות על כל ממשק. לדוגמה, למצלמת USB יש בדרך כלל שני ממשקים, אחד שמטמיע את סיווג הווידאו ב-USB (למצלמה) והשני מטמיע את סיווג האודיו ב-USB (למיקרופון). מערכת ההפעלה לא טוענת "מנהל התקן של מצלמת אינטרנט" אחד, אלא טוענת מנהלי התקנים עצמאיים של וידאו ואודיו, אשר לוקחים אחריות על הפונקציות הנפרדות של המכשיר. ההרכב הזה של מחלקות הממשק מספק גמישות רבה יותר.
יסודות ה-API
לרבים מסיווגי ה-USB הרגילים יש ממשקי API תואמים באינטרנט. לדוגמה,
דף יכול לצלם וידאו ממכשיר של כיתת וידאו באמצעות getUserMedia()
או לקבל אירועי קלט ממכשיר כיתתי עם ממשק אנושי (HID), על ידי האזנה
ל-KeyboardEvents או ל-PointerEvents, או באמצעות Gamepad או
WebHID API.
בדיוק כמו שלא כל המכשירים מטמיעים הגדרת מחלקה סטנדרטית, לא כל המכשירים מטמיעים תכונות שמתאימות לממשקי ה-API הקיימים של פלטפורמת האינטרנט. במקרים כאלה, ה-WebUSB API יכול למלא את הפער הזה על ידי מתן דרך לאתרים לבקש ממשק ספציפי לספק וליישם תמיכה ישירות בדף שלהם.
הדרישות הספציפיות לנגישות באמצעות WebUSB משתנות מעט מפלטפורמה לפלטפורמה, בגלל הבדלים באופן שבו מערכות ההפעלה מנהלות התקני USB. עם זאת, הדרישה הבסיסית היא שלמכשיר לא יהיה עדיין מנהל התקן שמצהיר בעלות על הממשק שהדף רוצה לשלוט בו. הוא יכול להיות מנהל התקן מחלקה כללי שסופק על ידי ספק מערכת ההפעלה, או מנהל התקן של מכשיר שסופק על ידי הספק. התקני USB יכולים לספק מספר ממשקים, ולכל אחד מהם יכול להיות מנהל התקן משלו, לכן אפשר לפתח מכשיר שבו מנהל התקן טוען שחלק מהממשקים יכולים להיות נגישים לו, ואילו ממשקים אחרים נשארים נגישים לדפדפן.
לדוגמה, מקלדת USB מתקדמת עשויה לספק ממשק ברמת HID שייטען על ידי מערכת המשנה לקליטת נתונים של מערכת ההפעלה, וממשק ספציפי לספק שנשאר זמין ל-WebUSB לשימוש על ידי כלי תצורה. אפשר להשתמש בכלי הזה באתר של היצרן, כדי לאפשר למשתמש לשנות היבטים של התנהגות המכשיר, כמו מקשי מאקרו ואפקטים של תאורה, בלי להתקין תוכנה ספציפית לפלטפורמה. מתאר ההגדרות האישיות של המכשיר ייראה בערך כך:
תמורה לכסף | שדה | תיאור |
---|---|---|
תיאור ההגדרה | ||
0x09 |
bLength | גודל מתאר זה |
0x02 |
bDescriptorType | תיאור ההגדרה |
0x0039 |
wTotalLength | האורך הכולל של סדרת התיאורים האלה |
0x02 |
bNumInterfaces | מספר הממשקים |
0x01 |
bConfigurationValue | תצורה 1 |
0x00 |
iConfiguration | שם ההגדרה (ללא) |
0b1010000 |
bmAttributes | מכשיר בהפעלה עצמית עם הוצאת ממצב שינה מרחוק |
0x32 |
bMaxPower | הכוח המקסימלי מבוטא במרווחים של 2 מיליאמפר לשעה |
תיאור ממשק | ||
0x09 |
bLength | גודל מתאר זה |
0x04 |
bDescriptorType | תיאור ממשק |
0x00 |
bInterfaceNumber | ממשק 0 |
0x00 |
bAlternateSetting | הגדרה חלופית 0 (ברירת מחדל) |
0x01 |
bNumEndpoints | נקודת קצה (endpoint) אחת |
0x03 |
bInterfaceClass | מחלקה של ממשק HID |
0x01 |
bInterfaceSubClass | מחלקה משנית של ממשק ההפעלה |
0x01 |
bInterfaceProtocol | מקלדת |
0x00 |
iInterface | שם הממשק (ללא) |
תיאור HID | ||
0x09 |
bLength | גודל מתאר זה |
0x21 |
bDescriptorType | תיאור HID |
0x0101 |
bcdHID | מכשיר ממשק אנושי (HID) גרסה 1.1 |
0x00 |
bCountryCode | מדינת יעד לחומרה |
0x01 |
bNumDescriptors | מספר מתארי מחלקה HID למעקב |
0x22 |
bDescriptorType | סוג מתאר דוח |
0x003F |
wDescriptorLength | האורך הכולל של מתאר הדוח |
תיאור של נקודת קצה (endpoint) | ||
0x07 |
bLength | גודל מתאר זה |
0x05 |
bDescriptorType | תיאור של נקודת קצה (endpoint) |
0b10000001 |
bEndpointAddress | נקודת קצה 1 (הודו) |
0b00000011 |
bmAttributes | הפרעה |
0x0008 |
wMaxPacketSize | חבילות של 8 בייטים |
0x0A |
bInterval | מרווח של 10 אלפיות השנייה |
תיאור ממשק | ||
0x09 |
bLength | גודל מתאר זה |
0x04 |
bDescriptorType | תיאור ממשק |
0x01 |
bInterfaceNumber | ממשק 1 |
0x00 |
bAlternateSetting | הגדרה חלופית 0 (ברירת מחדל) |
0x02 |
bNumEndpoints | 2 נקודות קצה |
0xFF |
bInterfaceClass | סיווג ממשק ספציפי לספק |
0x00 |
bInterfaceSubClass | |
0x00 |
bInterfaceProtocol | |
0x00 |
iInterface | שם הממשק (ללא) |
תיאור של נקודת קצה (endpoint) | ||
0x07 |
bLength | גודל מתאר זה |
0x05 |
bDescriptorType | תיאור של נקודת קצה (endpoint) |
0b10000010 |
bEndpointAddress | נקודת קצה 1 (הודו) |
0b00000010 |
bmAttributes | בכמות גדולה |
0x0040 |
wMaxPacketSize | חבילות של 64 בייטים |
0x00 |
bInterval | לא רלוונטי לנקודות קצה בכמות גדולה |
תיאור של נקודת קצה (endpoint) | ||
0x07 |
bLength | גודל מתאר זה |
0x05 |
bDescriptorType | תיאור של נקודת קצה (endpoint) |
0b00000011 |
bEndpointAddress | נקודת קצה 3 (יוצאת) |
0b00000010 |
bmAttributes | בכמות גדולה |
0x0040 |
wMaxPacketSize | חבילות של 64 בייטים |
0x00 |
bInterval | לא רלוונטי לנקודות קצה בכמות גדולה |
מתאר ההגדרות האישיות מורכב מכמה מתארים שמחוברים יחד. כל אחד מהם מתחיל בשדות bLength
ו-bDescriptorType
כדי שאפשר יהיה לזהות אותם. הממשק הראשון הוא ממשק ממשק אנושי (HID) עם מתאר משויך של ממשק אנושי (HID) ונקודת קצה אחת, שמשמשות להעברת אירועי קלט למערכת ההפעלה. הממשק השני הוא ממשק ספציפי לספק עם שתי נקודות קצה (endpoints), שאפשר להשתמש בהן כדי לשלוח פקודות למכשיר ולקבל תגובות בתמורה.
מתארי WebUSB
אמנם WebUSB יכול לפעול עם הרבה מכשירים ללא שינויי קושחה, אבל אפשר להפעיל פונקציונליות נוספת על ידי סימון המכשיר באמצעות תיאורים ספציפיים המציינים תמיכה ב-WebUSB. לדוגמה, אפשר לציין כתובת של דף נחיתה שאליו הדפדפן יוכל להפנות את המשתמש כשהמכשיר מחובר.
Binary device Object Store (BOS) הוא קונספט שהושק ב-USB 3.0, אבל גם עבר להתקני USB 2.0 כחלק מגרסה 2.1. הצהרת התמיכה ב-WebUSB מתחילה בתיאור של קיבולת הפלטפורמה במתאר BOS:
תמורה לכסף | שדה | תיאור |
---|---|---|
מתאר של אחסון אובייקטים במכשיר בינארי | ||
0x05 |
bLength | גודל מתאר זה |
0x0F |
bDescriptorType | מתאר של אחסון אובייקטים במכשיר בינארי |
0x001D |
wTotalLength | האורך הכולל של סדרת התיאורים האלה |
0x01 |
bNumDeviceCaps | מספר התיאורים של יכולות המכשירים ב-BOS |
תיאור היכולת של פלטפורמת WebUSB | ||
0x18 |
bLength | גודל מתאר זה |
0x10 |
bDescriptorType | תיאור של יכולות המכשיר |
0x05 |
bDevCapabilityType | תיאור של יכולות פלטפורמה |
0x00 |
bReserved | |
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} |
PlatformCapablityUUID | GUID של מתאר היכולות של פלטפורמת WebUSB בפורמט קטן |
0x0100 |
bcdVersion | גרסה 1.0 של תיאור WebUSB |
0x01 |
bVendorCode | ערך bRequest ל-WebUSB |
0x01 |
iLandingPage | כתובת ה-URL של דף הנחיתה |
מזהה ה-UUID של יכולות הפלטפורמה מזהה אותו כמתאר של יכולות WebUSB Platform, שמספק מידע בסיסי על המכשיר. כדי שהדפדפן יאחזר מידע נוסף על המכשיר, הוא משתמש בערך bVendorCode
כדי ליצור בקשות נוספות למכשיר. הבקשה היחידה שמצוינת כרגע היא GET_URL
, שמחזירה תיאור של כתובת URL. הן דומות לתיאורי מחרוזות, אבל נועדו לקודד כתובות URL בבייטים המינימליים ביותר. מתאר כתובת ה-URL של "https://google.com"
ייראה כך:
תמורה לכסף | שדה | תיאור |
---|---|---|
תיאור כתובת URL | ||
0x0D |
bLength | גודל מתאר זה |
0x03 |
bDescriptorType | תיאור כתובת URL |
0x01 |
bScheme | https:// |
"google.com" |
כתובת URL | תוכן בכתובת URL בקידוד UTF-8 |
בפעם הראשונה שהמכשיר מחובר לחשמל, הדפדפן יקרא את מתאר ה-BOS על ידי הנפקה של העברת הבקרה הרגילה GET_DESCRIPTOR
:
bmRequestType | bRequest | wValue | wIndex | wLength | נתונים (תשובה) |
---|---|---|---|---|---|
0b10000000 |
0x06 |
0x0F00 |
0x0000 |
* | תיאור BOS |
בדרך כלל הבקשה הזו נשלחת פעמיים, בפעם הראשונה עם ערך גדול מספיק של wLength
, כדי שהמארח יגלה את הערך של השדה wTotalLength
בלי להתחייב להעברה גדולה, ואז שוב כשאורך התיאור המלא יהיה ידוע.
אם במתאר של WebUSB Platform Capability שבהן השדה iLandingPage
מוגדר לערך שאינו אפס, הדפדפן מבצע בקשת GET_URL
ספציפית ל-WebUSB על ידי הנפקה של העברת בקרה כאשר bRequest
מוגדר לערך bVendorCode
ממתאר יכולת הפלטפורמה ו-wValue
מוגדר לערך iLandingPage
. קוד הבקשה של GET_URL
(0x02
) נכנס בעוד wIndex
:
bmRequestType | bRequest | wValue | wIndex | wLength | נתונים (תשובה) |
---|---|---|---|---|---|
0b11000000 |
0x01 |
0x0001 |
0x0002 |
* | מתאר כתובת ה-URL |
שוב, ייתכן שבקשה זו תוגש פעמיים כדי לבדוק תחילה את אורך התיאור שנקרא.
שיקולים ספציפיים לפלטפורמה
בעוד ש-WebUSB API מנסה לספק ממשק עקבי לגישה למכשירים, מפתחים של התקני USB עדיין צריכים להיות מודעים לדרישות שנכפות על אפליקציות כמו דרישות של דפדפני אינטרנט על מנת לגשת למכשירים.
macOS
לא נדרש שום דבר מיוחד ב-macOS. אתר שמשתמש ב-WebUSB יכול להתחבר למכשיר ולתבוע בעלות על ממשקים שלא נתבעה עליהם בעלות על ידי מנהל התקן ליבה או אפליקציה אחרת.
Linux
מערכת Linux דומה ל-macOS, אבל כברירת מחדל רוב ההפצות לא מגדירות חשבונות משתמשים עם הרשאה לפתוח התקני USB. דימון (daemon) של המערכת שנקרא udev אחראי להקצאה של המשתמש ושל הקבוצה שמורשים לגשת למכשיר. כלל כזה יקצה בעלות על מכשיר שתואם לספק ולמזהי המוצרים שצוינו לקבוצה plugdev
. זו קבוצה משותפת של משתמשים שיש להם גישה לציוד היקפי:
SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="XXXX", GROUP="plugdev"
מחליפים את XXXX
בספק ההקסדצימלי ובמזהי המוצר של המכשיר. למשל, ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11"
יתאים לטלפון Nexus One. כדי לזהות אותם בצורה נכונה, צריך לכתוב אותם ללא הקידומת "0x" הרגילה וללא אותיות קטנות. כדי למצוא את המזהים של המכשיר, מריצים את כלי שורת הפקודה lsusb
.
צריך להוסיף את הכלל לקובץ בספרייה /etc/udev/rules.d
והוא ייכנס לתוקף ברגע שהמכשיר מחובר לחשמל. אין צורך להפעיל מחדש את udev.
Android
פלטפורמת Android מבוססת על Linux אבל לא צריך לשנות את הגדרות המערכת. כברירת מחדל, כל מכשיר ללא מנהל התקן מובנה במערכת ההפעלה יהיה זמין לדפדפן. עם זאת, המפתחים צריכים להיות מודעים לכך שהמשתמשים ייתקלו שלב נוסף בהתחברות למכשיר. כשמשתמש בוחר מכשיר בתגובה לשיחה אל requestDevice()
, תוצג ב-Android הודעה עם שאלה אם לאפשר ל-Chrome לגשת אליו. הבקשה הזו מופיעה שוב אם משתמשים חוזרים לאתר שכבר יש לו הרשאה להתחבר למכשיר, ואז האתר מתקשר אל open()
.
בנוסף, תהיה אפשרות לגשת ליותר מכשירים ב-Android מאשר ב-Linux במחשב, כי כברירת מחדל נכללים פחות מנהלי התקנים. שגיאה משמעותית, למשל, היא הסיווג 'USB CDC-ACM' שמוטמע בדרך כלל באמצעות מתאמים מסוג USB ל-טורי, כי אין API ב-Android SDK לתקשורת עם מכשיר עם יציאה טורית.
ChromeOS
גם ChromeOS מבוססת על Linux ולא נדרשת שום שינוי בהגדרות המערכת. השירות permissions_broker שולט בגישה להתקני USB ויאפשר לדפדפן לגשת אליהם כל עוד יש לפחות ממשק אחד שלא נתבעה עליו בעלות.
Windows
דגם מנהל ההתקן של Windows כולל דרישה נוספת. להבדיל מהפלטפורמות שמעל האפשרות לפתוח התקן USB מאפליקציית משתמש היא לא ברירת המחדל, גם אם לא נטען מנהל התקן. במקום זאת יש מנהל התקן מיוחד, WinUSB, שצריך לטעון אותו כדי לספק את הממשק שבו אפליקציות משתמשות כדי לגשת למכשיר. ניתן לעשות זאת באמצעות קובץ מידע מותאם אישית של מנהל התקן (INF) שמותקן במערכת, או על ידי שינוי קושחת המכשיר כך שתספק את מתארי התאימות של Microsoft OS במהלך הספירה.
קובץ פרטי נהג (INF)
קובץ מידע של מנהל התקן מורה ל-Windows מה לעשות אם נתקלים במכשיר בפעם הראשונה. מכיוון שהמערכת של המשתמש כבר כוללת את מנהל התקן WinUSB, כל מה שצריך הוא שקובץ ה-INF ישייך את הספק ומזהה המוצר שלכם לכלל ההתקנה החדש הזה. הקובץ הבא הוא דוגמה בסיסית. שומרים אותה בקובץ עם התוסף .inf
, משנים את הקטעים שמסומנים ב-X ולאחר מכן לוחצים עליהם לחיצה ימנית ובוחרים ב-Install (התקנה) מתפריט ההקשר.
[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]
מגדיר את הקבוצה של מזהי DeviceInterfaceGUID עבור המכשיר. לכל ממשק מכשיר חייב להיות GUID כדי שאפליקציה תוכל למצוא ולהתחבר אליו דרך Windows API. משתמשים ב-cmdlet New-Guid
של PowerShell או בכלי אונליין כדי ליצור GUID אקראי.
למטרות פיתוח, הכלי של Zaadig מספק ממשק קל להחלפת מנהל ההתקן שנטען בממשק USB במנהל התקן WinUSB.
תיאורי תאימות של Microsoft OS
הגישה של קובצי INF כפי שצוינה למעלה היא מסורבלת, כי היא דורשת להגדיר את כל המכונות של כל משתמש מראש. Windows 8.1 ואילך מציע חלופה באמצעות שימוש במתארי USB בהתאמה אישית. התיאורים האלה מספקים מידע למערכת ההפעלה של Windows בפעם הראשונה שהמכשיר מחובר לחשמל, שבדרך כלל נכלל בקובץ ה-INF.
אחרי שמגדירים מתארי WebUSB, אפשר להוסיף בקלות גם את מתארי התאימות של Microsoft OS. קודם כול מרחיבים את מתאר ה-BOS באמצעות התיאור הנוסף של יכולות הפלטפורמה. חשוב לעדכן את wTotalLength
ואת bNumDeviceCaps
כדי להביא בחשבון את השינויים.
תמורה לכסף | שדה | תיאור |
---|---|---|
תיאור היכולת של פלטפורמת Microsoft OS 2.0 | ||
0x1C |
bLength | גודל מתאר זה |
0x10 |
bDescriptorType | תיאור של יכולות המכשיר |
0x05 |
bDevCapabilityType | תיאור של יכולות פלטפורמה |
0x00 |
bReserved | |
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} |
PlatformCapablityUUID | GUID של מתאר התאימות לפלטפורמה של Microsoft OS 2.0 בפורמט הקטן |
0x06030000 |
dwWindowsVersion | גרסת Windows תואמת מינימלית (Windows 8.1) |
0x00B2 |
wMSOSDescriptorSetTotalLength | האורך הכולל של קבוצת התיאורים |
0x02 |
bMS_VendorCode | ערך bRequest לאחזור מתארים נוספים של Microsoft |
0x00 |
bAltEnumCode | המכשיר לא תומך בספירה חלופית |
בדומה למתארים של WebUSB, צריך לבחור ערך bRequest
שישמש להעברות בקרה שקשורות למתארים האלה. בדוגמה הזו בחרתי באפשרות 0x02
. 0x07
, במיקום wIndex
, היא הפקודה לאחזר את ערכת התיאורים של Microsoft OS
2.0 מהמכשיר.
bmRequestType | bRequest | wValue | wIndex | wLength | נתונים (תשובה) |
---|---|---|---|---|---|
0b11000000 |
0x02 |
0x0000 |
0x0007 |
* | ערכת תיאורים ל-MS OS 2.0 |
להתקן USB יכולות להיות כמה פונקציות, ולכן החלק הראשון של קבוצת התיאורים מתאר את הפונקציה שאליה משויכים המאפיינים הבאים. בדוגמה הבאה מוגדרת ממשק 1 של מכשיר מורכב. המתאר מספק למערכת ההפעלה שני פרטים חשובים על הממשק הזה. מתאר
המזהה התואם מורה ל-Windows שהמכשיר הזה תואם למנהל התקן WinUSB. מתאר מאפיין הרישום פועל בדומה לקטע [Dev_AddReg]
בדוגמה של INF שלמעלה, ומגדירים מאפיין רישום כדי להקצות לפונקציה הזו ממשק GUID של המכשיר.
תמורה לכסף | שדה | תיאור |
---|---|---|
כותרת של הגדרת תיאור של Microsoft OS 2.0 | ||
0x000A |
wLength | גודל מתאר זה |
0x0000 |
wDescriptorType | מתאר כותרת של קבוצת תיאור |
0x06030000 |
dwWindowsVersion | גרסת Windows תואמת מינימלית (Windows 8.1) |
0x00B2 |
wTotalLength | האורך הכולל של קבוצת התיאורים |
כותרת של קבוצת משנה של הגדרות Microsoft OS 2.0 | ||
0x0008 |
wLength | גודל מתאר זה |
0x0001 |
wDescriptorType | תיאור כותרת של קבוצת משנה של הגדרות אישיות |
0x00 |
bConfigurationValue | רלוונטי להגדרה 1 (נוסף לאינדקס מ-0 למרות ההגדרות שבדרך כלל מתווספות לאינדקס מ-1) |
0x00 |
bReserved | יש להגדיר את הערך כ-0 |
0x00A8 |
wTotalLength | האורך הכולל של קבוצת המשנה, כולל הכותרת הזו |
כותרת של קבוצת משנה של פונקציות Microsoft OS 2.0 | ||
0x0008 |
wLength | גודל מתאר זה |
0x0002 |
wDescriptorType | מתאר כותרת של קבוצת משנה של פונקציות |
0x01 |
bFirstInterface | הממשק הראשון של הפונקציה |
0x00 |
bReserved | יש להגדיר את הערך כ-0 |
0x00A0 |
wSubsetLength | האורך הכולל של קבוצת המשנה, כולל הכותרת הזו |
מתאר מזהה תואם ל-Microsoft OS 2.0 | ||
0x0014 |
wLength | גודל מתאר זה |
0x0003 |
wDescriptorType | מתאר תואם של מזהה |
"WINUSB\0\0" |
CompatibileID | מחרוזת ASCII נוספה ל-8 בייטים |
"\0\0\0\0\0\0\0\0" |
SubCompatibleID | מחרוזת ASCII נוספה ל-8 בייטים |
מתאר של מאפיין רישום Microsoft OS 2.0 | ||
0x0084 |
wLength | גודל מתאר זה |
0x0004 |
wDescriptorType | מתאר מאפיין במרשם |
0x0007 |
wPropertyDataType | REG_MULTI_SZ |
0x002A |
wPropertyNameLength | האורך של שם הנכס |
"DeviceInterfaceGUIDs\0" |
PropertyName | שם המאפיין עם ערך null מקודד בקידוד UTF-16LE |
0x0050 |
wPropertyDataLength | אורך ערך המאפיין |
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" |
PropertyData | GUID ועוד שני טרמינטורים ריקים בקידוד UTF-16LE |
מערכת Windows תשלח שאילתה למכשיר רק פעם אחת. אם המכשיר לא יגיב באמצעות תיאורים חוקיים, הוא לא יבקש שוב אישור בפעם הבאה שהוא יחובר. Microsoft סיפקה רשימה של ערכי רישום של מכשירי USB שמתארות את ערכי הרישום שנוצרו במהלך ספירת מכשיר. במהלך הבדיקה, מוחקים את הרשומות שנוצרו במכשיר כדי לאלץ את Windows לנסות לקרוא שוב את התיאורים.
למידע נוסף על השימוש במתארים האלה, תוכלו לקרוא את הפוסט בבלוג של Microsoft.
דוגמאות
בפרויקטים הבאים ניתן למצוא קוד לדוגמה ליישום של מכשירים המותאמים ל-WebUSB, שכוללים גם תיאורים של WebUSB וגם תיאורים של Microsoft OS: