यूएसबी डिवाइस

इस दस्तावेज़ में यूएसबी डिवाइसों से कनेक्ट करने के लिए, यूएसबी एपीआई का इस्तेमाल करने का तरीका बताया गया है. कुछ डिवाइस को यूएसबी एपीआई के ज़रिए ऐक्सेस नहीं किया जा सकता (ज़्यादा जानकारी के लिए, नीचे दिया गया चेतावनियां सेक्शन देखें). Chrome ऐप्स सीरियल और ब्लूटूथ डिवाइसों से भी कनेक्ट किया जा सकता है.

यूएसबी के बारे में बैकग्राउंड की जानकारी के लिए, आधिकारिक यूएसबी से जुड़ी ज़रूरी शर्तें देखें. NtShell में यूएसबी एक वाजिब क्रैश कोर्स है. इसमें आपको मदद मिल सकती है.

मेनिफ़ेस्ट की ज़रूरी शर्तें

यूएसबी एपीआई के लिए "usb" ज़रूरी है अनुमति मेनिफ़ेस्ट फ़ाइल में मिलेगी:

"permissions": [
  "usb"
]

साथ ही, फ़िंगरप्रिंट से आपको अपने सभी तरह के डिवाइसों के बारे में जानकारी देनी होगी को मेनिफ़ेस्ट फ़ाइल में ऐक्सेस करना है. हर तरह का यूएसबी डिवाइस एक वेंडर आईडी/प्रॉडक्ट आईडी से जुड़ा होता है (वीआईडी/पीआईडी) पेयर. usb.getDevices का इस्तेमाल करके डिवाइस को उनके वीआईडी/पीआईडी पेयर के हिसाब से गिना जा सकता है.

आपको usbDevices के तहत, हर उस तरह के डिवाइस के लिए वीआईडी/पीआईडी पेयर का एलान करना होगा जिनका आपको इस्तेमाल करना है की अनुमति देनी होगी, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:

"permissions": [
  {
    "usbDevices": [
      {
        "vendorId": 123,
        "productId": 456
      }
    ]
  }
]
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

Chrome 57 के बाद से, ऐप्लिकेशन मेनिफ़ेस्ट में सभी डिवाइस टाइप के बारे में जानकारी देना ज़रूरी है ChromeOS कीऑस्क ऐप्लिकेशन के तौर पर चल रहे ऐप्लिकेशन के लिए आरामदेह. कीऑस्क ऐप्लिकेशन के लिए, उन यूएसबी डिवाइसों को ऐक्सेस करने के लिए अनुमति का अनुरोध करने के लिए interfaceClass अनुमति प्रॉपर्टी:

  • किसी खास इंटरफ़ेस क्लास का यूएसबी इंटरफ़ेस लागू करना
  • उसमें यूएसबी डिवाइस की कोई खास कैटगरी हो

उदाहरण के लिए, usbDevices की यहां दी गई अनुमति से, किसी ऐप्लिकेशन को उन सभी यूएसबी डिवाइसों का ऐक्सेस मिलेगा जो प्रिंटर इंटरफ़ेस (इंटरफ़ेस क्लास कोड 7) और यूएसबी हब डिवाइसों (डिवाइस क्लास कोड) को लागू करना 9):

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

स्वीकार की जाने वाली interfaceClass वैल्यू की सूची देखने के लिए, यूएसबी क्लास कोड देखें.

interfaceClass प्रॉपर्टी को vendorId प्रॉपर्टी के साथ जोड़ा जा सकता है, ताकि सिर्फ़ यूएसबी का ऐक्सेस मिल सके किसी खास वेंडर के डिवाइसों की सूची देखें, जैसा कि यहां दिए गए उदाहरण में बताया गया है:

"permissions": [
  {
    "usbDevices": [
      {
        "vendorId": 123,
        "interfaceClass": 7
      }
    ]
  }
]
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

डिवाइस ढूंढना

यह पता लगाने के लिए कि उपयोगकर्ता के सिस्टम से एक या एक से ज़्यादा खास डिवाइस कनेक्ट हैं या नहीं, इसका इस्तेमाल करें: usb.getDevices तरीका:

chrome.usb.getDevices(enumerateDevicesOptions, callback);
पैरामीटर (टाइप)ब्यौरा
EnumrateDeviceOptions (ऑब्जेक्ट)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.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);
        }
      });
    });
  })
});

यूएसबी किसी डिवाइस से डेटा ट्रांसफ़र करना और पाना

यूएसबी प्रोटोकॉल चार तरह के ट्रांसफ़र के बारे में बताता है: कंट्रोल, बल्क, आइसोक्रोनस, और रोकने की सुविधा. इन ट्रांसफ़र के बारे में नीचे बताया गया है.

ट्रांसफ़र दोनों दिशाओं में हो सकते हैं: डिवाइस से होस्ट (इनबाउंड) और होस्ट-टू-डिवाइस (आउटबाउंड). पूरा होने की तारीख जैसे कि यूएसबी प्रोटोकॉल, इनबाउंड और आउटबाउंड, दोनों तरह के मैसेज होस्ट को भेजे जाने चाहिए (वह कंप्यूटर जिस पर Chrome ऐप्लिकेशन चलता है). इनबाउंड (डिवाइस-टू-होस्ट) मैसेज के लिए, होस्ट (शुरू किया गया) आपके JavaScript कोड से) "इनबाउंड" के तौर पर फ़्लैग किया गया मैसेज भेजता है डिवाइस से कनेक्ट करते हैं. जानकारी मैसेज, डिवाइस पर निर्भर करता है. हालांकि, आम तौर पर इससे उस चीज़ की पहचान हो जाती है जिसका अनुरोध किया जा रहा है से निकाल दिया है. इसके बाद डिवाइस, अनुरोध किया गया डेटा दिखाता है. डिवाइस के जवाब को यह मैनेज करता है: और ट्रांसफ़र करने के तरीके में बताए गए कॉलबैक पर एसिंक्रोनस रूप से डिलीवर किया जाता है. आउटबाउंड कॉल (होस्ट-टू-डिवाइस) मैसेज मिलता-जुलता है, लेकिन रिस्पॉन्स में डिवाइस से लौटाया गया डेटा शामिल नहीं होता.

डिवाइस से आने वाले हर मैसेज के लिए, तय किए गए कॉलबैक को एक इवेंट ऑब्जेक्ट मिलेगा ये प्रॉपर्टी:

प्रॉपर्टीब्यौरा
रिज़ल्ट कोड (इंटीजर)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);

कंट्रोल ट्रांसफ़र

कंट्रोल ट्रांसफ़र का इस्तेमाल आम तौर पर, यूएसबी को कॉन्फ़िगरेशन या कमांड पैरामीटर भेजने या पाने के लिए किया जाता है डिवाइस. कंट्रोल ट्रांसफ़र का तरीका हमेशा एंडपॉइंट 0 को भेजता/रीड करता है और कोईclaimInterface नहीं होता आवश्यक. यह तरीका आसान है और इसमें तीन पैरामीटर मिलते हैं:

chrome.usb.controlTransfer(connectionHandle, transferInfo, transferCallback)
पैरामीटर (टाइप)ब्यौरा
connectionHandleusb.openDevice कॉलबैक में ऑब्जेक्ट मिला.
transferInfoनीचे दी गई टेबल के मानों के साथ पैरामीटर ऑब्जेक्ट. ज़्यादा जानकारी के लिए, यूएसबी डिवाइस के प्रोटोकॉल से जुड़ी ज़रूरी शर्तें देखें.
transferCallback()ट्रांसफ़र पूरा होने के बाद शुरू किया जाता है.

transferInfo ऑब्जेक्ट के लिए वैल्यू:

मानब्यौरा
requestType (स्ट्रिंग)"वेंडर", "स्टैंडर्ड", "क्लास" या "रिज़र्व्ड".
पाने वाला (स्ट्रिंग)"डिवाइस", "इंटरफ़ेस", "एंडपॉइंट" या "अन्य" शामिल हों.
दिशा (स्ट्रिंग)"इंच" या "आउट" शामिल हैं. "इन" दिशा निर्देश का इस्तेमाल डिवाइस को यह सूचित करने के लिए किया जाता है कि
इसे होस्ट को जानकारी भेजनी चाहिए. यूएसबी बस
बस में सभी बातचीत होस्ट की जाएगी, इसलिए "इन" का इस्तेमाल करें ट्रांसफ़र करें, ताकि डिवाइस को
जानकारी वापस भेजने की अनुमति मिल सके.
अनुरोध (पूर्णांक)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है.
मान (पूर्णांक)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है.
इंडेक्स (पूर्णांक)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है.
लंबाई (पूर्णांक)सिर्फ़ तब इस्तेमाल किया जाता है, जब दिशा "in" हो. डिवाइस को यह सूचना देता है कि इतने डेटा के अंदर होस्ट को जवाब में डेटा मिलने की उम्मीद है.
डेटा (अरेबफ़र)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है. यह तब ज़रूरी होता है, जब निर्देश "आउट" पर सेट हो.

उदाहरण:

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);

ISOCHRONOUS ट्रांसफ़र

आइसोक्रोनस ट्रांसफ़र, यूएसबी ट्रांसफ़र का सबसे जटिल टाइप है. आम तौर पर, स्ट्रीम के लिए इनका इस्तेमाल किया जाता है डेटा हो सकता है. जैसे, वीडियो और साउंड. आइसोक्रोनस ट्रांसफ़र (इनबाउंड या आउटबाउंड) शुरू करने के लिए, आपको को usb.isochronousTransfer तरीके का इस्तेमाल करना होगा:

chrome.usb.isochronousTransfer(connectionHandle, isochronousTransferInfo, transferCallback)
पैरामीटरब्यौरा
connectionHandleusb.openDevice कॉलबैक में ऑब्जेक्ट मिला.
isochronousTransferInfoनीचे दी गई टेबल में दिए गए मानों के साथ पैरामीटर ऑब्जेक्ट.
transferCallback()ट्रांसफ़र पूरा होने के बाद शुरू किया जाता है.

isochronousTransferInfo ऑब्जेक्ट के लिए वैल्यू:

मानब्यौरा
ट्रांसफ़र जानकारी (ऑब्जेक्ट)इन एट्रिब्यूट वाला ऑब्जेक्ट:
निर्देश (स्ट्रिंग): "in" या "out".
एंडपॉइंट (पूर्णांक): जिसे आपके डिवाइस ने तय किया है. आम तौर पर, इसे यूएसबी की जांच करने वाले टूल को देखकर पता लगाया जा सकता है. जैसे, lsusb -v
अवधि (पूर्णांक): इसका इस्तेमाल सिर्फ़ तब किया जाता है, जब दिशा "in" हो. डिवाइस को यह सूचना देता है कि इतने डेटा के बराबर डेटा, होस्ट को रिस्पॉन्स के लिए चाहिए.
इसे कम से कम packets × packetLength होना चाहिए.
डेटा (कलेक्शनबफ़र): यह आपके डिवाइस के प्रोटोकॉल की मदद से तय किया जाता है; केवल तभी उपयोग किया जाता है, जब दिशा "आउट" हो.
पैकेट (इंटीजर)इस ट्रांसफ़र में पैकेट की कुल संख्या.
पैकेट की लंबाई (इंटीजर)इस ट्रांसफ़र में हर पैकेट की अनुमानित लंबाई.

उदाहरण:

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

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

chrome.usb.isochronousTransfer(connectionHandle, isoTransferInfo, optionalCallback);
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

BULK ट्रांसफ़र

बल्क ट्रांसफ़र का इस्तेमाल आम तौर पर, संवेदनशील डेटा को ट्रांसफ़र करने के लिए किया जाता है. यह ऐसा डेटा तरीका है. usb.bulkTransfer में तीन पैरामीटर मौजूद हैं:

chrome.usb.bulkTransfer(connectionHandle, transferInfo, transferCallback);
पैरामीटरब्यौरा
connectionHandleusb.openDevice कॉलबैक में ऑब्जेक्ट मिला.
transferInfoनीचे दी गई टेबल में दिए गए मानों के साथ पैरामीटर ऑब्जेक्ट.
transferCallbackट्रांसफ़र पूरा होने के बाद शुरू किया जाता है.

transferInfo ऑब्जेक्ट के लिए वैल्यू:

मानब्यौरा
दिशा (स्ट्रिंग)"इंच" या "आउट" शामिल हैं.
एंडपॉइंट (इंटीजर)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है.
लंबाई (पूर्णांक)सिर्फ़ तब इस्तेमाल किया जाता है, जब दिशा "in" हो. डिवाइस को यह सूचना देता है कि इतने डेटा के अंदर होस्ट को जवाब में डेटा मिलने की उम्मीद है.
डेटा (ArrayBuffer)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है; केवल तभी उपयोग किया जाता है, जब दिशा "आउट" हो.

उदाहरण:

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

ट्रांसफ़र रोकें

बिना रुकावट ट्रांसफ़र करने की सुविधा का इस्तेमाल, कुछ समय के लिए संवेदनशील जानकारी के लिए किया जाता है. क्योंकि सभी यूएसबी कम्यूनिकेशन होस्ट कोड का इस्तेमाल करने पर, डिवाइस की समय-समय पर पोलिंग होती है. साथ ही, इसकी वजह से IN में रुकावट आती है ऐसी ट्रांसफ़र की जा सकती है जिनकी वजह से डिवाइस, डेटा को वापस भेज सकता है. ऐसा तब होता है, जब डिवाइस में कोई रुकावट आने पर उसे डेटा वापस मिल जाए (डिवाइस में रखा जाता है). usb.interruptTransfer में तीन पैरामीटर होते हैं:

chrome.usb.interruptTransfer(connectionHandle, transferInfo, transferCallback);
पैरामीटरब्यौरा
connectionHandleusb.openDevice कॉलबैक में ऑब्जेक्ट मिला.
transferInfoनीचे दी गई टेबल में दिए गए मानों के साथ पैरामीटर ऑब्जेक्ट.
transferCallbackट्रांसफ़र पूरा होने के बाद शुरू किया जाता है. ध्यान दें कि इस कॉलबैक में डिवाइस का जवाब शामिल नहीं होता. कॉलबैक का मकसद आपके कोड को यह बताना है कि एसिंक्रोनस ट्रांसफ़र अनुरोधों को प्रोसेस कर दिया गया है.

transferInfo ऑब्जेक्ट के लिए वैल्यू:

मानब्यौरा
दिशा (स्ट्रिंग)"इंच" या "आउट" शामिल हैं.
एंडपॉइंट (इंटीजर)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है.
लंबाई (पूर्णांक)सिर्फ़ तब इस्तेमाल किया जाता है, जब दिशा "in" हो. डिवाइस को यह सूचना देता है कि इतने डेटा के अंदर होस्ट को जवाब में डेटा मिलने की उम्मीद है.
डेटा (ArrayBuffer)यह आपके डिवाइस के प्रोटोकॉल के हिसाब से तय होता है; केवल तभी उपयोग किया जाता है, जब दिशा "आउट" हो.

उदाहरण:

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

चेतावनियां

यूएसबी एपीआई से सभी डिवाइसों को ऐक्सेस नहीं किया जा सकता. आम तौर पर, डिवाइस ऐक्सेस नहीं किए जा सकते, क्योंकि या तो ऑपरेटिंग सिस्टम का कर्नेल या कोई स्थानीय ड्राइवर उन्हें उपयोगकर्ता स्पेस कोड से दूर रखता है. कुछ सूचनाएं मिल रही हैं उदाहरण के लिए, OSX सिस्टम पर एचआईडी प्रोफ़ाइल वाले डिवाइस और यूएसबी पेन ड्राइव.

ज़्यादातर Linux सिस्टम पर, यूएसबी डिवाइसों को डिफ़ॉल्ट रूप से रीड ओनली अनुमतियों के साथ मैप किया जाता है. खोलने के लिए डिवाइस का इस्तेमाल करते हैं, तो आपके उपयोगकर्ता के पास उसमें भी लिखने का ऐक्सेस होना चाहिए. इसका एक आसान समाधान है कि 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 को कॉल करें. आपके लिए अनुमति ब्रोकर यह काम करता है.