WebUSB এর জন্য একটি ডিভাইস তৈরি করা

WebUSB API এর সম্পূর্ণ সুবিধা নিতে একটি ডিভাইস তৈরি করুন৷

রিলি গ্রান্ট
Reilly Grant

এই নিবন্ধটি ব্যাখ্যা করে কিভাবে WebUSB API এর সম্পূর্ণ সুবিধা নিতে একটি ডিভাইস তৈরি করতে হয়। API নিজেই একটি সংক্ষিপ্ত ভূমিকার জন্য, ওয়েবে USB ডিভাইস অ্যাক্সেস দেখুন।

পটভূমি

ইউনিভার্সাল সিরিয়াল বাস (ইউএসবি) ডেস্কটপ এবং মোবাইল কম্পিউটিং ডিভাইসগুলির সাথে পেরিফেরালগুলিকে সংযুক্ত করার জন্য সবচেয়ে সাধারণ শারীরিক ইন্টারফেস হয়ে উঠেছে। বাসের বৈদ্যুতিক বৈশিষ্ট্য এবং একটি ডিভাইসের সাথে যোগাযোগের জন্য একটি সাধারণ মডেল সংজ্ঞায়িত করার পাশাপাশি, USB স্পেসিফিকেশনগুলিতে ডিভাইস শ্রেণীর নির্দিষ্টকরণের একটি সেট অন্তর্ভুক্ত রয়েছে। এগুলি বিশেষ শ্রেণীর ডিভাইসগুলির জন্য সাধারণ মডেল যেমন স্টোরেজ, অডিও, ভিডিও, নেটওয়ার্কিং, ইত্যাদি যা ডিভাইস নির্মাতারা প্রয়োগ করতে পারে। এই ডিভাইস ক্লাস স্পেসিফিকেশনের সুবিধা হল যে একটি অপারেটিং সিস্টেম বিক্রেতা ক্লাস স্পেসিফিকেশন (একটি "ক্লাস ড্রাইভার") এর উপর ভিত্তি করে একটি একক ড্রাইভার বাস্তবায়ন করতে পারে এবং সেই ক্লাসটি বাস্তবায়নকারী যেকোন ডিভাইসটি সমর্থিত হবে। প্রতিটি নির্মাতার তাদের নিজস্ব ডিভাইস ড্রাইভার লেখার প্রয়োজনের তুলনায় এটি একটি দুর্দান্ত উন্নতি।

কিছু ডিভাইস অবশ্য এই প্রমিত ডিভাইস ক্লাসগুলির মধ্যে একটিতে মাপসই করে না। একটি প্রস্তুতকারক পরিবর্তে তাদের ডিভাইসটিকে বিক্রেতা-নির্দিষ্ট শ্রেণী বাস্তবায়ন হিসাবে লেবেল করতে বেছে নিতে পারে। এই ক্ষেত্রে অপারেটিং সিস্টেম বিক্রেতার ড্রাইভার প্যাকেজে প্রদত্ত তথ্যের উপর ভিত্তি করে কোন ডিভাইস ড্রাইভারটি লোড করবে তা বেছে নেয়, সাধারণত বিক্রেতা এবং পণ্য আইডিগুলির একটি সেট যা একটি নির্দিষ্ট বিক্রেতা-নির্দিষ্ট প্রোটোকল বাস্তবায়নের জন্য পরিচিত।

USB-এর আরেকটি বৈশিষ্ট্য হল যে ডিভাইসগুলি তাদের সাথে সংযুক্ত হোস্টে একাধিক ইন্টারফেস প্রদান করতে পারে। প্রতিটি ইন্টারফেস একটি প্রমিত শ্রেণী প্রয়োগ করতে পারে বা বিক্রেতা-নির্দিষ্ট হতে পারে। যখন একটি অপারেটিং সিস্টেম ডিভাইসটি পরিচালনা করার জন্য সঠিক ড্রাইভার নির্বাচন করে তখন প্রতিটি ইন্টারফেস একটি ভিন্ন ড্রাইভার দ্বারা দাবি করা যেতে পারে। উদাহরণস্বরূপ, একটি ইউএসবি ওয়েবক্যাম সাধারণত দুটি ইন্টারফেস প্রদান করে, একটি ইউএসবি ভিডিও ক্লাস (ক্যামেরার জন্য) বাস্তবায়ন করে এবং একটি ইউএসবি অডিও ক্লাস (মাইক্রোফোনের জন্য) বাস্তবায়ন করে। অপারেটিং সিস্টেম একটি একক "ওয়েবক্যাম ড্রাইভার" লোড করে না বরং এর পরিবর্তে স্বাধীন ভিডিও এবং অডিও ক্লাস ড্রাইভার লোড করে যা ডিভাইসের পৃথক ফাংশনের জন্য দায়িত্ব নেয়। ইন্টারফেস ক্লাসের এই রচনাটি বৃহত্তর নমনীয়তার জন্য প্রদান করে।

API বেসিক

অনেক স্ট্যান্ডার্ড ইউএসবি ক্লাসে সংশ্লিষ্ট ওয়েব API আছে। উদাহরণস্বরূপ, একটি পৃষ্ঠা getUserMedia() ব্যবহার করে একটি ভিডিও ক্লাস ডিভাইস থেকে ভিডিও ক্যাপচার করতে পারে বা KeyboardEvents বা PointerEvents শুনে বা গেমপ্যাড বা WebHID API ব্যবহার করে হিউম্যান ইন্টারফেস (HID) ক্লাস ডিভাইস থেকে ইনপুট ইভেন্ট গ্রহণ করতে পারে। সমস্ত ডিভাইস যেমন একটি প্রমিত শ্রেণীর সংজ্ঞা প্রয়োগ করে না, তেমনি সমস্ত ডিভাইস বিদ্যমান ওয়েব প্ল্যাটফর্ম API-এর সাথে সামঞ্জস্যপূর্ণ বৈশিষ্ট্যগুলি প্রয়োগ করে না। এই ক্ষেত্রে WebUSB API সাইটগুলিকে একটি বিক্রেতা-নির্দিষ্ট ইন্টারফেস দাবি করার এবং সরাসরি তাদের পৃষ্ঠার মধ্যে থেকে এটির জন্য সমর্থন প্রয়োগ করার উপায় প্রদান করে সেই শূন্যতা পূরণ করতে পারে।

WebUSB-এর মাধ্যমে অ্যাক্সেসযোগ্য ডিভাইসের জন্য নির্দিষ্ট প্রয়োজনীয়তাগুলি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মে সামান্য পরিবর্তিত হয় কারণ অপারেটিং সিস্টেমগুলি কীভাবে USB ডিভাইসগুলি পরিচালনা করে তবে মৌলিক প্রয়োজনীয়তা হল একটি ডিভাইসে এমন ড্রাইভার থাকা উচিত নয় যেটি পৃষ্ঠাটি নিয়ন্ত্রণ করতে চায় এমন ইন্টারফেস দাবি করে৷ এটি OS বিক্রেতার দ্বারা প্রদত্ত একটি জেনেরিক ক্লাস ড্রাইভার বা বিক্রেতার দ্বারা প্রদত্ত একটি ডিভাইস ড্রাইভার হতে পারে৷ যেহেতু USB ডিভাইস একাধিক ইন্টারফেস প্রদান করতে পারে, যার প্রত্যেকটির নিজস্ব ড্রাইভার থাকতে পারে, তাই এমন একটি ডিভাইস তৈরি করা সম্ভব যার জন্য কিছু ইন্টারফেস ড্রাইভার দাবি করে এবং অন্যগুলি ব্রাউজারে অ্যাক্সেসযোগ্য রেখে দেওয়া হয়।

উদাহরণস্বরূপ, একটি হাই-এন্ড USB কীবোর্ড একটি HID ক্লাস ইন্টারফেস প্রদান করতে পারে যা অপারেটিং সিস্টেমের ইনপুট সাবসিস্টেম দ্বারা দাবি করা হবে এবং একটি বিক্রেতা-নির্দিষ্ট ইন্টারফেস যা একটি কনফিগারেশন টুল দ্বারা ব্যবহারের জন্য WebUSB-এর কাছে উপলব্ধ থাকে৷ এই টুলটি নির্মাতার ওয়েবসাইটে পরিবেশন করা যেতে পারে যা ব্যবহারকারীকে কোনো প্ল্যাটফর্ম-নির্দিষ্ট সফ্টওয়্যার ইনস্টল না করেই ডিভাইসের আচরণের দিকগুলি যেমন ম্যাক্রো কী এবং আলোর প্রভাবগুলি পরিবর্তন করতে দেয়। এই ধরনের একটি ডিভাইসের কনফিগারেশন বর্ণনাকারীর মত দেখতে হবে:

মান মাঠ বর্ণনা
কনফিগারেশন বর্ণনাকারী
0x09 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x02 bDescriptorType কনফিগারেশন বর্ণনাকারী
0x0039 w মোট দৈর্ঘ্য বর্ণনাকারীদের এই সিরিজের মোট দৈর্ঘ্য
0x02 bNum ইন্টারফেস ইন্টারফেসের সংখ্যা
0x01 bConfigurationValue কনফিগারেশন 1
0x00 iConfiguration কনফিগারেশন নাম (কোনও নয়)
0b1010000 bmAttributes রিমোট ওয়েকআপ সহ স্ব-চালিত ডিভাইস
0x32 bMaxPower সর্বোচ্চ শক্তি 2 mA বৃদ্ধিতে প্রকাশ করা হয়
ইন্টারফেস বর্ণনাকারী
0x09 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x04 bDescriptorType ইন্টারফেস বর্ণনাকারী
0x00 bInterfaceNumber ইন্টারফেস 0
0x00 বিকল্প সেটিং বিকল্প সেটিং 0 (ডিফল্ট)
0x01 bNumEndpoints 1 শেষবিন্দু
0x03 bInterfaceClass HID ইন্টারফেস ক্লাস
0x01 bInterfaceSubClass বুট ইন্টারফেস সাবক্লাস
0x01 bInterfaceProtocol কীবোর্ড
0x00 iInterface ইন্টারফেসের নাম (কোনও নয়)
HID বর্ণনাকারী
0x09 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x21 bDescriptorType HID বর্ণনাকারী
0x0101 bcdHID HID সংস্করণ 1.1
0x00 bCountryCode হার্ডওয়্যার টার্গেট দেশ
0x01 bNumDescriptors HID ক্লাস বর্ণনাকারীর সংখ্যা অনুসরণ করতে হবে
0x22 bDescriptorType বর্ণনাকারীর ধরন রিপোর্ট করুন
0x003F wDesscriptor দৈর্ঘ্য রিপোর্ট বর্ণনাকারীর মোট দৈর্ঘ্য
এন্ডপয়েন্ট বর্ণনাকারী
0x07 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x05 bDescriptorType এন্ডপয়েন্ট বর্ণনাকারী
0b10000001 bEndpointAddress শেষবিন্দু 1 (IN)
0b00000011 bmAttributes বাধা
0x0008 wMaxPacketSize 8 বাইট প্যাকেট
0x0A bInterval 10ms ব্যবধান
ইন্টারফেস বর্ণনাকারী
0x09 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x04 bDescriptorType ইন্টারফেস বর্ণনাকারী
0x01 bInterfaceNumber ইন্টারফেস 1
0x00 বিকল্প সেটিং বিকল্প সেটিং 0 (ডিফল্ট)
0x02 bNumEndpoints 2 শেষ বিন্দু
0xFF bInterfaceClass বিক্রেতা-নির্দিষ্ট ইন্টারফেস ক্লাস
0x00 bInterfaceSubClass
0x00 bInterfaceProtocol
0x00 iInterface ইন্টারফেসের নাম (কোনও নয়)
এন্ডপয়েন্ট বর্ণনাকারী
0x07 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x05 bDescriptorType এন্ডপয়েন্ট বর্ণনাকারী
0b10000010 bEndpointAddress শেষবিন্দু 1 (IN)
0b00000010 bmAttributes স্তূপ
0x0040 wMaxPacketSize 64 বাইট প্যাকেট
0x00 bInterval বাল্ক এন্ডপয়েন্টের জন্য N/A
এন্ডপয়েন্ট বর্ণনাকারী
0x07 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x05 bDescriptorType এন্ডপয়েন্ট বর্ণনাকারী
0b00000011 bEndpointAddress শেষবিন্দু 3 (আউট)
0b00000010 bmAttributes স্তূপ
0x0040 wMaxPacketSize 64 বাইট প্যাকেট
0x00 bInterval বাল্ক এন্ডপয়েন্টের জন্য N/A

কনফিগারেশন বর্ণনাকারীতে একাধিক বর্ণনাকারী একসাথে সংযুক্ত থাকে। প্রতিটি bLength এবং bDescriptorType ক্ষেত্র দিয়ে শুরু হয় যাতে তাদের চিহ্নিত করা যায়। প্রথম ইন্টারফেস হল একটি HID ইন্টারফেস যার সাথে যুক্ত HID বর্ণনাকারী এবং একটি একক শেষ পয়েন্ট যা অপারেটিং সিস্টেমে ইনপুট ইভেন্টগুলি সরবরাহ করতে ব্যবহৃত হয়। দ্বিতীয় ইন্টারফেসটি একটি বিক্রেতা-নির্দিষ্ট ইন্টারফেস যার দুটি শেষ পয়েন্ট রয়েছে যা ডিভাইসে কমান্ড পাঠাতে এবং বিনিময়ে প্রতিক্রিয়া পেতে ব্যবহার করা যেতে পারে।

WebUSB বর্ণনাকারী

যদিও WebUSB ফার্মওয়্যার পরিবর্তন ছাড়াই অনেক ডিভাইসের সাথে কাজ করতে পারে, WebUSB-এর জন্য সমর্থন নির্দেশ করে নির্দিষ্ট বর্ণনাকারী দিয়ে ডিভাইসটিকে চিহ্নিত করে অতিরিক্ত কার্যকারিতা সক্ষম করা হয়। উদাহরণস্বরূপ, আপনি একটি ল্যান্ডিং পৃষ্ঠা URL নির্দিষ্ট করতে পারেন যা ব্রাউজার ব্যবহারকারীকে নির্দেশ করতে পারে যখন আপনার ডিভাইসটি প্লাগ ইন করা থাকে।

Chrome-এ WebUSB বিজ্ঞপ্তির স্ক্রিনশট
WebUSB বিজ্ঞপ্তি।

বাইনারি ডিভাইস অবজেক্ট স্টোর (BOS) হল USB 3.0-এ প্রবর্তিত একটি ধারণা কিন্তু সংস্করণ 2.1-এর অংশ হিসাবে USB 2.0 ডিভাইসে ব্যাকপোর্ট করা হয়েছে। WebUSB-এর জন্য সমর্থন ঘোষণা করা শুরু হয় BOS বর্ণনাকারীতে নিম্নলিখিত প্ল্যাটফর্ম ক্যাপাবিলিটি ডিস্ক্রিপ্টর অন্তর্ভুক্ত করে:

মান মাঠ বর্ণনা
বাইনারি ডিভাইস অবজেক্ট স্টোর বর্ণনাকারী
0x05 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x0F bDescriptorType বাইনারি ডিভাইস অবজেক্ট স্টোর বর্ণনাকারী
0x001D w মোট দৈর্ঘ্য বর্ণনাকারীদের এই সিরিজের মোট দৈর্ঘ্য
0x01 bNumDeviceCaps BOS-এ ডিভাইসের ক্ষমতা বর্ণনাকারীর সংখ্যা
WebUSB প্ল্যাটফর্ম ক্ষমতা বর্ণনাকারী
0x18 দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x10 bDescriptorType ডিভাইস ক্ষমতা বর্ণনাকারী
0x05 bDevCapabilityType প্ল্যাটফর্ম ক্ষমতা বর্ণনাকারী
0x00 সংরক্ষিত
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} প্ল্যাটফর্ম সক্ষমতা ইউইউআইডি লিটল-এন্ডিয়ান ফরম্যাটে WebUSB প্ল্যাটফর্মের ক্ষমতা বর্ণনাকারী GUID
0x0100 বিসিডি সংস্করণ WebUSB বর্ণনাকারী সংস্করণ 1.0
0x01 bVendorCode WebUSB-এর জন্য bRequest মান
0x01 iLandingPage ল্যান্ডিং পৃষ্ঠার URL

প্ল্যাটফর্ম ক্ষমতা UUID এটিকে একটি WebUSB প্ল্যাটফর্ম ক্ষমতা বর্ণনাকারী হিসাবে চিহ্নিত করে, যা ডিভাইস সম্পর্কে প্রাথমিক তথ্য প্রদান করে। ব্রাউজারটি ডিভাইস সম্পর্কে আরও তথ্য আনতে এটি ডিভাইসে অতিরিক্ত অনুরোধ জারি করতে bVendorCode মান ব্যবহার করে। বর্তমানে নির্দিষ্ট করা একমাত্র অনুরোধ হল GET_URL যা একটি URL বর্ণনাকারী প্রদান করে। এগুলি স্ট্রিং ডিসক্রিপ্টারের মতো কিন্তু অল্প বাইটে ইউআরএল এনকোড করার জন্য ডিজাইন করা হয়েছে। "https://google.com" এর জন্য একটি URL বর্ণনাকারী দেখতে এইরকম হবে:

মান মাঠ বর্ণনা
URL বর্ণনাকারী
0x0D দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x03 bDescriptorType URL বর্ণনাকারী
0x01 বিস্কিম https://
"google.com" URL UTF-8 এনকোড করা URL কন্টেন্ট

যখন আপনার ডিভাইসটি ব্রাউজারে প্রথম প্লাগ করা হয় তখন এই মানক GET_DESCRIPTOR নিয়ন্ত্রণ স্থানান্তর ইস্যু করে BOS বর্ণনাকারী পড়ে:

bmRequestType অনুরোধ wValue wIndex wদৈর্ঘ্য ডেটা (প্রতিক্রিয়া)
0b10000000 0x06 0x0F00 0x0000 * BOS বর্ণনাকারী

এই অনুরোধটি সাধারণত দুবার করা হয়, প্রথমবার যথেষ্ট বড় wLength সহ যাতে হোস্ট একটি বড় স্থানান্তর না করেই wTotalLength ক্ষেত্রের মান খুঁজে বের করে এবং তারপর আবার যখন সম্পূর্ণ বর্ণনাকারীর দৈর্ঘ্য জানা যায়।

যদি WebUSB প্ল্যাটফর্ম ক্যাপাবিলিটি বর্ণনাকারীর iLandingPage ক্ষেত্রটি ব্রাউজারে একটি অ-শূন্য মান সেট করে থাকে তবে প্ল্যাটফর্ম সক্ষমতা বর্ণনাকারী থেকে bVendorCode মান সেট করা bRequest সহ একটি নিয়ন্ত্রণ স্থানান্তর ইস্যু করে একটি WebUSB-নির্দিষ্ট GET_URL অনুরোধ করে এবং wValue সেট করে iLandingPage মান। GET_URL ( 0x02 ) এর জন্য অনুরোধ কোড wIndex এ যায়:

bmRequestType অনুরোধ wValue wIndex wদৈর্ঘ্য ডেটা (প্রতিক্রিয়া)
0b11000000 0x01 0x0001 0x0002 * URL বর্ণনাকারী

আবার, এই অনুরোধটি দুইবার জারি করা হতে পারে যাতে প্রথমবার পড়ার জন্য বর্ণনাকারীর দৈর্ঘ্য পরীক্ষা করা যায়।

প্ল্যাটফর্ম-নির্দিষ্ট বিবেচনা

যদিও WebUSB API USB ডিভাইসগুলি অ্যাক্সেস করার জন্য একটি সামঞ্জস্যপূর্ণ ইন্টারফেস প্রদান করার চেষ্টা করে তখনও ডেভেলপারদের ডিভাইসগুলি অ্যাক্সেস করার জন্য ওয়েব ব্রাউজারের প্রয়োজনীয়তার মতো অ্যাপ্লিকেশনগুলিতে আরোপিত প্রয়োজনীয়তা সম্পর্কে সচেতন হওয়া উচিত।

ম্যাক অপারেটিং সিস্টেম

macOS এর জন্য বিশেষ কিছুর প্রয়োজন নেই। WebUSB ব্যবহার করে একটি ওয়েবসাইট ডিভাইসের সাথে সংযোগ করতে পারে এবং কার্নেল ড্রাইভার বা অন্য কোনো অ্যাপ্লিকেশন দ্বারা দাবি করা হয়নি এমন কোনো ইন্টারফেস দাবি করতে পারে।

লিনাক্স

লিনাক্স ম্যাকওএসের মতো কিন্তু ডিফল্টভাবে বেশিরভাগ ডিস্ট্রিবিউশন ইউএসবি ডিভাইস খোলার অনুমতি নিয়ে ব্যবহারকারীর অ্যাকাউন্ট সেট আপ করে না। 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() কল করে।

এছাড়াও ডেস্কটপ লিনাক্সের তুলনায় অ্যান্ড্রয়েডে আরও বেশি ডিভাইস অ্যাক্সেসযোগ্য হবে কারণ ডিফল্টভাবে কম ড্রাইভার অন্তর্ভুক্ত থাকে। একটি উল্লেখযোগ্য বাদ, উদাহরণস্বরূপ, ইউএসবি সিডিসি-এসিএম ক্লাস সাধারণত ইউএসবি-টু-সিরিয়াল অ্যাডাপ্টার দ্বারা প্রয়োগ করা হয় কারণ সিরিয়াল ডিভাইসের সাথে যোগাযোগের জন্য অ্যান্ড্রয়েড SDK-তে কোনো API নেই।

ChromeOS

ক্রোমওএস লিনাক্সের উপর ভিত্তি করে এবং সিস্টেম কনফিগারেশনে কোন পরিবর্তনের প্রয়োজন হয় না। permission_broker পরিষেবা USB ডিভাইসগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করে এবং ব্রাউজারকে সেগুলি অ্যাক্সেস করার অনুমতি দেবে যতক্ষণ না অন্তত একটি দাবিহীন ইন্টারফেস থাকে।

উইন্ডোজ

উইন্ডোজ ড্রাইভার মডেল একটি অতিরিক্ত প্রয়োজনীয়তা প্রবর্তন করে। একটি ব্যবহারকারী অ্যাপ্লিকেশন থেকে একটি USB ডিভাইস খোলার ক্ষমতা উপরোক্ত প্ল্যাটফর্মগুলি থেকে ভিন্ন, কোনো ড্রাইভার লোড না থাকলেও এটি ডিফল্ট নয়। পরিবর্তে একটি বিশেষ ড্রাইভার আছে, WinUSB, যেটিকে লোড করতে হবে যাতে ডিভাইসটি অ্যাক্সেস করার জন্য ইন্টারফেস অ্যাপ্লিকেশন ব্যবহার করা হয়। এটি সিস্টেমে ইনস্টল করা একটি কাস্টম ড্রাইভার ইনফরমেশন ফাইল (INF) দিয়ে করা যেতে পারে বা গণনার সময় Microsoft OS সামঞ্জস্য বর্ণনা প্রদান করার জন্য ডিভাইস ফার্মওয়্যার পরিবর্তন করে।

ড্রাইভার তথ্য ফাইল (INF)

একটি ড্রাইভার তথ্য ফাইল উইন্ডোজকে বলে যে প্রথমবার একটি ডিভাইসের সম্মুখীন হলে কি করতে হবে। যেহেতু ব্যবহারকারীর সিস্টেমে ইতিমধ্যেই WinUSB ড্রাইভার অন্তর্ভুক্ত রয়েছে তাই এই নতুন ইনস্টলেশন নিয়মের সাথে আপনার বিক্রেতা এবং পণ্যের আইডি যুক্ত করার জন্য INF ফাইলের জন্য যা প্রয়োজন। নীচের ফাইলটি একটি মৌলিক উদাহরণ। .inf এক্সটেনশন সহ একটি ফাইলে এটি সংরক্ষণ করুন, "X" দ্বারা চিহ্নিত বিভাগগুলি পরিবর্তন করুন, তারপরে এটিতে ডান ক্লিক করুন এবং প্রসঙ্গ মেনু থেকে "ইনস্টল" নির্বাচন করুন৷

[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 এর মাধ্যমে এর সাথে সংযোগ করতে পারে। একটি এলোমেলো GUID তৈরি করতে New-Guid PowerShell cmdlet বা একটি অনলাইন টুল ব্যবহার করুন।

উন্নয়নের উদ্দেশ্যে Zadig টুলটি WinUSB ড্রাইভারের সাথে USB ইন্টারফেসের জন্য লোড করা ড্রাইভার প্রতিস্থাপনের জন্য একটি সহজ ইন্টারফেস প্রদান করে।

মাইক্রোসফ্ট ওএস সামঞ্জস্যপূর্ণ বর্ণনাকারী

উপরের INF ফাইল পদ্ধতিটি কষ্টকর কারণ এটির জন্য প্রতিটি ব্যবহারকারীর মেশিনকে সময়ের আগে কনফিগার করা প্রয়োজন। উইন্ডোজ 8.1 এবং উচ্চতর কাস্টম ইউএসবি বর্ণনাকারী ব্যবহারের মাধ্যমে একটি বিকল্প অফার করে। এই বর্ণনাকারীগুলি উইন্ডোজ অপারেটিং সিস্টেমে তথ্য প্রদান করে যখন ডিভাইসটি প্রথম প্লাগ ইন করা হয় যা সাধারণত INF ফাইলে অন্তর্ভুক্ত করা হয়।

একবার আপনার WebUSB বর্ণনাকারী সেট আপ হয়ে গেলে Microsoft-এর OS সামঞ্জস্যপূর্ণ বর্ণনাকারী যোগ করাও সহজ। প্রথমে এই অতিরিক্ত প্ল্যাটফর্ম ক্ষমতা বর্ণনাকারীর সাথে BOS বর্ণনাকারীকে প্রসারিত করুন। এটির জন্য অ্যাকাউন্টে wTotalLength এবং bNumDeviceCaps আপডেট করা নিশ্চিত করুন।

মান মাঠ বর্ণনা
Microsoft OS 2.0 প্ল্যাটফর্ম ক্ষমতা বর্ণনাকারী
0x1C দৈর্ঘ্য এই বর্ণনাকারীর আকার
0x10 bDescriptorType ডিভাইস ক্ষমতা বর্ণনাকারী
0x05 bDevCapabilityType প্ল্যাটফর্ম ক্ষমতা বর্ণনাকারী
0x00 সংরক্ষিত
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} প্ল্যাটফর্ম সক্ষমতা ইউইউআইডি মাইক্রোসফ্ট ওএস 2.0 প্ল্যাটফর্ম সামঞ্জস্য বর্ণনাকারী GUID লিটল-এন্ডিয়ান বিন্যাসে
0x06030000 dwWindowsVersion ন্যূনতম সামঞ্জস্যপূর্ণ উইন্ডোজ সংস্করণ (উইন্ডোজ 8.1)
0x00B2 wMSOSDescriptorSetTotalLength বর্ণনাকারী সেটের মোট দৈর্ঘ্য
0x02 bMS_VendorCode আরও মাইক্রোসফ্ট বর্ণনাকারী পুনরুদ্ধারের জন্য bRequest মান
0x00 bAltEnumCode ডিভাইস বিকল্প গণনা সমর্থন করে না

WebUSB বর্ণনাকারীদের মতো আপনাকে এই বর্ণনাকারীদের সাথে সম্পর্কিত নিয়ন্ত্রণ স্থানান্তর দ্বারা ব্যবহার করার জন্য একটি bRequest মান বেছে নিতে হবে। এই উদাহরণে আমি 0x02 বাছাই করেছি। 0x07 , wIndex এ রাখা হয়েছে, ডিভাইস থেকে Microsoft OS 2.0 Descriptor সেট পুনরুদ্ধার করার কমান্ড।

bmRequestType অনুরোধ wValue wIndex wদৈর্ঘ্য ডেটা (প্রতিক্রিয়া)
0b11000000 0x02 0x0000 0x0007 * MS OS 2.0 বর্ণনাকারী সেট

একটি USB ডিভাইসের একাধিক ফাংশন থাকতে পারে এবং তাই বর্ণনাকারী সেটের প্রথম অংশটি বর্ণনা করে যে কোন ফাংশনগুলি অনুসরণ করে তার সাথে যুক্ত। নীচের উদাহরণটি একটি যৌগিক ডিভাইসের ইন্টারফেস 1 কনফিগার করে। বর্ণনাকারী OS কে এই ইন্টারফেস সম্পর্কে দুটি গুরুত্বপূর্ণ তথ্য দেয়। সামঞ্জস্যপূর্ণ আইডি বর্ণনাকারী উইন্ডোজকে বলে যে এই ডিভাইসটি WinUSB ড্রাইভারের সাথে সামঞ্জস্যপূর্ণ। রেজিস্ট্রি প্রপার্টি বর্ণনাকারীটি উপরের INF উদাহরণের [Dev_AddReg] বিভাগের অনুরূপভাবে কাজ করে, এই ফাংশনটিকে একটি ডিভাইস ইন্টারফেস GUID বরাদ্দ করার জন্য একটি রেজিস্ট্রি সম্পত্তি সেট করে।

মান মাঠ বর্ণনা
Microsoft OS 2.0 বর্ণনাকারী সেট হেডার
0x000A wদৈর্ঘ্য এই বর্ণনাকারীর আকার
0x0000 wDescriptorType বর্ণনাকারী সেট হেডার বর্ণনাকারী
0x06030000 dwWindowsVersion ন্যূনতম সামঞ্জস্যপূর্ণ উইন্ডোজ সংস্করণ (উইন্ডোজ 8.1)
0x00B2 w মোট দৈর্ঘ্য বর্ণনাকারী সেটের মোট দৈর্ঘ্য
Microsoft OS 2.0 কনফিগারেশন উপসেট হেডার
0x0008 wদৈর্ঘ্য এই বর্ণনাকারীর আকার
0x0001 wDescriptorType কনফিগারেশন উপসেট শিরোনাম বিবরণ.
0x00 bConfigurationValue কনফিগারেশন 1-এ প্রযোজ্য (সাধারণত 1 থেকে কনফিগারেশন সূচিত হওয়া সত্ত্বেও 0 থেকে সূচী করা হয়েছে)
0x00 সংরক্ষিত 0 এ সেট করতে হবে
0x00A8 w মোট দৈর্ঘ্য এই হেডার সহ উপসেটের মোট দৈর্ঘ্য
Microsoft OS 2.0 ফাংশন উপসেট হেডার
0x0008 wদৈর্ঘ্য এই বর্ণনাকারীর আকার
0x0002 wDescriptorType ফাংশন উপসেট হেডার বর্ণনাকারী
0x01 bFirstInterface ফাংশনের প্রথম ইন্টারফেস
0x00 সংরক্ষিত 0 এ সেট করতে হবে
0x00A0 w উপসেট দৈর্ঘ্য এই হেডার সহ উপসেটের মোট দৈর্ঘ্য
Microsoft OS 2.0 সামঞ্জস্যপূর্ণ আইডি বর্ণনাকারী
0x0014 wদৈর্ঘ্য এই বর্ণনাকারীর আকার
0x0003 wDescriptorType সামঞ্জস্যপূর্ণ আইডি বর্ণনাকারী
"WINUSB\0\0" সামঞ্জস্যপূর্ণ আইডি ASCII স্ট্রিং 8 বাইটে প্যাড করা হয়েছে
"\0\0\0\0\0\0\0\0" সাব-কম্প্যাটিবল আইডি ASCII স্ট্রিং 8 বাইটে প্যাড করা হয়েছে
মাইক্রোসফ্ট ওএস 2.0 রেজিস্ট্রি সম্পত্তি বর্ণনাকারী
0x0084 wদৈর্ঘ্য এই বর্ণনাকারীর আকার
0x0004 wDescriptorType রেজিস্ট্রি সম্পত্তি বর্ণনাকারী
0x0007 wPropertyDataType REG_MULTI_SZ
0x002A wPropertyNameLength সম্পত্তি নামের দৈর্ঘ্য
"DeviceInterfaceGUIDs\0" সম্পত্তির নাম UTF-16LE এ এনকোড করা নাল টার্মিনেটর সহ সম্পত্তির নাম
0x0050 wPropertyDataLength সম্পত্তির মূল্যের দৈর্ঘ্য
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" প্রপার্টি ডেটা GUID প্লাস দুটি নাল টার্মিনেটর UTF-16LE এ এনকোড করা হয়েছে

Windows শুধুমাত্র একবার এই তথ্যের জন্য ডিভাইসটি জিজ্ঞাসা করবে। যদি ডিভাইসটি বৈধ বর্ণনাকারীর সাথে সাড়া না দেয় তবে পরের বার ডিভাইসটি সংযুক্ত হলে এটি আর জিজ্ঞাসা করবে না। মাইক্রোসফ্ট USB ডিভাইস রেজিস্ট্রি এন্ট্রিগুলির একটি তালিকা প্রদান করেছে যা একটি ডিভাইস গণনা করার সময় তৈরি করা রেজিস্ট্রি এন্ট্রিগুলির বর্ণনা দেয়৷ পরীক্ষা করার সময় উইন্ডোজকে আবার বর্ণনাকারী পড়ার চেষ্টা করার জন্য একটি ডিভাইসের জন্য তৈরি করা এন্ট্রিগুলি মুছুন।

আরও তথ্যের জন্য মাইক্রোসফ্ট এর ব্লগ পোস্ট দেখুন কিভাবে এই বর্ণনাকারী ব্যবহার করতে হয়.

উদাহরণ

ওয়েবইউএসবি-সচেতন ডিভাইস প্রয়োগকারী উদাহরণ কোড যা ওয়েবইউএসবি বর্ণনাকারী এবং মাইক্রোসফ্ট ওএস বর্ণনাকারী উভয়ই অন্তর্ভুক্ত করে এই প্রকল্পগুলিতে পাওয়া যাবে: