برای استفاده کامل از WebUSB API دستگاهی بسازید.
این مقاله نحوه ساخت دستگاهی برای استفاده کامل از WebUSB API را توضیح می دهد. برای معرفی مختصر خود API، به دسترسی به دستگاههای USB در وب مراجعه کنید.
پس زمینه
گذرگاه سریال جهانی (USB) به رایجترین رابط فیزیکی برای اتصال وسایل جانبی به دستگاههای رایانه رومیزی و موبایل تبدیل شده است. علاوه بر تعریف مشخصات الکتریکی اتوبوس و یک مدل کلی برای برقراری ارتباط با یک دستگاه، مشخصات USB شامل مجموعه ای از مشخصات کلاس دستگاه می باشد. اینها مدل های کلی برای کلاس های خاصی از دستگاه ها مانند ذخیره سازی، صوتی، تصویری، شبکه و غیره هستند که سازندگان دستگاه می توانند آنها را پیاده سازی کنند. مزیت این مشخصات کلاس دستگاه این است که یک فروشنده سیستم عامل می تواند یک درایور را بر اساس مشخصات کلاس (یک "درایور کلاس") پیاده سازی کند و هر دستگاهی که آن کلاس را پیاده سازی کند پشتیبانی می شود. این یک پیشرفت بزرگ نسبت به هر سازنده ای بود که نیاز به نوشتن درایورهای دستگاه خود داشت.
با این حال، برخی از دستگاهها در یکی از این کلاسهای دستگاه استاندارد قرار نمیگیرند. در عوض، یک سازنده ممکن است تصمیم بگیرد که دستگاه خود را به عنوان یک کلاس خاص فروشنده برچسب گذاری کند. در این مورد، سیستم عامل بر اساس اطلاعات ارائه شده در بسته درایور فروشنده، معمولاً مجموعهای از شناسههای فروشنده و محصول که برای پیادهسازی یک پروتکل خاص فروشنده مشخص هستند، انتخاب میکند که کدام درایور دستگاه را بارگیری کند.
یکی دیگر از ویژگی های USB این است که دستگاه ها ممکن است چندین رابط را برای میزبانی که به آن متصل هستند ارائه دهند. هر رابط می تواند یک کلاس استاندارد شده را پیاده سازی کند یا خاص فروشنده باشد. هنگامی که یک سیستم عامل درایورهای مناسب را برای مدیریت دستگاه انتخاب می کند، هر رابط می تواند توسط یک درایور متفاوت ادعا شود. به عنوان مثال، یک وبکم USB معمولاً دو رابط ارائه میدهد، یکی کلاس ویدیویی USB (برای دوربین) و دیگری کلاس صوتی USB (برای میکروفون) را پیادهسازی میکند. سیستم عامل یک "درایور وب کم" را بارگیری نمی کند، بلکه درایورهای کلاس صوتی و تصویری مستقل را بارگیری می کند که مسئولیت عملکردهای جداگانه دستگاه را بر عهده می گیرند. این ترکیب کلاس های رابط انعطاف پذیری بیشتری را فراهم می کند.
اصول API
بسیاری از کلاسهای USB استاندارد دارای APIهای وب مربوطه هستند. به عنوان مثال، یک صفحه می تواند با استفاده از getUserMedia()
از یک دستگاه کلاس ویدیویی فیلم بگیرد یا با گوش دادن به KeyboardEvents یا PointerEvents یا با استفاده از Gamepad یا WebHID API، رویدادهای ورودی را از دستگاه کلاس رابط انسانی (HID) دریافت کند. همانطور که همه دستگاهها تعریف کلاس استاندارد شده را پیادهسازی نمیکنند، همه دستگاهها ویژگیهایی را اجرا نمیکنند که با APIهای پلتفرم وب موجود مطابقت دارند. در این صورت، WebUSB API میتواند این شکاف را با ارائه راهی برای سایتها برای ادعای یک رابط خاص فروشنده و پیادهسازی پشتیبانی از آن مستقیماً در صفحه خود، پر کند.
الزامات خاص برای دسترسی به یک دستگاه از طریق WebUSB از پلت فرمی به پلتفرم دیگر به دلیل تفاوت در نحوه مدیریت دستگاه های USB توسط سیستم عامل ها کمی متفاوت است، اما شرط اساسی این است که دستگاه از قبل دارای درایوری نباشد که ادعا می کند رابط صفحه می خواهد کنترل کند. این می تواند یک درایور کلاس عمومی ارائه شده توسط فروشنده سیستم عامل یا یک درایور دستگاه ارائه شده توسط فروشنده باشد. از آنجایی که دستگاههای USB میتوانند چندین رابط ارائه دهند، که هر کدام ممکن است درایور خاص خود را داشته باشند، میتوان دستگاهی ساخت که برخی از رابطها توسط درایور ادعا شده و برخی دیگر در دسترس مرورگر قرار میگیرند.
به عنوان مثال، یک صفحه کلید USB سطح بالا ممکن است یک رابط کلاس HID ارائه کند که توسط زیرسیستم ورودی سیستم عامل ادعا می شود و یک رابط خاص فروشنده که برای استفاده توسط ابزار پیکربندی در دسترس WebUSB باقی می ماند. این ابزار را می توان در وب سایت سازنده ارائه کرد و به کاربر این امکان را می دهد تا جنبه هایی از رفتار دستگاه مانند کلیدهای ماکرو و جلوه های نوری را بدون نصب نرم افزار مخصوص پلتفرم تغییر دهد. توصیف کننده پیکربندی چنین دستگاهی چیزی شبیه به این خواهد بود:
ارزش | میدان | توضیحات |
---|---|---|
توصیف کننده پیکربندی | ||
0x09 | طول | اندازه این توصیفگر |
0x02 | bDescriptorType | توصیف کننده پیکربندی |
0x0039 | طول کل | طول کل این سری از توصیفگرها |
0x02 | bNumInterfaces | تعداد رابط ها |
0x01 | bConfigurationValue | پیکربندی 1 |
0x00 | iConfiguration | نام پیکربندی (هیچ) |
0b1010000 | bmAttributes | دستگاه خود تغذیه با بیدار شدن از راه دور |
0x32 | bMaxPower | حداکثر توان با افزایش 2 میلی آمپر بیان می شود |
توصیفگر رابط | ||
0x09 | طول | اندازه این توصیفگر |
0x04 | bDescriptorType | توصیفگر رابط |
0x00 | bInterfaceNumber | رابط 0 |
0x00 | bAlternateSetting | تنظیم جایگزین 0 (پیشفرض) |
0x01 | bNumEndpoints | 1 نقطه پایانی |
0x03 | bInterfaceClass | کلاس رابط HID |
0x01 | bInterfaceSubClass | زیر کلاس رابط بوت |
0x01 | پروتکل bInterface | صفحه کلید |
0x00 | iInterface | نام رابط (هیچکدام) |
توصیفگر HID | ||
0x09 | طول | اندازه این توصیفگر |
0x21 | bDescriptorType | توصیفگر HID |
0x0101 | bcdHID | HID نسخه 1.1 |
0x00 | bCountryCode | کشور هدف سخت افزار |
0x01 | bNumDescriptors | تعداد توصیفگرهای کلاس HID برای دنبال کردن |
0x22 | bDescriptorType | نوع توصیفگر گزارش |
0x003F | wDescriptorLength | طول کل توصیفگر گزارش |
توصیفگر نقطه پایانی | ||
0x07 | طول | اندازه این توصیفگر |
0x05 | bDescriptorType | توصیفگر نقطه پایانی |
0b10000001 | bEndpointAddress | نقطه پایانی 1 (IN) |
0b00000011 | bmAttributes | قطع کنید |
0x0008 | wMaxPacketSize | بسته های 8 بایتی |
0x0A | bInterval | فاصله 10 میلی ثانیه |
توصیفگر رابط | ||
0x09 | طول | اندازه این توصیفگر |
0x04 | bDescriptorType | توصیفگر رابط |
0x01 | bInterfaceNumber | رابط 1 |
0x00 | bAlternateSetting | تنظیم جایگزین 0 (پیشفرض) |
0x02 | bNumEndpoints | 2 نقطه پایانی |
0xFF | bInterfaceClass | کلاس رابط خاص فروشنده |
0x00 | bInterfaceSubClass | |
0x00 | پروتکل bInterface | |
0x00 | iInterface | نام رابط (هیچکدام) |
توصیفگر نقطه پایانی | ||
0x07 | طول | اندازه این توصیفگر |
0x05 | bDescriptorType | توصیفگر نقطه پایانی |
0b10000010 | bEndpointAddress | نقطه پایانی 1 (IN) |
0b00000010 | bmAttributes | فله |
0x0040 | wMaxPacketSize | بسته های 64 بایتی |
0x00 | bInterval | برای نقاط پایانی انبوه وجود ندارد |
توصیفگر نقطه پایانی | ||
0x07 | طول | اندازه این توصیفگر |
0x05 | bDescriptorType | توصیفگر نقطه پایانی |
0b00000011 | bEndpointAddress | نقطه پایانی 3 (خروج) |
0b00000010 | bmAttributes | فله |
0x0040 | wMaxPacketSize | بسته های 64 بایتی |
0x00 | bInterval | برای نقاط پایانی انبوه وجود ندارد |
توصیفگر پیکربندی از چندین توصیفگر به هم پیوسته تشکیل شده است. هر کدام با فیلدهای bLength
و bDescriptorType
شروع می شوند تا بتوان آنها را شناسایی کرد. اولین رابط یک رابط HID با یک توصیفگر HID مرتبط و یک نقطه پایانی است که برای ارائه رویدادهای ورودی به سیستم عامل استفاده می شود. رابط دوم یک رابط خاص فروشنده با دو نقطه پایانی است که می تواند برای ارسال دستورات به دستگاه و دریافت پاسخ در ازای آن استفاده شود.
توصیفگرهای WebUSB
در حالی که WebUSB میتواند با بسیاری از دستگاهها بدون تغییرات سفتافزار کار کند، عملکرد اضافی با علامتگذاری دستگاه با توصیفگرهای خاص که نشاندهنده پشتیبانی از WebUSB است، فعال میشود. به عنوان مثال، میتوانید URL صفحه فرود را مشخص کنید که مرورگر بتواند کاربر را هنگامی که دستگاه شما وصل است به آن هدایت کند.
فروشگاه اشیاء دستگاه باینری (BOS) مفهومی است که در USB 3.0 معرفی شده است اما به عنوان بخشی از نسخه 2.1 به دستگاه های USB 2.0 نیز پشتیبان داده شده است. اعلام پشتیبانی از WebUSB با گنجاندن توصیفگر قابلیت پلتفرم زیر در توصیفگر BOS شروع می شود:
ارزش | میدان | توضیحات |
---|---|---|
دستگاه باینری Object Store توصیف | ||
0x05 | طول | اندازه این توصیفگر |
0x0F | bDescriptorType | دستگاه باینری Object Store توصیف |
0x001D | طول کل | طول کل این سری از توصیفگرها |
0x01 | bNumDeviceCaps | تعداد توصیفگرهای قابلیت دستگاه در BOS |
توصیف کننده قابلیت پلت فرم WebUSB | ||
0x18 | طول | اندازه این توصیفگر |
0x10 | bDescriptorType | توصیف کننده قابلیت دستگاه |
0x05 | bDevCapabilityType | توصیف کننده قابلیت پلتفرم |
0x00 | b رزرو شده است | |
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} | PlatformCapablityUUID | GUID توصیفگر قابلیت پلت فرم WebUSB در قالب کمی هندی |
0x0100 | bcdVersion | توصیفگر WebUSB نسخه 1.0 |
0x01 | bVendorCode | bRequest مقدار برای WebUSB |
0x01 | آی لندینگ پیج | URL برای صفحه فرود |
قابلیت پلتفرم UUID این را به عنوان یک توصیفگر قابلیت پلتفرم WebUSB شناسایی می کند که اطلاعات اولیه را در مورد دستگاه ارائه می دهد. برای اینکه مرورگر اطلاعات بیشتری درباره دستگاه دریافت کند، از مقدار bVendorCode
برای ارسال درخواستهای اضافی به دستگاه استفاده میکند. تنها درخواستی که در حال حاضر مشخص شده است GET_URL
است که یک توصیفگر URL را برمی گرداند. اینها شبیه به توصیفگرهای رشته هستند اما برای کدگذاری URLها در کمترین بایت طراحی شده اند. توصیفگر URL برای "https://google.com"
به شکل زیر است:
ارزش | میدان | توضیحات |
---|---|---|
توصیف کننده URL | ||
0x0D | طول | اندازه این توصیفگر |
0x03 | bDescriptorType | توصیف کننده URL |
0x01 | bScheme | https:// |
"google.com" | URL | محتوای URL کدگذاری شده UTF-8 |
هنگامی که دستگاه شما برای اولین بار به برق وصل می شود، مرورگر با صدور این انتقال کنترل استاندارد GET_DESCRIPTOR
توصیفگر BOS را می خواند:
bmRequestType | b درخواست | wvalue | wIndex | طول | داده ها (پاسخ) |
---|---|---|---|---|---|
0b10000000 | 0x06 | 0x0F00 | 0x0000 | * | توصیفگر BOS |
این درخواست معمولاً دو بار انجام می شود، بار اول با wLength
به اندازه کافی بزرگ به طوری که میزبان بدون تعهد به انتقال بزرگ، مقدار فیلد wTotalLength
را دریابد و سپس دوباره زمانی که طول کامل توصیفگر مشخص شد.
اگر توصیفگر قابلیت پلتفرم WebUSB دارای فیلد iLandingPage
روی مقدار غیر صفر باشد، مرورگر یک درخواست GET_URL
مخصوص WebUSB را با صدور یک انتقال کنترل با تنظیم bRequest
به مقدار bVendorCode
از توصیفگر قابلیت پلتفرم و تنظیم wValue
به مقدار انجام می دهد. مقدار iLandingPage
. کد درخواست برای GET_URL
( 0x02
) در wIndex
می رود:
bmRequestType | b درخواست | wvalue | wIndex | طول | داده ها (پاسخ) |
---|---|---|---|---|---|
0b11000000 | 0x01 | 0x0001 | 0x0002 | * | توصیفگر URL |
مجدداً، این درخواست ممکن است دو بار صادر شود تا ابتدا طول توصیفگر خوانده شده را بررسی کنیم.
ملاحظات خاص پلت فرم
در حالی که WebUSB API تلاش میکند تا یک رابط ثابت برای دسترسی به دستگاههای USB ارائه دهد، توسعهدهندگان همچنان باید از الزامات تحمیل شده بر روی برنامهها مانند الزامات مرورگرهای وب برای دسترسی به دستگاهها آگاه باشند.
macOS
هیچ چیز خاصی برای macOS لازم نیست. وبسایتی که از WebUSB استفاده میکند میتواند به دستگاه متصل شود و هر رابطی را که توسط درایور هسته یا برنامه دیگری ادعا نشده است ادعا کند.
لینوکس
لینوکس مانند macOS است اما به طور پیشفرض اکثر توزیعها حسابهای کاربری را با مجوز باز کردن دستگاههای USB تنظیم نمیکنند. یک شبح سیستم به نام 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 نیست.
اندروید
پلتفرم اندروید مبتنی بر لینوکس است اما نیازی به هیچ تغییری در پیکربندی سیستم ندارد. به طور پیش فرض هر دستگاهی که درایور داخلی در سیستم عامل نداشته باشد در دسترس مرورگر است. با این حال، توسعه دهندگان باید بدانند که کاربران هنگام اتصال به دستگاه با یک مرحله اضافی روبرو می شوند. هنگامی که کاربر دستگاهی را در پاسخ به یک تماس با requestDevice()
انتخاب کرد، Android درخواستی را نمایش میدهد که از شما میپرسد آیا به Chrome اجازه دسترسی به آن را میدهد یا خیر. همچنین اگر کاربر به وبسایتی که قبلاً مجوز اتصال به دستگاهی را دارد بازگردد و وبسایت open()
فراخوانی کند، این اعلان دوباره ظاهر میشود.
علاوه بر این، دستگاههای بیشتری در Android نسبت به لینوکس دسکتاپ در دسترس خواهند بود، زیرا درایورهای کمتری به طور پیشفرض گنجانده شده است. به عنوان مثال، یک حذف قابل توجه، کلاس USB CDC-ACM است که معمولاً توسط آداپتورهای USB-to-Serial پیاده سازی می شود، زیرا هیچ API در Android SDK برای برقراری ارتباط با دستگاه سریال وجود ندارد.
ChromeOS
ChromeOS نیز مبتنی بر لینوکس است و همچنین نیازی به تغییر در پیکربندی سیستم ندارد. سرویس permission_broker دسترسی به دستگاههای USB را کنترل میکند و به مرورگر اجازه میدهد تا زمانی که حداقل یک رابط بدون ادعا وجود دارد به آنها دسترسی داشته باشد.
ویندوز
مدل درایور ویندوز یک نیاز اضافی را معرفی می کند. برخلاف پلتفرمهای بالاتر، توانایی باز کردن یک دستگاه USB از یک برنامه کاربر پیشفرض نیست، حتی اگر درایوری بارگذاری نشده باشد. در عوض یک درایور ویژه به نام WinUSB وجود دارد که باید بارگذاری شود تا برنامههای رابطی که برای دسترسی به دستگاه استفاده میکنند، ارائه شود. این کار را می توان با یک فایل اطلاعات راننده سفارشی (INF) نصب شده بر روی سیستم یا با تغییر سفت افزار دستگاه برای ارائه توصیفگرهای سازگاری سیستم عامل مایکروسافت در حین شمارش انجام داد.
فایل اطلاعات راننده (INF)
یک فایل اطلاعات درایور به ویندوز می گوید که هنگام مواجهه با دستگاه برای اولین بار چه کاری انجام دهد. از آنجایی که سیستم کاربر از قبل شامل درایور 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 داشته باشد تا برنامه بتواند آن را از طریق API ویندوز پیدا کند و به آن متصل شود. از cmdlet New-Guid
PowerShell یا یک ابزار آنلاین برای ایجاد یک GUID تصادفی استفاده کنید.
برای اهداف توسعه، ابزار Zadig یک رابط آسان برای جایگزینی درایور بارگذاری شده برای رابط USB با درایور WinUSB فراهم می کند.
توصیفگرهای سازگاری سیستم عامل مایکروسافت
روش فایل INF بالا دست و پا گیر است زیرا نیاز به پیکربندی ماشین هر کاربر قبل از زمان دارد. ویندوز 8.1 و بالاتر با استفاده از توصیفگرهای USB سفارشی جایگزینی را ارائه می دهد. این توصیفگرها هنگامی که دستگاه برای اولین بار به برق وصل می شود اطلاعاتی را در اختیار سیستم عامل ویندوز قرار می دهد که معمولاً در فایل INF گنجانده می شود.
هنگامی که توصیفگرهای WebUSB را تنظیم کردید، اضافه کردن توصیفگرهای سازگاری سیستم عامل مایکروسافت نیز آسان است. ابتدا توصیفگر BOS را با این توصیفگر قابلیت پلتفرم اضافی گسترش دهید. حتماً wTotalLength
و bNumDeviceCaps
را بهروزرسانی کنید تا آن را در نظر بگیرید.
ارزش | میدان | توضیحات |
---|---|---|
توصیف کننده قابلیت پلت فرم Microsoft OS 2.0 | ||
0x1C | طول | اندازه این توصیفگر |
0x10 | bDescriptorType | توصیف کننده قابلیت دستگاه |
0x05 | bDevCapabilityType | توصیف کننده قابلیت پلتفرم |
0x00 | b رزرو شده است | |
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} | PlatformCapablityUUID | مایکروسافت OS 2.0 توصیفگر سازگاری پلت فرم GUID در قالب کمی هندی |
0x06030000 | نسخه dwWindows | حداقل نسخه ویندوز سازگار (ویندوز 8.1) |
0x00B2 | wMSOSDescriptorSetTotalLength | طول کل مجموعه توصیفگر |
0x02 | bMS_VendorCode | مقدار درخواست برای بازیابی بیشتر توصیفگرهای مایکروسافت |
0x00 | bAltEnumCode | دستگاه از شمارش جایگزین پشتیبانی نمی کند |
همانند توصیفگرهای WebUSB، باید یک مقدار bRequest
را انتخاب کنید تا در انتقال کنترل مربوط به این توصیفگرها استفاده شود. در این مثال من 0x02
انتخاب کرده ام. 0x07
، قرار داده شده در wIndex
، دستور بازیابی Microsoft OS 2.0 Descriptor Set از دستگاه است.
bmRequestType | b درخواست | wvalue | wIndex | طول | داده ها (پاسخ) |
---|---|---|---|---|---|
0b11000000 | 0x02 | 0x0000 | 0x0007 | * | مجموعه توصیفگر MS OS 2.0 |
یک دستگاه USB میتواند عملکردهای متعددی داشته باشد، بنابراین قسمت اول مجموعه توصیفگر توضیح میدهد که ویژگیهای بعدی با کدام عملکرد مرتبط هستند. مثال زیر رابط 1 یک دستگاه ترکیبی را پیکربندی می کند. توصیفگر دو اطلاعات مهم در مورد این رابط به سیستم عامل می دهد. توصیفگر شناسه سازگار به ویندوز می گوید که این دستگاه با درایور WinUSB سازگار است. توصیفگر ویژگی رجیستری مشابه بخش [Dev_AddReg]
در مثال INF بالا عمل می کند و یک ویژگی رجیستری را تنظیم می کند تا به این تابع یک GUID رابط دستگاه اختصاص دهد.
ارزش | میدان | توضیحات |
---|---|---|
هدر مجموعه توصیفگر سیستم عامل Microsoft OS 2.0 | ||
0x000A | طول | اندازه این توصیفگر |
0x0000 | wDescriptorType | توصیفگر مجموعه سرصفحه |
0x06030000 | نسخه dwWindows | حداقل نسخه ویندوز سازگار (ویندوز 8.1) |
0x00B2 | طول کل | طول کل مجموعه توصیفگر |
سربرگ زیر مجموعه پیکربندی Microsoft OS 2.0 | ||
0x0008 | طول | اندازه این توصیفگر |
0x0001 | wDescriptorType | شرح سرصفحه زیر مجموعه پیکربندی. |
0x00 | bConfigurationValue | برای پیکربندی 1 اعمال می شود (ایندکس شده از 0 علیرغم پیکربندی هایی که معمولاً از 1 نمایه می شوند) |
0x00 | b رزرو شده است | باید روی 0 تنظیم شود |
0x00A8 | طول کل | طول کل زیر مجموعه از جمله این سرصفحه |
هدر زیرمجموعه تابع Microsoft OS 2.0 | ||
0x0008 | طول | اندازه این توصیفگر |
0x0002 | wDescriptorType | توصیفگر سرصفحه زیر مجموعه تابع |
0x01 | bFirstInterface | رابط اول تابع |
0x00 | b رزرو شده است | باید روی 0 تنظیم شود |
0x00A0 | wSubsetLength | طول کل زیر مجموعه از جمله این سرصفحه |
شرح شناسه سازگار با سیستم عامل Microsoft 2.0 | ||
0x0014 | طول | اندازه این توصیفگر |
0x0003 | wDescriptorType | توصیفگر شناسه سازگار |
"WINUSB\0\0" | شناسه سازگار | رشته ASCII به 8 بایت اضافه شد |
"\0\0\0\0\0\0\0\0" | شناسه SubCompatible | رشته ASCII به 8 بایت اضافه شد |
توصیفگر ویژگی رجیستری Microsoft OS 2.0 | ||
0x0084 | طول | اندازه این توصیفگر |
0x0004 | wDescriptorType | توصیف کننده اموال ثبتی |
0x0007 | wPropertyDataType | REG_MULTI_SZ |
0x002A | wPropertyNameLength | طول نام ملک |
"DeviceInterfaceGUIDs\0" | PropertyName | نام دارایی با پایان دهنده تهی کدگذاری شده در UTF-16LE |
0x0050 | wPropertyDataLength | طول ارزش ملک |
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" | PropertyData | GUID به علاوه دو پایان دهنده تهی کدگذاری شده در UTF-16LE |
ویندوز این اطلاعات را فقط یک بار از دستگاه استعلام می کند. اگر دستگاه با توصیفگرهای معتبر پاسخ ندهد، دفعه بعد که دستگاه وصل می شود، دوباره سؤال نخواهد کرد. مایکروسافت فهرستی از ورودیهای رجیستری دستگاه USB را ارائه کرده است که ورودیهای رجیستری ایجاد شده هنگام شمارش دستگاه را توصیف میکند. هنگام آزمایش، ورودی های ایجاد شده برای یک دستگاه را حذف کنید تا ویندوز مجبور شود دوباره سعی کند توصیفگرها را بخواند.
برای اطلاعات بیشتر، پست وبلاگ مایکروسافت را در مورد نحوه استفاده از این توصیفگرها بررسی کنید.
نمونه ها
نمونه کد پیادهسازی دستگاههای آگاه از WebUSB که شامل توصیفگرهای WebUSB و توصیفگرهای سیستمعامل مایکروسافت است را میتوان در این پروژهها یافت: