ব্লুটুথ

ব্লুটুথ এবং ব্লুটুথ লো এনার্জি ডিভাইসগুলির সাথে যোগাযোগের জন্য ব্লুটুথ , ব্লুটুথ সকেট এবং ব্লুটুথ লো এনার্জি এপিআইগুলি কীভাবে ব্যবহার করবেন এই নথিটি বর্ণনা করে৷

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

প্রয়োজনীয়তা প্রকাশ করুন

ব্লুটুথ ব্যবহার করে এমন Chrome অ্যাপ্লিকেশানগুলির জন্য, ম্যানিফেস্টে ব্লুটুথ এন্ট্রি যোগ করুন এবং উপযুক্ত হলে, আপনি সকেট এবং/অথবা নিম্ন শক্তি APIগুলির সাথে প্রয়োগ করতে চান কিনা সেই সাথে আপনি যে প্রোফাইল, প্রোটোকল বা পরিষেবাগুলি প্রয়োগ করতে চান তার UUIDগুলি নির্দিষ্ট করুন৷

উদাহরণস্বরূপ একটি সকেট বাস্তবায়নের জন্য:

"bluetooth": {
  "uuids": [ "1105", "1106" ],
  "socket": true
}

এবং একটি নিম্ন শক্তি বাস্তবায়নের জন্য:

"bluetooth": {
  "uuids": [ "180D", "1809", "180F" ],
  "low_energy": true
}

শুধুমাত্র অ্যাডাপ্টারের অবস্থা অ্যাক্সেস করতে, কাছাকাছি ডিভাইসগুলি আবিষ্কার করতে এবং ডিভাইসগুলি সম্পর্কে প্রাথমিক তথ্য পেতে, শুধুমাত্র এন্ট্রিটি প্রয়োজন:

"bluetooth": {}

অ্যাডাপ্টারের তথ্য

অ্যাডাপ্টারের অবস্থা প্রাপ্ত করা হচ্ছে

ব্লুটুথ অ্যাডাপ্টারের অবস্থা পেতে, bluetooth.getAdapterState পদ্ধতি ব্যবহার করুন:

chrome.bluetooth.getAdapterState(function(adapter) {
  console.log("Adapter " + adapter.address + ": " + adapter.name);
});

অ্যাডাপ্টার বিজ্ঞপ্তি

Bluetooth.onAdapterStateChanged ইভেন্ট পাঠানো হয় যখনই অ্যাডাপ্টারের অবস্থা পরিবর্তন হয়। এটি ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, অ্যাডাপ্টার রেডিও কখন চালু বা বন্ধ করা হয় তা নির্ধারণ করতে।

var powered = false;
chrome.bluetooth.getAdapterState(function(adapter) {
  powered = adapter.powered;
});

chrome.bluetooth.onAdapterStateChanged.addListener(
  function(adapter) {
    if (adapter.powered != powered) {
      powered = adapter.powered;
      if (powered) {
        console.log("Adapter radio is on");
      } else {
        console.log("Adapter radio is off");
      }
    }
  });

ডিভাইস তথ্য

পরিচিত ডিভাইস তালিকা

Bluetooth অ্যাডাপ্টারের সাথে পরিচিত ডিভাইসগুলির একটি তালিকা পেতে, bluetooth.getDevices পদ্ধতিটি ব্যবহার করুন:

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    console.log(devices[i].address);
  }
});

পেয়ার করা ডিভাইস এবং সম্প্রতি আবিষ্কৃত ডিভাইস সহ সমস্ত ডিভাইস ফেরত দেওয়া হয়। এটি নতুন ডিভাইসের আবিষ্কার শুরু করবে না (দেখুন কাছাকাছি ডিভাইস আবিষ্কার করা )।

ডিভাইস বিজ্ঞপ্তি প্রাপ্তি

bluetooth.getDevices এ বারবার কল করার পরিবর্তে, আপনি বিজ্ঞপ্তিগুলি পেতে bluetooth.onDeviceAdded , bluetooth.onDeviceChanged এবং bluetooth.onDeviceRemoved ইভেন্টগুলি ব্যবহার করতে পারেন৷

Bluetooth.onDeviceAdded ইভেন্টটি পাঠানো হয় যখনই অ্যাডাপ্টারের দ্বারা একটি ডিভাইস আবিষ্কার করা হয় বা অ্যাডাপ্টারের সাথে সংযোগ করা হয়:

chrome.bluetooth.onDeviceAdded.addListener(function(device) {
  console.log(device.address);
});

এই ইভেন্টের জন্য একজন শ্রোতা যোগ করলে ডিভাইসের আবিষ্কার শুরু হয় না (দেখুন কাছাকাছি ডিভাইস আবিষ্কার করা )।

পূর্বে আবিষ্কৃত ডিভাইসগুলি পেয়ার করা সহ ডিভাইসগুলিতে পরিবর্তনগুলি bluetooth.onDeviceChanged ইভেন্ট দ্বারা বিজ্ঞপ্তি দেওয়া হয়:

chrome.bluetooth.onDeviceChanged.addListener(function(device) {
  console.log(device.address);
});

অবশেষে bluetooth.onDeviceRemoved ইভেন্টটি পাঠানো হয় যখনই সিস্টেম থেকে একটি জোড়াযুক্ত ডিভাইস সরানো হয়, বা একটি আবিষ্কৃত ডিভাইস সম্প্রতি দেখা যায়নি:

chrome.bluetooth.onDeviceRemoved.addListener(function(device) {
  console.log(device.address);
});

আশেপাশের ডিভাইসগুলি আবিষ্কার করা হচ্ছে

কাছাকাছি ডিভাইসের আবিষ্কার শুরু করতে, bluetooth.startDiscovery পদ্ধতি ব্যবহার করুন। ডিসকভারি রিসোর্স ইনটেনসিভ হতে পারে তাই হয়ে গেলে আপনার bluetooth.stopDiscovery কল করা উচিত।

যখনই আপনার অ্যাপের কাছাকাছি ডিভাইসগুলি আবিষ্কার করার প্রয়োজন হয় তখনই আপনাকে bluetooth.startDiscovery কল করা উচিত৷ Bluetooth.AdapterState- এর discovering বৈশিষ্ট্যের উপর কলটিকে শর্তসাপেক্ষ করবেন না। অন্য অ্যাপ কাছাকাছি ডিভাইসগুলি আবিষ্কার করলেও কলটি সফল হবে এবং অন্যান্য অ্যাপ বন্ধ হয়ে যাওয়ার পরে অ্যাডাপ্টারটি আবিষ্কার করা চালিয়ে যাওয়া নিশ্চিত করবে।

প্রতিটি নতুন আবিষ্কৃত ডিভাইস সম্পর্কে তথ্য bluetooth.onDeviceAdded ইভেন্ট ব্যবহার করে প্রাপ্ত হয়। যে ডিভাইসগুলি ইতিমধ্যেই সম্প্রতি আবিষ্কৃত হয়েছে, বা পূর্বে এর সাথে যুক্ত বা সংযুক্ত ছিল, তাদের জন্য ইভেন্টটি পাঠানো হবে না৷ পরিবর্তে আপনার বর্তমান তথ্য পেতে bluetooth.getDevices-এ কল করা উচিত এবং আবিষ্কারের ফলে সেই তথ্যের পরিবর্তন সম্পর্কে অবহিত করার জন্য bluetooth.onDeviceChanged ইভেন্ট ব্যবহার করা উচিত।

উদাহরণ:

var device_names = {};
var updateDeviceName = function(device) {
  device_names[device.address] = device.name;
};
var removeDeviceName = function(device) {
  delete device_names[device.address];
}

// Add listeners to receive newly found devices and updates
// to the previously known devices.
chrome.bluetooth.onDeviceAdded.addListener(updateDeviceName);
chrome.bluetooth.onDeviceChanged.addListener(updateDeviceName);
chrome.bluetooth.onDeviceRemoved.addListener(removeDeviceName);

// With the listeners in place, get the list of devices found in
// previous discovery sessions, or any currently active ones,
// along with paired devices.
chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    updateDeviceName(devices[i]);
  }
});

// Now begin the discovery process.
chrome.bluetooth.startDiscovery(function() {
  // Stop discovery after 30 seconds.
  setTimeout(function() {
    chrome.bluetooth.stopDiscovery(function() {});
  }, 30000);
});

ব্যবহারকারী ব্লুটুথ রেডিও বন্ধ করে দিলে, সমস্ত আবিষ্কার সেশন শেষ হয়ে যাবে এবং রেডিও চালু হলে স্বয়ংক্রিয়ভাবে পুনরায় শুরু হবে না। এটি আপনার অ্যাপের জন্য গুরুত্বপূর্ণ হলে, আপনার bluetooth.onAdapterStateChanged ইভেন্টটি দেখা উচিত। যদি discovering সম্পত্তি false পরিবর্তিত হয়, তাহলে আপনার অ্যাপকে আবার চালু করতে bluetooth.startDiscovery কল করতে হবে। আবিষ্কারের সম্পদ নিবিড় প্রকৃতি সম্পর্কে সতর্ক থাকুন।

ডিভাইস সনাক্তকরণ

Bluetooth.getDevices এবং সম্পর্কিত ইভেন্টগুলির দ্বারা ফেরত ডিভাইসগুলি সনাক্ত করার জন্য বিভিন্ন বিকল্প প্রদান করা হয়েছে৷

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

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    if (devices[0].vendorIdSource != undefined) {
      console.log(devices[0].address + ' = ' +
                  devices[0].vendorIdSource + ':' +
                  devices[0].vendorId.toString(16) + ':' +
                  devices[0].productId.toString(16) + ':' +
                  devices[0].deviceId.toString(16));
    }
  }
});

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

বেশিরভাগ ব্লুটুথ ডিভাইসগুলি বেসব্যান্ড অ্যাসাইনড নম্বর ডকুমেন্ট অনুসারে ব্যাখ্যা করা বিট-ক্ষেত্র হিসাবে ডিভাইসের শ্রেণির তথ্য সরবরাহ করে। এই বিট-ক্ষেত্রটি deviceClass সম্পত্তিতে উপলব্ধ।

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    if (devices[0].vendorIdSource != undefined) {
      console.log(devices[0].address + ' = ' +
                  devices[0].deviceClass.toString(16));
    }
  }
});

ক্ষেত্রটি পার্স করা জটিল হতে পারে তাই সবচেয়ে সাধারণ ডিভাইস প্রকারের জন্য Chrome আপনার জন্য এটি পরিচালনা করে এবং type ক্ষেত্র সেট করে। যেখানে এটি উপলব্ধ নয়, বা আপনার প্রয়োজনের জন্য অপর্যাপ্ত, আপনাকে deviceClass পার্স করতে হবে।

chrome.bluetooth.getDevices(function(devices) {
  for (var i = 0; i < devices.length; i++) {
    if (devices[0].vendorIdSource != undefined) {
      console.log(devices[0].address + ' = ' + devices[0].type);
    }
  }
});

RFCOMM এবং L2CAP ব্যবহার করে

Chrome Apps RFCOMM বা L2CAP পরিষেবাগুলিকে সমর্থন করে এমন যেকোনো ডিভাইসের সাথে সংযোগ স্থাপন করতে পারে৷ এটি বাজারে বেশিরভাগ ক্লাসিক ব্লুটুথ ডিভাইস অন্তর্ভুক্ত করে।

একটি সকেট সংযোগ

একটি ডিভাইসের সাথে সংযোগ করতে আপনার তিনটি জিনিস প্রয়োজন। সংযোগ করার জন্য একটি সকেট, BluetoothSocket.create ব্যবহার করে তৈরি; আপনি যে ডিভাইসটির সাথে সংযোগ করতে চান তার ঠিকানা এবং পরিষেবাটিরই UUID।

সংযোগটি করার আগে আপনাকে নিশ্চিত করতে হবে যে অ্যাডাপ্টারটি bluetooth.getDevice বা ডিভাইস আবিষ্কার API ব্যবহার করে ডিভাইস সম্পর্কে সচেতন।

RFCOMM বা L2CAP প্রোটোকল ব্যবহার করা উচিত কিনা এবং কোন চ্যানেল বা PSM, ডিভাইসে SDP আবিষ্কার ব্যবহার করে প্রাপ্ত করা সহ অন্তর্নিহিত সংযোগ স্থাপনের জন্য প্রয়োজনীয় তথ্য।

উদাহরণ:

var uuid = '1105';
var onConnectedCallback = function() {
  if (chrome.runtime.lastError) {
    console.log("Connection failed: " + chrome.runtime.lastError.message);
  } else {
    // Profile implementation here.
  }
};

chrome.bluetoothSocket.create(function(createInfo) {
  chrome.bluetoothSocket.connect(createInfo.socketId,
    device.address, uuid, onConnectedCallback);
});

সকেটআইডিতে একটি হ্যান্ডেল রাখুন যাতে আপনি পরে এই সকেটে ডেটা পাঠাতে পারেন ( bluetoothSocket.send )।

থেকে গ্রহণ করা এবং একটি সকেটে পাঠানো

একটি সকেট থেকে ডেটা গ্রহণ এবং পাঠানো ArrayBuffer অবজেক্ট ব্যবহার করে। ArrayBuffers সম্পর্কে জানতে, ওভারভিউ, JavaScript টাইপ করা অ্যারে এবং টিউটোরিয়াল দেখুন, কিভাবে ArrayBuffer কে স্ট্রিং-এ এবং থেকে রূপান্তর করা যায়

আপনার arrayBuffer এ থাকা ডেটা পাঠাতে bluetoothSocket.send ব্যবহার করুন:

chrome.bluetoothSocket.send(socketId, arrayBuffer, function(bytes_sent) {
  if (chrome.runtime.lastError) {
    console.log("Send failed: " + chrome.runtime.lastError.message);
  } else {
    console.log("Sent " + bytes_sent + " bytes")
  }
})

ডেটা পাঠানোর পদ্ধতির বিপরীতে, একটি ইভেন্টে ডেটা প্রাপ্ত হয় ( bluetoothSocket.onReceive . সকেটগুলি বন্ধ না করে তৈরি করা হয় ( bluetoothSocket.setPaused দেখুন) তাই এই ইভেন্টের শ্রোতাকে সাধারণত bluetoothSocket.create এবং bluetoothSocket.connect এর মধ্যে যুক্ত করা হয়।

chrome.bluetoothSocket.onRecieve.addListener(function(receiveInfo) {
  if (receiveInfo.socketId != socketId)
    return;
  // receiveInfo.data is an ArrayBuffer.
});

সকেট ত্রুটি এবং সংযোগ বিচ্ছিন্ন প্রাপ্তি

সংযোগ বিচ্ছিন্ন সহ সকেট ত্রুটি সম্পর্কে অবহিত হতে, bluetoothSocket.onReceiveError ইভেন্টে একজন শ্রোতা যোগ করুন।

chrome.bluetoothSocket.onReceiveError.addListener(function(errorInfo) {
  // Cause is in errorInfo.error.
  console.log(errorInfo.errorMessage);
});

একটি সকেট থেকে সংযোগ বিচ্ছিন্ন করা হচ্ছে

সংযোগটি বন্ধ করতে এবং সকেট সংযোগ বিচ্ছিন্ন করতে bluetoothSocket.disconnect ব্যবহার করুন।

chrome.bluetoothSocket.disconnect(socketId);

প্রকাশনা সেবা

ডিভাইসগুলিতে আউটবাউন্ড সংযোগ তৈরি করার পাশাপাশি, Chrome Apps পরিষেবাগুলি প্রকাশ করতে পারে যা RFCOMM বা L2CAP সমর্থন করে এমন কোনও ডিভাইস দ্বারা ব্যবহার করা যেতে পারে৷

একটি সকেটের উপর শুনছি

দুই ধরনের প্রকাশিত পরিষেবা সমর্থিত। RFCOMM হল সবচেয়ে বেশি ব্যবহৃত এবং বেশিরভাগ ডিভাইস এবং প্রোফাইল কভার করে:

var uuid = '1105';
chrome.bluetoothSocket.create(function(createInfo) {
  chrome.bluetoothSocket.listenUsingRfcomm(createInfo.socketId,
    uuid, onListenCallback);
});

L2CAP হল অন্যটি এবং অন্যান্য ডিভাইসের ধরন এবং ফার্মওয়্যার আপলোড করার মতো বিক্রেতা-নির্দিষ্ট ব্যবহারগুলি কভার করে৷

var uuid = '0b87367c-f188-47cd-bc20-a5f4f70973c6';
chrome.bluetoothSocket.create(function(createInfo) {
  chrome.bluetoothSocket.listenUsingL2cap(createInfo.socketId,
    uuid, onListenCallback);
});

উভয় ক্ষেত্রেই একটি ঐচ্ছিক BluetoothSocket.ListenOptions একটি নির্দিষ্ট চ্যানেল বা PSM বরাদ্দ করার জন্য পাস করা যেতে পারে। কলব্যাক chrome.runtime.lastError এর মাধ্যমে ত্রুটি এবং অন্যথায় সাফল্য নির্দেশ করে। সকেটআইডিতে একটি হ্যান্ডেল রাখুন যাতে আপনি পরে এই সকেট থেকে সংযোগ গ্রহণ করতে পারেন ( bluetoothSocket.onAccept )।

ক্লায়েন্ট সংযোগ গ্রহণ

ক্লায়েন্ট সংযোগগুলি গৃহীত হয় এবং BluetoothSocket.onAccept ইভেন্টের মাধ্যমে আপনার অ্যাপ্লিকেশনে পাঠানো হয়।

chrome.bluetoothSocket.onAccept.addListener(function(acceptInfo) {
  if (info.socketId != serverSocketId)
    return;

  // Say hello...
  chrome.bluetoothSocket.send(acceptInfo.clientSocketId,
    data, onSendCallback);

  // Accepted sockets are initially paused,
  // set the onReceive listener first.
  chrome.bluetoothSocket.onReceive.addListener(onReceive);
  chrome.bluetoothSocket.setPaused(false);
});

ক্লায়েন্ট সংযোগ গ্রহণ বন্ধ করুন

ক্লায়েন্ট সংযোগ গ্রহণ করা বন্ধ করতে এবং পরিষেবাটি অপ্রকাশিত করতে bluetoothSocket.disconnect ব্যবহার করুন।

chrome.bluetoothSocket.disconnect(serverSocketId);

কম শক্তি ডিভাইসের সাথে মিথস্ক্রিয়া

ব্লুটুথ লো এনার্জি বা (ব্লুটুথ স্মার্ট) হল একটি ওয়্যারলেস প্রযুক্তি যার লক্ষ্য বিদ্যুৎ খরচ কমানো। ব্লুটুথ লো এনার্জি API অ্যাপ্লিকেশনগুলিকে একটি পেরিফেরালের সাথে একটি LE সংযোগে কেন্দ্রীয় ভূমিকা বাস্তবায়নের অনুমতি দেয়৷ নিম্নলিখিত বিভাগগুলি বর্ণনা করে যে কীভাবে ব্লুটুথ লো এনার্জি পেরিফেরালগুলি আবিষ্কার করতে হয়, সংযোগ করতে হয় এবং এর সাথে ইন্টারঅ্যাক্ট করতে হয়।

আবিষ্কার এবং পেরিফেরিয়াল সংযোগ

প্রথাগত ব্লুটুথ ডিভাইসগুলির মতো, ডিসকভারিং কাছাকাছি ডিভাইসগুলিতে বর্ণিত পদ্ধতিগুলি ব্যবহার করে LE পেরিফেরালগুলি আবিষ্কার করা যেতে পারে। একটি LE ডিভাইস "বিজ্ঞাপন ডেটা" নামক ডেটা প্যাকেট পাঠিয়ে নিজেকে আবিষ্কারযোগ্য করে তোলে এবং ডিভাইসটিকে বিজ্ঞাপন মোডে বলা হয়। বিজ্ঞাপনের ডেটাতে ডিভাইসে উপলব্ধ পরিষেবাগুলির UUID থাকতে পারে৷ যদি উপস্থিত থাকে, তাহলে এই UUIDগুলি সংশ্লিষ্ট bluetooth.Device অবজেক্টের uuids বৈশিষ্ট্য ব্যবহার করে অ্যাক্সেসযোগ্য হবে।

একবার আবিষ্কৃত হলে, একটি LE ডিভাইস BluetoothLowEnergy.connect কল করে সংযুক্ত করা যেতে পারে যাতে অ্যাপ্লিকেশনটি তার পরিষেবাগুলির সাথে যোগাযোগ করতে পারে:

chrome.bluetooth.onDeviceAdded.addListener(function(device) {
  var uuid = '0000180d-0000-1000-8000-00805f9b34fb';
  if (!device.uuids || device.uuids.indexOf(uuid) < 0)
    return;

  // The device has a service with the desired UUID.
  chrome.bluetoothLowEnergy.connect(device.address, function () {
    if (chrome.runtime.lastError) {
      console.log('Failed to connect: ' + chrome.runtime.lastError.message);
      return;
    }

    // Connected! Do stuff...
    ...
  });
});

একবার সংযুক্ত হলে, সংশ্লিষ্ট ব্লুটুথের connected প্রপার্টি। ডিভাইস অবজেক্টের মান true হবে। BluetoothLowEnergy.connect কল করা ডিভাইসের সাথে শারীরিক সংযোগে অ্যাপ্লিকেশন দ্বারা একটি দাবি প্রতিষ্ঠা করে৷ BluetoothLowEnergy.connect (উদাহরণস্বরূপ অন্য অ্যাপ্লিকেশনের কারণে) কল না করেই ডিভাইসে একটি শারীরিক সংযোগ থাকতে পারে। এই ক্ষেত্রে, যদিও আপনার অ্যাপ্লিকেশনটি এখনও ডিভাইসের পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করতে পারে, এটিকে সর্বদা bluetoothLowEnergy.connect কল করা উচিত যাতে অন্য অ্যাপ্লিকেশনটিকে শারীরিক লিঙ্কটি সংযোগ বিচ্ছিন্ন করা থেকে বিরত রাখা যায়।

একবার আপনার অ্যাপ্লিকেশনটিকে আর সংযুক্ত করার প্রয়োজন নেই, এটি bluetoothLowEnergy.disconnect এ কল করে সংযোগের উপর তার দাবি মুছে ফেলতে পারে:

chrome.bluetoothLowEnergy.disconnect(deviceAddress);

মনে রাখবেন যে এটি অগত্যা ডিভাইসের শারীরিক লিঙ্কটিকে ধ্বংস করবে না, কারণ ডিভাইসের সাথে সক্রিয় সংযোগ আছে এমন অন্যান্য অ্যাপ্লিকেশন থাকতে পারে৷ কখনও কখনও অ্যাপ্লিকেশনের নিয়ন্ত্রণের বাইরের কারণে ডিভাইসটি সংযোগ বিচ্ছিন্ন হয়ে যেতে পারে (যেমন যদি ডিভাইসটি অদৃশ্য হয়ে যায় বা অপারেটিং সিস্টেমের ইউটিলিটিগুলির মাধ্যমে ব্যবহারকারীর দ্বারা স্পষ্টভাবে সংযোগ বিচ্ছিন্ন হয়ে যায়)। সংযোগের পরিবর্তন সম্পর্কে বিজ্ঞপ্তি পেতে আপনার অ্যাপ্লিকেশনটিকে bluetooth.onDeviceChanged ইভেন্টটি পর্যবেক্ষণ করা উচিত এবং প্রয়োজনে পুনরায় সংযোগ করা উচিত।

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

পরিষেবা, বৈশিষ্ট্য, এবং বর্ণনাকারী

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

  • পরিষেবা: একটি GATT পরিষেবা একটি ডিভাইসের একটি নির্দিষ্ট ফাংশন সম্পন্ন করার জন্য ডেটা এবং সংশ্লিষ্ট আচরণের একটি সংগ্রহ উপস্থাপন করে। উদাহরণস্বরূপ, একটি হার্ট রেট মনিটর সাধারণত কমপক্ষে একটি "হার্ট রেট পরিষেবা" থাকবে। একটি GATT পরিষেবা সম্পর্কে তথ্য একটি bluetoothLowEnergy.Service অবজেক্টে রয়েছে৷
  • বৈশিষ্ট্য: একটি GATT বৈশিষ্ট্য হল একটি মৌলিক ডেটা উপাদান যা একটি GATT পরিষেবা তৈরি করতে ব্যবহৃত হয়, এতে বৈশিষ্ট্য সহ একটি মান থাকে যা নির্ধারণ করে যে কীভাবে সেই মানটি অ্যাক্সেস করা যেতে পারে। উদাহরণস্বরূপ, "হার্ট রেট সার্ভিস" এর "হার্ট রেট মেজারমেন্ট" বৈশিষ্ট্য রয়েছে, যা ব্যবহারকারীর হৃদস্পন্দনের মান পেতে ব্যবহৃত হয়। একটি GATT বৈশিষ্ট্য সম্পর্কে তথ্য একটি bluetoothLowEnergy.Characteristic বস্তুর মধ্যে রয়েছে।
  • বর্ণনাকারী: একটি GATT চরিত্রগত বর্ণনাকারীতে একটি বৈশিষ্ট্য সম্পর্কে আরও তথ্য রয়েছে। একটি GATT বৈশিষ্ট্যযুক্ত বর্ণনাকারী সম্পর্কে তথ্য একটি bluetoothLowEnergy.Descriptor অবজেক্টে রয়েছে।

ব্লুটুথ লো এনার্জি এপিআই অ্যাপ্লিকেশনগুলিকে bluetoothLowEnergy.getServices , bluetoothLowEnergy.getCharacteristics , এবং bluetoothLowEnergy.getDescriptors এ কল করার মাধ্যমে একটি ডিভাইসের পরিষেবা, বৈশিষ্ট্য এবং বর্ণনাকারী সম্পর্কে তথ্য খোঁজার অনুমতি দেয়৷ অ্যাপগুলি তাদের uuid ফিল্ডকে পছন্দসই GATT UUID-এর সাথে তুলনা করে পরিষেবা, বৈশিষ্ট্য এবং বর্ণনাকারীর মাধ্যমে ফিল্টার করতে পারে:

chrome.bluetoothLowEnergy.getServices(deviceAddress, function(services) {
  ...
  for (var i = 0; i < services.length; i++) {
    if (services[i].uuid == HEART_RATE_SERVICE_UUID) {
      heartRateService = services[i];
      break;
    }
  }
  ...
});

API এর মাধ্যমে অ্যাক্সেসযোগ্য প্রতিটি পরিষেবা, বৈশিষ্ট্য এবং বর্ণনাকারীকে একটি অনন্য দৃষ্টান্ত শনাক্তকারী বরাদ্দ করা হয়েছে, যা instanceId ক্ষেত্র ব্যবহার করে প্রাপ্ত করা যেতে পারে। এই ইনস্ট্যান্স আইডিটি একটি GATT অবজেক্ট সনাক্ত করতে এবং এটিতে নির্দিষ্ট ক্রিয়াকলাপ সম্পাদন করতে ব্যবহার করা যেতে পারে:

chrome.bluetoothLowEnergy.getCharacteristics(heartRateService.instanceId,
                                             function(chracteristics) {
  ...
  for (var i = 0; i < characteristics.length; i++) {
    if (characteristics[i].uuid == HEART_RATE_MEASUREMENT_UUID) {
      measurementChar = characteristics[i];
      break;
    }
  }
  ...
  chrome.bluetoothLowEnergy.getDescriptors(measurementChar.instanceId,
                                           function(descriptors) {
    ...
  });
});

সেবা ইভেন্ট

একবার একটি ডিভাইস সংযুক্ত হলে, Chrome এর পরিষেবাগুলি আবিষ্কার করবে৷ প্রতিটি পরিষেবা আবিষ্কার এবং সরানো হলে, অ্যাপ্লিকেশনটি bluetoothLowEnergy.onServiceAdded এবং bluetoothLowEnergy.onServiceRemoved ইভেন্টগুলি পাবে:

  var initializeService = function(service) {
    if (!service) {
      console.log('No service selected!');
      // Reset UI, etc.
      ...
      return;
    }

    myService = service;

    // Get all the characteristics and descriptors and bootstrap the app.
    ...
  };

  chrome.bluetoothLowEnergy.onServiceAdded.addListener(function(service) {
    if (service.uuid == MY_SERVICE_UUID)
      initializeService(service);
  });

  chrome.bluetoothLowEnergy.onServiceRemoved.addListener(function(service) {
    if (service.instanceId == myService.instanceId)
      initializeService(null);
  });

Chrome একটি পরিষেবার সমস্ত বৈশিষ্ট্য এবং বর্ণনাকারীকে অ্যাসিঙ্ক্রোনাসভাবে আবিষ্কার করে এবং আবিষ্কার সম্পূর্ণ হলে bluetoothLowEnergy.onServiceAdded ইভেন্ট পাঠায়৷ যদি একটি পেরিফেরাল সংযোগ বন্ধ হয়ে যায়, Chrome সমস্ত সম্পর্কিত পরিষেবাগুলি সরিয়ে দেয় এবং bluetoothLowEnergy.onServiceRemoved ইভেন্ট পাঠায়৷

কিছু পেরিফেরাল তাদের পরিষেবাগুলিকে সংশোধন করতে পারে, যেমন একটি পরিষেবার বৈশিষ্ট্যগুলি পরিবর্তিত হতে পারে বা পরিষেবাগুলি সম্পূর্ণরূপে যুক্ত এবং সরানো হতে পারে৷ Chrome BluetoothLowEnergy.onServiceChanged , bluetoothLowEnergy.onServiceAdded , এবং bluetoothLowEnergy.onServiceRemoved ইভেন্টগুলি ব্যবহার করে এই পরিবর্তনগুলির অ্যাপগুলিকে অবহিত করে৷

  chrome.bluetoothLowEnergy.onServiceChanged.addListener(function(service) {
    if (service.instanceId != myService.instanceId)
      return;

    updateMyService(service);
  });

পড়া এবং একটি চরিত্রগত মান লেখা

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

Chrome একটি বৈশিষ্ট্যের মান পড়ার জন্য bluetoothLowEnergy.readCharacteristicValue পদ্ধতি প্রদান করে:

chrome.bluetoothLowEnergy.readCharacteristicValue(chrc.instanceId,
                                                  function(result) {
  if (chrome.runtime.lastError) {
    console.log('Failed to read value: ' + chrome.runtime.lastError.message);
    return;
  }

  var bytes = new Uint8Array(result.value);

  // Do stuff with the bytes.
  ...
});

কিছু বৈশিষ্ট্য লেখার যোগ্য, বিশেষ করে যেগুলি "কন্ট্রোল পয়েন্ট" হিসাবে আচরণ করে, যেখানে মান লেখার পার্শ্বপ্রতিক্রিয়া রয়েছে। উদাহরণস্বরূপ, হার্ট রেট কন্ট্রোল পয়েন্টের বৈশিষ্ট্যটি একটি হার্ট রেট সেন্সরকে তার মোট ক্যালোরি পোড়ানোর গণনা পুনরায় সেট করতে এবং শুধুমাত্র লেখাগুলিকে সমর্থন করার জন্য ব্যবহার করা হয়। এটি অর্জন করতে, Chrome bluetoothLowEnergy.writeCharacteristicValue পদ্ধতি প্রদান করে:

var myBytes = new Uint8Array([ ... ]);
chrome.bluetoothLowEnergy.writeCharacteristicValue(chrc.instanceId,
                                                   myBytes.buffer,
                                                   function() {
  if (chrome.runtime.lastError) {
    console.log('Failed to write value: ' +
                chrome.runtime.lastError.message);
    return;
  }

  // Value is written now.
});

চরিত্রগত বর্ণনাকারীরা একইভাবে আচরণ করে এবং পঠনযোগ্য এবং/অথবা লেখার যোগ্য হতে পারে। Chrome একটি বর্ণনাকারীর মান পড়তে এবং লিখতে bluetoothLowEnergy.readDescriptorValue এবং bluetoothLowEnergy.writeDescriptorValue পদ্ধতি প্রদান করে।

একটি বৈশিষ্ট্য পড়া বা লিখতে সমর্থন করে কিনা তা পরীক্ষা করার জন্য, একটি অ্যাপ্লিকেশন একটি ব্লুটুথলোএনার্জির properties ক্ষেত্র পরীক্ষা করতে পারে৷ বৈশিষ্ট্যযুক্ত বস্তু৷ যদিও এই ক্ষেত্রটিতে একটি মান অ্যাক্সেস করার জন্য নিরাপত্তা প্রয়োজনীয়তা সম্পর্কে তথ্য থাকে না, এটি বর্ণনা করে যে কোন মান অপারেশনটি সাধারণভাবে সমর্থন করে।

মান বিজ্ঞপ্তি হ্যান্ডলিং

কিছু বৈশিষ্ট্য তাদের মান বিজ্ঞপ্তি বা ইঙ্গিত ব্যবহার করে জানা যায়। উদাহরণস্বরূপ, হার্ট রেট পরিমাপের বৈশিষ্ট্যটি পাঠযোগ্য বা লেখার যোগ্য নয় তবে নিয়মিত বিরতিতে এর বর্তমান মান সম্পর্কে আপডেট পাঠায়। অ্যাপ্লিকেশনগুলি bluetoothLowEnergy.onCharacteristicValueChanged ইভেন্ট ব্যবহার করে এই বিজ্ঞপ্তিগুলি শুনতে পারে৷

  chrome.bluetoothLowEnergy.onCharacteristicValueChanged.addListener(
      function(chrc) {
    if (chrc.instanceId != myCharId)
      return;

    var bytes = new Uint8Array(chrc.value);

    // Do stuff with the bytes.
    ...
  });

এমনকি যদি একটি বৈশিষ্ট্য বিজ্ঞপ্তি/ইঙ্গিত সমর্থন করে, তবে সেগুলি ডিফল্টরূপে সক্ষম হয় না। BluetoothLowEnergy.onCharacteristicValueChanged ইভেন্ট শুরু বা বন্ধ করতে একটি অ্যাপ্লিকেশনের bluetoothLowEnergy.startCharacteristicNotifications এবং bluetoothLowEnergy.stopCharacteristicNotifications পদ্ধতিতে কল করা উচিত।

  // Start receiving characteristic value notifications.
  var notifying = false;
  chrome.bluetoothLowEnergy.startCharacteristicNotifications(chrc.instanceId,
                                                             function() {
    if (chrome.runtime.lastError) {
      console.log('Failed to enable notifications: ' +
                  chrome.runtime.lastError.message);
      return;
    }

    notifying = true;
  });

  ...

  // No longer interested in notifications from this characteristic.
  if (notifying) {
    chrome.bluetoothLowEnergy.stopCharacteristicNotifications(
        chrc.instanceId);
  }

নোটিফিকেশন শুরু হয়ে গেলে, অ্যাপ্লিকেশানটি ব্লুটুথলোএনার্জি.অনচরিত্রিক ভ্যালু চেঞ্জড পাবে প্রতিবার যখন বৈশিষ্ট্য থেকে একটি বিজ্ঞপ্তি বা ইঙ্গিত পাওয়া যায়। যদি বৈশিষ্ট্যটি সমর্থন করে, তাহলে এই ইভেন্টটি bluetoothLowEnergy.readCharacteristicValue- এ একটি সফল কলের পরেও পাঠানো হবে। এটি অ্যাপগুলিকে একটি পড়ার অনুরোধ এবং বিজ্ঞপ্তির মাধ্যমে ট্রিগার করা মান আপডেটের নিয়ন্ত্রণ প্রবাহকে একীভূত করতে দেয়:

  chrome.bluetoothLowEnergy.onCharacteristicValueChanged.addListener(
      function(chrc) {
    // Process the value.
    ...
  });

  chrome.bluetoothLowEnergy.startCharacteristicNotifications(chrc.instanceId,
                                                             function() {
    // Notifications started. Read the initial value.
    chrome.bluetoothLowEnergy.readCharacteristicValue(chrc.instanceId,
                                                      function(result) {
      ...
      // No need to do anything here since onCharacteristicValueChanged
      // will handle it.
    });
  });

যদি একটি বৈশিষ্ট্য বিজ্ঞপ্তি সমর্থন করে, তবে এর properties ক্ষেত্রে "notify" বা "indicate" বৈশিষ্ট্য থাকবে।

দ্রষ্টব্য: যদি একটি বৈশিষ্ট্য বিজ্ঞপ্তি/ইঙ্গিত সমর্থন করে, তাহলে বিজ্ঞপ্তিগুলি সক্ষম/অক্ষম করতে এটির "ক্লায়েন্ট চরিত্রগত কনফিগারেশন" বর্ণনাকারী থাকবে। Chrome অ্যাপগুলিকে এই বর্ণনাকারীতে লেখার অনুমতি দেয় না৷ বিজ্ঞপ্তির আচরণ নিয়ন্ত্রণ করতে অ্যাপগুলির পরিবর্তে bluetoothLowEnergy.startCharacteristicNotifications এবং bluetoothLowEnergy.stopCharacteristicNotifications পদ্ধতি ব্যবহার করা উচিত।