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

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

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

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

কারণ আবিষ্কারযোগ্য ডিভাইস ব্যবহারকারীর অবস্থান সম্পর্কে তথ্য প্রকাশ করতে পারে, ডিভাইস আবিষ্কার প্রক্রিয়ার জন্য অবস্থান অ্যাক্সেসের প্রয়োজন। যদি আপনার অ্যাপটি Android 8.0 (API লেভেল 26) বা উচ্চতর চালিত ডিভাইসে ব্যবহার করা হয়, তাহলে পরিবর্তে Companion Device Manager API ব্যবহার করার কথা বিবেচনা করুন। এই API আপনার অ্যাপের পক্ষ থেকে ডিভাইস আবিষ্কার করে, তাই আপনার অ্যাপের লোকেশন অনুমতির অনুরোধ করার প্রয়োজন নেই।

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

মনে রাখবেন যে জোড়া হওয়া এবং সংযুক্ত হওয়ার মধ্যে পার্থক্য রয়েছে:

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

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

জোড়া ডিভাইস জিজ্ঞাসা করুন

ডিভাইস আবিষ্কার করার আগে, পছন্দসই ডিভাইসটি ইতিমধ্যে পরিচিত কিনা তা দেখতে পেয়ার করা ডিভাইসের সেটটি অনুসন্ধান করা মূল্যবান। এটি করতে, getBondedDevices() কল করুন। এটি পেয়ার করা ডিভাইসের প্রতিনিধিত্বকারী BluetoothDevice অবজেক্টের একটি সেট প্রদান করে। উদাহরণস্বরূপ, আপনি সমস্ত পেয়ার করা ডিভাইসগুলিকে জিজ্ঞাসা করতে পারেন এবং প্রতিটি ডিভাইসের নাম এবং MAC ঠিকানা পেতে পারেন, যেমনটি নিম্নলিখিত কোড স্নিপেটটি প্রদর্শন করে:

কোটলিন

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() কল করুন। প্রক্রিয়াটি অ্যাসিঙ্ক্রোনাস এবং আবিষ্কার সফলভাবে শুরু হয়েছে কিনা তা নির্দেশ করে একটি বুলিয়ান মান প্রদান করে। আবিষ্কার প্রক্রিয়ায় সাধারণত প্রায় 12 সেকেন্ডের একটি অনুসন্ধান স্ক্যান জড়িত থাকে, তারপরে প্রতিটি ডিভাইসের একটি পৃষ্ঠা স্ক্যান করে তার ব্লুটুথ নাম পুনরুদ্ধার করা হয়।

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

কোটলিন

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

একটি ব্লুটুথ ডিভাইসের সাথে একটি সংযোগ শুরু করতে, আপনি সংশ্লিষ্ট MAC ঠিকানা পুনরুদ্ধার করতে BluetoothDevicegetAddress() কল করুন৷

আবিষ্কারযোগ্যতা সক্ষম করুন

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

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

কোটলিন

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


চিত্র 2: সক্রিয় আবিষ্কারযোগ্য ডায়ালগ।

চিত্র 2-এ দেখানো হিসাবে ডিভাইসটিকে আবিষ্কারযোগ্য করার জন্য ব্যবহারকারীর অনুমতির অনুরোধ করে একটি ডায়ালগ প্রদর্শিত হয়। ব্যবহারকারী যদি "অনুমতি দিন" প্রতিক্রিয়া জানায়, তাহলে নির্দিষ্ট সময়ের জন্য ডিভাইসটি আবিষ্কারযোগ্য হয়ে ওঠে। আপনার কার্যকলাপ তারপর 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
ডিভাইসটি আবিষ্কারযোগ্য মোডে নেই এবং সংযোগগুলি গ্রহণ করতে পারে না৷

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