ইউএসবি ডিভাইস

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

USB সম্পর্কে ব্যাকগ্রাউন্ড তথ্যের জন্য, অফিসিয়াল USB স্পেসিফিকেশন দেখুন। ইউএসবি ইন এ নাটশেল একটি যুক্তিসঙ্গত ক্র্যাশ কোর্স যা আপনি সহায়ক বলে মনে করতে পারেন।

ম্যানিফেস্ট প্রয়োজনীয়তা

USB API-এর ম্যানিফেস্ট ফাইলে "usb" অনুমতি প্রয়োজন:

"permissions": [
  "usb"
]

উপরন্তু, আঙুল-মুদ্রণ প্রতিরোধ করার জন্য, ম্যানিফেস্ট ফাইলে আপনি যে সমস্ত ধরনের ডিভাইস অ্যাক্সেস করতে চান তা ঘোষণা করতে হবে। প্রতিটি ধরনের ইউএসবি ডিভাইস একটি ভেন্ডর আইডি/প্রোডাক্ট আইডি (ভিআইডি/পিআইডি) জোড়ার সাথে মিলে যায়। আপনি usb.getDevices ব্যবহার করে ডিভাইসগুলিকে তাদের VID/PID জোড়া দ্বারা গণনা করতে পারেন৷

আপনি আপনার অ্যাপের ম্যানিফেস্ট ফাইলে usbDevices অনুমতির অধীনে ব্যবহার করতে চান এমন প্রতিটি ডিভাইসের জন্য আপনাকে অবশ্যই VID/PID জোড়া ঘোষণা করতে হবে, যেমনটি নীচের উদাহরণে দেখানো হয়েছে:

"permissions": [
  {
    "usbDevices": [
      {
        "vendorId": 123,
        "productId": 456
      }
    ]
  }
]

Chrome 57 থেকে, অ্যাপ ম্যানিফেস্টে সমস্ত ডিভাইসের ধরন ঘোষণা করার প্রয়োজনীয়তা ChromeOS কিয়স্ক অ্যাপ হিসাবে চলমান অ্যাপগুলির জন্য শিথিল করা হয়েছে। কিওস্ক অ্যাপগুলির জন্য, আপনি USB ডিভাইসগুলি অ্যাক্সেস করার অনুমতির অনুরোধ করতে interfaceClass অনুমতি সম্পত্তি ব্যবহার করতে পারেন যা:

  • একটি নির্দিষ্ট ইন্টারফেস ক্লাসের একটি USB ইন্টারফেস প্রয়োগ করুন
  • একটি নির্দিষ্ট USB ডিভাইস ক্লাস আছে

উদাহরণস্বরূপ, নিম্নলিখিত usbDevices অনুমতি একটি অ্যাপকে সমস্ত USB ডিভাইসে অ্যাক্সেস দেয় যা একটি প্রিন্টার ইন্টারফেস (ইন্টারফেস ক্লাস কোড 7) এবং USB হাব ডিভাইসগুলিতে (ডিভাইস ক্লাস কোড 9) প্রয়োগ করে:

"permissions": [
  {
    "usbDevices": [
      {"interfaceClass": 7},
      {"interfaceClass": 9}
    ]
  }
]

গ্রহণযোগ্য interfaceClass মানের তালিকার জন্য, USB ক্লাস কোডগুলি দেখুন।

একটি নির্দিষ্ট বিক্রেতার কাছ থেকে শুধুমাত্র USB ডিভাইসগুলিতে অ্যাক্সেস পেতে interfaceClass সম্পত্তিটি vendorId সম্পত্তির সাথে একত্রিত করা যেতে পারে, যেমনটি নিম্নলিখিত উদাহরণ দ্বারা প্রদর্শিত হয়েছে:

"permissions": [
  {
    "usbDevices": [
      {
        "vendorId": 123,
        "interfaceClass": 7
      }
    ]
  }
]

একটি ডিভাইস খোঁজা

এক বা একাধিক নির্দিষ্ট ডিভাইস ব্যবহারকারীর সিস্টেমের সাথে সংযুক্ত কিনা তা নির্ধারণ করতে, usb.getDevices পদ্ধতি ব্যবহার করুন:

chrome.usb.getDevices(enumerateDevicesOptions, callback);
পরামিতি (প্রকার) বর্ণনা
DevicesOptions গণনা করুন (অবজেক্ট) বাসে সঠিক ধরনের ডিভাইস খুঁজে পেতে ব্যবহৃত vendorId (লম্বা) এবং productId (লম্বা) উভয়ই নির্দিষ্ট করে এমন একটি বস্তু। আপনার ম্যানিফেস্টে অবশ্যই usbDevices অনুমতি বিভাগ ঘোষণা করতে হবে যাতে আপনার অ্যাপ অ্যাক্সেস করতে চায় এমন সমস্ত vendorId এবং deviceId জোড়া তালিকাভুক্ত করে।
কলব্যাক (ফাংশন) ডিভাইস গণনা শেষ হলে কল করা হয়। কলব্যাকটি একটি প্যারামিটারের সাথে কার্যকর করা হবে, তিনটি বৈশিষ্ট্য সহ Device অবজেক্টের একটি অ্যারে: device , vendorId , productId । ডিভাইসের বৈশিষ্ট্য একটি সংযুক্ত ডিভাইসের জন্য একটি স্থিতিশীল শনাক্তকারী। ডিভাইসটি আনপ্লাগ না হওয়া পর্যন্ত এটি পরিবর্তন হবে না। শনাক্তকারীর বিশদটি অস্বচ্ছ এবং পরিবর্তন সাপেক্ষে। তার বর্তমান প্রকারের উপর নির্ভর করবেন না।
কোনো ডিভাইস পাওয়া না গেলে, অ্যারে খালি থাকবে।

উদাহরণ:

function onDeviceFound(devices) {
  this.devices=devices;
  if (devices) {
    if (devices.length > 0) {
      console.log("Device(s) found: "+devices.length);
    } else {
      console.log("Device could not be found");
    }
  } else {
    console.log("Permission denied.");
  }
}

chrome.usb.getDevices({"vendorId": vendorId, "productId": productId}, onDeviceFound);

একটি ডিভাইস খুলছে

একবার Device অবজেক্টগুলি ফেরত দিলে, আপনি একটি সংযোগ হ্যান্ডেল পেতে usb.openDevice ব্যবহার করে একটি ডিভাইস খুলতে পারেন। আপনি সংযোগ হ্যান্ডলগুলি ব্যবহার করে শুধুমাত্র USB ডিভাইসগুলির সাথে যোগাযোগ করতে পারেন৷

সম্পত্তি বর্ণনা
যন্ত্র usb.getDevices কলব্যাকে অবজেক্ট গৃহীত হয়েছে।
ডেটা (অ্যারেবাফার) ট্রান্সফার ইনবাউন্ড হলে ডিভাইসের পাঠানো ডেটা ধারণ করে।

উদাহরণ:

var usbConnection = null;
var onOpenCallback = function(connection) {
  if (connection) {
    usbConnection = connection;
    console.log("Device opened.");
  } else {
    console.log("Device failed to open.");
  }
};

chrome.usb.openDevice(device, onOpenCallback);

খোলার প্রক্রিয়া সহজ করার জন্য, আপনি usb.findDevices পদ্ধতি ব্যবহার করতে পারেন, যা একটি কলে ডিভাইসগুলিকে গণনা করে, অ্যাক্সেসের অনুরোধ করে এবং খোলে:

chrome.usb.findDevices({"vendorId": vendorId, "productId": productId, "interfaceId": interfaceId}, callback);

যা সমতুল্য:

chrome.usb.getDevices({"vendorId": vendorId, "productId": productId}, function (devices) {
  if (!devices) {
    console.log("Error enumerating devices.");
    callback();
    return;
  }
  var connections = [], pendingAccessRequests = devices.length;
  devices.forEach(function (device) {
    chrome.usb.requestAccess(interfaceId, function () {
      // No need to check for errors at this point.
      // Nothing can be done if an error occurs anyway. You should always try
      // to open the device.
      chrome.usb.openDevices(device, function (connection) {
        if (connection) connections.push(connection);
        pendingAccessRequests--;
        if (pendingAccessRequests == 0) {
          callback(connections);
        }
      });
    });
  })
});

USB স্থানান্তর এবং একটি ডিভাইস থেকে তথ্য গ্রহণ

ইউএসবি প্রোটোকল চার ধরনের স্থানান্তর সংজ্ঞায়িত করে: নিয়ন্ত্রণ , বাল্ক , আইসোক্রোনাস এবং ইন্টারাপ্ট । এই স্থানান্তর নীচে বর্ণনা করা হয়.

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

ডিভাইস থেকে প্রতিটি বার্তার জন্য, নির্দিষ্ট কলব্যাক নিম্নলিখিত বৈশিষ্ট্য সহ একটি ইভেন্ট অবজেক্ট পাবে:

সম্পত্তি বর্ণনা
ফলাফল কোড (পূর্ণসংখ্যা) 0 হল সাফল্য; অন্যান্য মান ব্যর্থতা নির্দেশ করে। একটি ত্রুটি স্ট্রিং হতে পারে
ব্যর্থ হলে chrome.extension.lastError থেকে পড়ুন
জ্ঞাপিত.
ডেটা (অ্যারেবাফার) ট্রান্সফার ইনবাউন্ড হলে ডিভাইসের পাঠানো ডেটা ধারণ করে।

উদাহরণ:

var onTransferCallback = function(event) {
   if (event && event.resultCode === 0 && event.data) {
     console.log("got " + event.data.byteLength + " bytes");
   }
};

chrome.usb.bulkTransfer(connectionHandle, transferInfo, onTransferCallback);

নিয়ন্ত্রণ স্থানান্তর

নিয়ন্ত্রণ স্থানান্তর সাধারণত একটি USB ডিভাইসে কনফিগারেশন বা কমান্ড পরামিতি পাঠাতে বা গ্রহণ করতে ব্যবহৃত হয়। কন্ট্রোল ট্রান্সফার পদ্ধতি সর্বদা এন্ডপয়েন্ট 0 থেকে পাঠায়/পড়ে, এবং কোন ক্লেম ইন্টারফেসের প্রয়োজন নেই। পদ্ধতিটি সহজ এবং তিনটি পরামিতি গ্রহণ করে:

chrome.usb.controlTransfer(connectionHandle, transferInfo, transferCallback)
প্যারামিটার (প্রকার) বর্ণনা
সংযোগ হ্যান্ডেল বস্তুটি usb.openDevice কলব্যাকে গৃহীত হয়েছে।
তথ্য স্থানান্তর নীচের টেবিল থেকে মান সহ প্যারামিটার অবজেক্ট। বিস্তারিত জানার জন্য আপনার USB ডিভাইস প্রোটোকল স্পেসিফিকেশন চেক করুন।
ট্রান্সফার কলব্যাক() স্থানান্তর সম্পন্ন হলে আহ্বান করা হয়।

transferInfo বস্তুর মান:

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

উদাহরণ:

var transferInfo = {
  "requestType": "vendor",
   "recipient": "device",
  "direction": "out",
  "request":  0x31,
  "value": 120,
  "index": 0,
  // Note that the ArrayBuffer, not the TypedArray itself is used.
  "data": new Uint8Array([4, 8, 15, 16, 23, 42]).buffer
};
chrome.usb.controlTransfer(connectionHandle, transferInfo, optionalCallback);

আইসোক্রোনাস স্থানান্তর

আইসোক্রোনাস ট্রান্সফার হল সবচেয়ে জটিল ধরনের ইউএসবি ট্রান্সফার। এগুলি সাধারণত ভিডিও এবং শব্দের মতো ডেটা স্ট্রিমের জন্য ব্যবহৃত হয়। একটি আইসোক্রোনাস স্থানান্তর শুরু করতে (হয় ইনবাউন্ড বা আউটবাউন্ড), আপনাকে অবশ্যই usb.isochronousTransfer পদ্ধতি ব্যবহার করতে হবে:

chrome.usb.isochronousTransfer(connectionHandle, isochronousTransferInfo, transferCallback)
প্যারামিটার বর্ণনা
সংযোগ হ্যান্ডেল বস্তুটি usb.openDevice কলব্যাকে গৃহীত হয়েছে।
আইসোক্রোনাস ট্রান্সফার ইনফো নিচের টেবিলের মান সহ প্যারামিটার অবজেক্ট।
ট্রান্সফার কলব্যাক() স্থানান্তর সম্পন্ন হলে আহ্বান করা হয়।

isochronousTransferInfo অবজেক্টের মান:

মান বর্ণনা
স্থানান্তর তথ্য (বস্তু) নিম্নলিখিত বৈশিষ্ট্য সহ একটি বস্তু:
দিক (স্ট্রিং): "ইন" বা "আউট"।
শেষ বিন্দু (পূর্ণসংখ্যা): আপনার ডিভাইস দ্বারা সংজ্ঞায়িত। সাধারণত lsusb -v এর মতো একটি USB ইনস্ট্রোস্পেকশন টুল দেখে পাওয়া যাবে
দৈর্ঘ্য (পূর্ণসংখ্যা): শুধুমাত্র তখনই ব্যবহৃত হয় যখন দিক "ইন" হয়। ডিভাইসটিকে সূচিত করে যে এটি হোস্টের প্রতিক্রিয়া হিসাবে আশা করা ডেটার পরিমাণ।
কমপক্ষে packets × packetLength হওয়া উচিত।
ডেটা (অ্যারেবাফার): আপনার ডিভাইসের প্রোটোকল দ্বারা সংজ্ঞায়িত; শুধুমাত্র তখনই ব্যবহৃত হয় যখন দিক "আউট" হয়।
প্যাকেট (পূর্ণসংখ্যা) এই স্থানান্তরে প্রত্যাশিত প্যাকেটের মোট সংখ্যা৷
প্যাকেটের দৈর্ঘ্য (পূর্ণসংখ্যা) এই স্থানান্তরে প্রতিটি প্যাকেটের প্রত্যাশিত দৈর্ঘ্য।

উদাহরণ:

var transferInfo = {
  "direction": "in",
  "endpoint": 1,
  "length": 2560
};

var isoTransferInfo = {
  "transferInfo": transferInfo,
  "packets": 20,
  "packetLength": 128
};

chrome.usb.isochronousTransfer(connectionHandle, isoTransferInfo, optionalCallback);

বাল্ক স্থানান্তর

বাল্ক স্থানান্তরগুলি সাধারণত একটি নির্ভরযোগ্য উপায়ে প্রচুর পরিমাণে অ-সময়-সংবেদনশীল ডেটা স্থানান্তর করতে ব্যবহৃত হয়। usb.bulkTransfer এর তিনটি প্যারামিটার রয়েছে:

chrome.usb.bulkTransfer(connectionHandle, transferInfo, transferCallback);
প্যারামিটার বর্ণনা
সংযোগ হ্যান্ডেল বস্তুটি usb.openDevice কলব্যাকে গৃহীত হয়েছে।
তথ্য স্থানান্তর নিচের টেবিলের মান সহ প্যারামিটার অবজেক্ট।
ট্রান্সফার কলব্যাক স্থানান্তর সম্পন্ন হলে আহ্বান করা হয়।

transferInfo বস্তুর মান:

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

উদাহরণ:

var transferInfo = {
  "direction": "out",
  "endpoint": 1,
  "data": new Uint8Array([4, 8, 15, 16, 23, 42]).buffer
};

স্থানান্তর বাধা

বিঘ্নিত স্থানান্তর সময় সংবেদনশীল তথ্য অল্প পরিমাণ ব্যবহার করা হয়. যেহেতু সমস্ত USB যোগাযোগ হোস্ট দ্বারা সূচিত হয়, হোস্ট কোড সাধারণত ডিভাইসটিকে পর্যায়ক্রমে পোল করে, ইন্টারাপ্ট IN ট্রান্সফার পাঠায় যা ডিভাইসটিকে ডেটা ফেরত পাঠাবে যদি বাধা সারিতে কিছু থাকে (ডিভাইস দ্বারা রক্ষণাবেক্ষণ করা হয়)। usb.interruptTransfer এর তিনটি প্যারামিটার রয়েছে:

chrome.usb.interruptTransfer(connectionHandle, transferInfo, transferCallback);
প্যারামিটার বর্ণনা
সংযোগ হ্যান্ডেল বস্তুটি usb.openDevice কলব্যাকে গৃহীত হয়েছে।
তথ্য স্থানান্তর নিচের টেবিলের মান সহ প্যারামিটার অবজেক্ট।
ট্রান্সফার কলব্যাক স্থানান্তর সম্পন্ন হলে আহ্বান করা হয়। লক্ষ্য করুন যে এই কলব্যাকে ডিভাইসের প্রতিক্রিয়া নেই৷ কলব্যাকের উদ্দেশ্য হল আপনার কোডকে জানানো যে অ্যাসিঙ্ক্রোনাস স্থানান্তর অনুরোধগুলি প্রক্রিয়া করা হয়েছে৷

transferInfo বস্তুর মান:

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

উদাহরণ:

var transferInfo = {
  "direction": "in",
  "endpoint": 1,
  "length": 2
};
chrome.usb.interruptTransfer(connectionHandle, transferInfo, optionalCallback);

সতর্কতা

USB API এর মাধ্যমে সমস্ত ডিভাইস অ্যাক্সেস করা যায় না। সাধারণভাবে, ডিভাইসগুলি অ্যাক্সেসযোগ্য নয় কারণ হয় অপারেটিং সিস্টেমের কার্নেল বা একটি নেটিভ ড্রাইভার ব্যবহারকারী স্পেস কোড থেকে সেগুলিকে আটকে রাখে। কিছু উদাহরণ হল OSX সিস্টেমে HID প্রোফাইল সহ ডিভাইস এবং USB পেনড্রাইভ।

বেশিরভাগ লিনাক্স সিস্টেমে, ইউএসবি ডিভাইসগুলিকে ডিফল্টরূপে শুধুমাত্র পঠনযোগ্য অনুমতি দিয়ে ম্যাপ করা হয়। এই API এর মাধ্যমে একটি ডিভাইস খুলতে, আপনার ব্যবহারকারীর এটিতেও লেখার অ্যাক্সেস থাকতে হবে। একটি সহজ সমাধান একটি udev নিয়ম সেট করা হয়. নিম্নলিখিত বিষয়বস্তু সহ একটি ফাইল /etc/udev/rules.d/50-yourdevicename.rules তৈরি করুন:

SUBSYSTEM=="usb", ATTR{idVendor}=="[yourdevicevendor]", MODE="0664", GROUP="plugdev"

তারপর, শুধু udev ডেমন পুনরায় চালু করুন: service udev restart । আপনি এই পদক্ষেপগুলি অনুসরণ করে ডিভাইসের অনুমতিগুলি সঠিকভাবে সেট করা আছে কিনা তা পরীক্ষা করতে পারেন:

  • বাস এবং ডিভাইস নম্বর খুঁজতে lsusb চালান।
  • ls -al /dev/bus/usb/[bus]/[device] চালান। এই ফাইলটি "plugdev" গ্রুপের মালিকানাধীন হওয়া উচিত এবং গ্রুপ লেখার অনুমতি থাকতে হবে।

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

ChromeOS এ, শুধু usb.requestAccess কল করুন। অনুমতি দালাল আপনার জন্য এটি করে.