ব্লুটুথ ডিভাইস খোঁজা

BluetoothAdapter ব্যবহার করে, আপনি ডিভাইস খোঁজার মাধ্যমে অথবা পেয়ার করা ডিভাইসের তালিকা কোয়েরি করে রিমোট ব্লুটুথ ডিভাইস খুঁজে পেতে পারেন।

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

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

যেহেতু খুঁজে নেওয়ার যোগ্য ডিভাইস ব্যবহারকারীর লোকেশন সম্পর্কে তথ্য প্রকাশ করতে পারে, তাই ডিভাইস খুঁজে নেওয়ার প্রসেসের জন্য লোকেশন অ্যাক্সেস প্রয়োজন। আপনার অ্যাপ যদি Android 8.0 (API লেভেল 26) বা তার পরবর্তী যেকোনও ভার্সনে রান করা ডিভাইসে ব্যবহার করা হয়, তাহলে এর পরিবর্তে কম্প্যানিয়ন ডিভাইস ম্যানেজার API ব্যবহার করার কথা বিবেচনা করুন। এই API আপনার অ্যাপের হয়ে ডিভাইস খোঁজার কাজ করে, তাই আপনার অ্যাপকে লোকেশন সংক্রান্ত অনুমতি চাইতে হয় না।

প্রথমবার রিমোট ডিভাইসের সাথে কানেকশন তৈরি হয়ে গেলে, ব্যবহারকারীকে অটোমেটিক পেয়ারিংয়ের অনুরোধ দেখানো হয়। কোনও ডিভাইস পেয়ার করা হলে, সেই ডিভাইসের সম্পর্কে প্রাথমিক তথ্য—যেমন ডিভাইসের নাম, ক্লাস ও MAC অ্যাড্রেস—সেভ করা হয় এবং ব্লুটুথ API ব্যবহার করে পড়া যায়। রিমোট ডিভাইসের জন্য পরিচিত MAC অ্যাড্রেস ব্যবহার করে, যেকোনও সময় এটির সাথে কানেকশন শুরু করা যেতে পারে ডিসকভারি পারফর্ম না করেই, ধরে নেওয়া হয় যে ডিভাইসটি এখনও রেঞ্জের মধ্যে আছে।

মনে রাখবেন, পেয়ার করা ও কানেক্ট করার মধ্যে পার্থক্য আছে:

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

পেয়ার করা ডিভাইস কীভাবে খুঁজে পাবেন এবং ডিভাইস খোঁজার ফিচার ব্যবহার করে কীভাবে নতুন ডিভাইস খুঁজে পাবেন তা নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।

পেয়ার করা ডিভাইস কোয়েরি করুন

ডিভাইস খোঁজার আগে, পেয়ার করা ডিভাইসের সেট কোয়েরি করে দেখে নেওয়া ভাল যে কাঙ্খিত ডিভাইসটি আগে থেকেই পরিচিত কিনা। এটি করতে, getBondedDevices() নম্বরে কল করুন। এটি পেয়ার করা ডিভাইসকে দেখায় এমন BluetoothDevice অবজেক্টের একটি সেট রিটার্ন করে। যেমন, আপনি সব পেয়ার করা ডিভাইস কোয়েরি করতে পারেন এবং প্রতিটি ডিভাইসের নাম ও MAC অ্যাড্রেস পেতে পারেন, যেমন নিম্নলিখিত কোড স্নিপেট দেখায়:

Kotlin

val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
pairedDevices?.forEach { device ->
   val deviceName = device.name
   val deviceHardwareAddress = device.address // MAC address
}

জাভা

Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
   // There are paired devices. Get the name and address of each paired device.
   for (BluetoothDevice device : pairedDevices) {
       String deviceName = device.getName();
       String deviceHardwareAddress = device.getAddress(); // MAC address
   }
}

ব্লুটুথ ডিভাইসের সাথে কানেকশন শুরু করতে, সংশ্লিষ্ট BluetoothDevice অবজেক্ট থেকে যা প্রয়োজন তা হল MAC অ্যাড্রেস, যা আপনি getAddress()-এ কল করে পেতে পারেন। ব্লুটুথ ডিভাইস কানেক্ট করুন বিকল্প থেকে কানেকশন তৈরি করার ব্যাপারে আপনি আরও জানতে পারবেন।

ডিভাইস খুঁজে দেখুন

ডিভাইস খোঁজা শুরু করতে, startDiscovery()-এ কল করুন। প্রসেসটি অ্যাসিঙ্ক্রোনাস এবং এটি একটি বুলিয়ান ভ্যালু রিটার্ন করে যা দেখায় যে ডিসকভারি সফলভাবে শুরু হয়েছে কিনা। খোঁজার প্রসেসে সাধারণত ১২ সেকেন্ডের একটি ইনকোয়ারি স্ক্যান করা হয়, তারপরে প্রতিটি ডিভাইসের ব্লুটুথ নাম খুঁজে পেতে সেগুলির পৃষ্ঠা স্ক্যান করা হয়।

খুঁজে পাওয়া প্রতিটি ডিভাইস সম্পর্কে তথ্য পেতে, আপনার অ্যাপকে অবশ্যই ACTION_FOUND ইনটেন্টের জন্য BroadcastReceiver রেজিস্টার করতে হবে। সিস্টেম প্রতিটি ডিভাইসের জন্য এই ইনটেন্ট ব্রডকাস্ট করে। ইনটেন্টে অতিরিক্ত ফিল্ড EXTRA_DEVICE এবং EXTRA_CLASS আছে, যেগুলিতে যথাক্রমে BluetoothDevice এবং BluetoothClass আছে। ডিভাইস খুঁজে পাওয়া গেলে, ব্রডকাস্ট ম্যানেজ করার জন্য কীভাবে রেজিস্টার করবেন তা নিম্নলিখিত কোড স্নিপেট থেকে জানতে পারবেন:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
   ...

   // Register for broadcasts when a device is discovered.
   val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
   registerReceiver(receiver, filter)
}

// Create a BroadcastReceiver for ACTION_FOUND.
private val receiver = object : BroadcastReceiver() {

   override fun onReceive(context: Context, intent: Intent) {
       val action: String = intent.action
       when(action) {
           BluetoothDevice.ACTION_FOUND -> {
               // Discovery has found a device. Get the BluetoothDevice
               // object and its info from the Intent.
               val device: BluetoothDevice =
                       intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
               val deviceName = device.name
               val deviceHardwareAddress = device.address // MAC address
           }
       }
   }
}

override fun onDestroy() {
   super.onDestroy()
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver)
}

জাভা

@Override
protected void onCreate(Bundle savedInstanceState) {
   ...

   // Register for broadcasts when a device is discovered.
   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
   registerReceiver(receiver, filter);
}

// Create a BroadcastReceiver for ACTION_FOUND.
private final BroadcastReceiver receiver = new BroadcastReceiver() {
   public void onReceive(Context context, Intent intent) {
       String action = intent.getAction();
       if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           // Discovery has found a device. Get the BluetoothDevice
           // object and its info from the Intent.
           BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
           String deviceName = device.getName();
           String deviceHardwareAddress = device.getAddress(); // MAC address
       }
   }
};

@Override
protected void onDestroy() {
   super.onDestroy();
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver);
}

ব্লুটুথ ডিভাইসের সাথে কানেকশন শুরু করতে, আপনি BluetoothDevice-এ getAddress()-কে কল করে সংশ্লিষ্ট MAC অ্যাড্রেস পান।

খুঁজে নেওয়ার যোগ্যতা চালু করুন

অন্যান্য ডিভাইসের কাছে লোকাল ডিভাইস খুঁজে পাওয়ার যোগ্য করে তুলতে, ACTION_REQUEST_DISCOVERABLE ইনটেন্ট সহ startActivityForResult(Intent, int) কল করুন। এটি সেটিংস অ্যাপে নেভিগেট না করেই সিস্টেমের খুঁজে নেওয়ার যোগ্য মোড চালু করার জন্য একটি অনুরোধ জারি করে, যা আপনার নিজের অ্যাপ বন্ধ করে দেবে। ডিফল্ট হিসেবে, ডিভাইসটি দুই মিনিটের জন্য খুঁজে নেওয়ার যোগ্য হয়ে ওঠে। আপনি EXTRA_DISCOVERABLE_DURATION অতিরিক্ত যোগ করে, পাঁচ মিনিট পর্যন্ত, অন্য একটি সময়সীমা নির্ধারণ করতে পারেন।

নিম্নলিখিত কোড স্নিপেট ডিভাইসটিকে পাঁচ মিনিটের জন্য খুঁজে নেওয়ার যোগ্য হিসেবে সেট করে:

Kotlin

val requestCode = 1;
val discoverableIntent: Intent = Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).apply {
   putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300)
}
startActivityForResult(discoverableIntent, requestCode)

জাভা

int requestCode = 1;
Intent discoverableIntent =
       new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivityForResult(discoverableIntent, requestCode);


ছবি ২: খুঁজে নেওয়ার যোগ্যতা চালু করার ডায়ালগ।

একটি ডায়ালগ দেখানো হয়, যেখানে ব্যবহারকারীর কাছে ডিভাইসটি খুঁজে নেওয়ার যোগ্য করার অনুমতি চাওয়া হয়, যেমনটি চিত্র ২-এ দেখানো হয়েছে। ব্যবহারকারী "অনুমতি দিন" বিকল্পে ট্যাপ করলে, নির্দিষ্ট সময়ের জন্য ডিভাইসটি খুঁজে নেওয়ার যোগ্য হয়ে যায়। আপনার অ্যাক্টিভিটি তখন onActivityResult() কলব্যাকে একটি কল রিসিভ করে, যার ফলাফল কোড ডিভাইসটি খুঁজে নেওয়ার যোগ্য থাকার সময়কালের সমান। ব্যবহারকারী "প্রত্যাখ্যান করুন" বিকল্পে ক্লিক করলে অথবা কোনও সমস্যা হলে, ফলাফল কোড হল RESULT_CANCELED।

ডিভাইসটি বরাদ্দ সময়ের জন্য সাইলেন্টভাবে খুঁজে নেওয়ার যোগ্য মোডে থাকে। খুঁজে নেওয়ার যোগ্য মোড পরিবর্তন হলে বিজ্ঞপ্তি পেতে, ACTION_SCAN_MODE_CHANGED ইনটেন্টের জন্য BroadcastReceiver রেজিস্টার করুন। এই ইনটেন্টে অতিরিক্ত ফিল্ড আছে EXTRA_SCAN_MODE এবং EXTRA_PREVIOUS_SCAN_MODE, যা যথাক্রমে নতুন ও পুরনো স্ক্যান মোড প্রদান করে। প্রতিটি অতিরিক্তের জন্য সম্ভাব্য মান নিম্নলিখিত:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
ডিভাইসটি খুঁজে নেওয়ার যোগ্য মোডে আছে।
SCAN_MODE_CONNECTABLE
ডিভাইসটি খুঁজে নেওয়ার যোগ্য মোডে নেই, তবে এখনও কানেকশন গ্রহণ করতে পারে।
SCAN_MODE_NONE
ডিভাইসটি খুঁজে নেওয়ার যোগ্য মোডে নেই এবং কানেকশন গ্রহণ করতে পারছে না।

আপনি রিমোট ডিভাইসের সাথে কানেকশন শুরু করলে, আপনাকে ডিভাইস খুঁজে নেওয়ার যোগ্যতা চালু করতে হবে না। খুঁজে নেওয়ার যোগ্যতা চালু করার প্রয়োজন তখনই হয় যখন আপনি চান যে আপনার অ্যাপ এমন একটি সার্ভার সকেট হোস্ট করুক যা ইনকামিং কানেকশন গ্রহণ করে, কারণ রিমোট ডিভাইসকে অন্যান্য ডিভাইসের সাথে কানেকশন শুরু করার আগে অবশ্যই সেইসব ডিভাইস খুঁজে নিতে হবে।