BLE ডিভাইস খোঁজা

BLE ডিভাইস খুঁজতে, আপনি startScan() পদ্ধতি ব্যবহার করেন। এই পদ্ধতিতে প্যারামিটার হিসেবে ScanCallback লাগে। আপনাকে এই কলব্যাক প্রয়োগ করতে হবে, কারণ স্ক্যান ফলাফল এভাবেই ফেরত পাঠানো হয়। স্ক্যানিংয়ের জন্য অনেক ব্যাটারি খরচ হয়, তাই আপনাকে নিম্নলিখিত নির্দেশিকা মেনে চলতে হবে:

  • পছন্দের ডিভাইস খুঁজে পেলেই স্ক্যান করা বন্ধ করুন।
  • লুপে কখনও স্ক্যান করবেন না এবং আপনার স্ক্যানে সবসময় সময়সীমা সেট করুন। আগে উপলভ্য ছিল এমন ডিভাইস রেঞ্জের বাইরে চলে যেতে পারে এবং স্ক্যান করা চালিয়ে গেলে ব্যাটারি শেষ হয়ে যায়।

নিম্নলিখিত উদাহরণে, BLE অ্যাপ একটি অ্যাক্টিভিটি (DeviceScanActivity) প্রদান করে যা উপলভ্য ব্লুটুথ LE ডিভাইস স্ক্যান করে এবং ব্যবহারকারীর জন্য একটি তালিকায় সেগুলি দেখায়। নিম্নলিখিত স্নিপেট থেকে জানা যায় যে কীভাবে স্ক্যান শুরু ও বন্ধ করতে হয়:

Kotlin

private val bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner
private var scanning = false
private val handler = Handler()

// Stops scanning after 10 seconds.
private val SCAN_PERIOD: Long = 10000

private fun scanLeDevice() {
    if (!scanning) { // Stops scanning after a pre-defined scan period.
        handler.postDelayed({
            scanning = false
            bluetoothLeScanner.stopScan(leScanCallback)
        }, SCAN_PERIOD)
        scanning = true
        bluetoothLeScanner.startScan(leScanCallback)
    } else {
        scanning = false
        bluetoothLeScanner.stopScan(leScanCallback)
    }
}

জাভা

private BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
private boolean scanning;
private Handler handler = new Handler();

// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;

private void scanLeDevice() {
    if (!scanning) {
        // Stops scanning after a predefined scan period.
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                scanning = false;
                bluetoothLeScanner.stopScan(leScanCallback);
            }
        }, SCAN_PERIOD);

        scanning = true;
        bluetoothLeScanner.startScan(leScanCallback);
    } else {
        scanning = false;
        bluetoothLeScanner.stopScan(leScanCallback);
    }
}

শুধুমাত্র নির্দিষ্ট ধরনের পেরিফেরাল স্ক্যান করতে, আপনি এর পরিবর্তে startScan(List<ScanFilter>, ScanSettings, ScanCallback) কল করতে পারেন, ScanFilter অবজেক্টের একটি তালিকা প্রদান করে যা স্ক্যান যে ডিভাইসগুলি খোঁজে সেগুলিকে সীমাবদ্ধ করে এবং একটি ScanSettings অবজেক্ট যা স্ক্যান সম্পর্কে প্যারামিটার নির্দিষ্ট করে।

নিম্নলিখিত কোড স্যাম্পেল হল ScanCallback-এর ইমপ্লিমেন্টেশন, যা BLE স্ক্যান ফলাফল ডেলিভার করার জন্য ব্যবহৃত ইন্টারফেস। ফলাফল পাওয়া গেলে, সেগুলি DeviceScanActivity-এর লিস্ট অ্যাডাপ্টারে যোগ করা হয় যাতে ব্যবহারকারীকে দেখানো যায়।

Kotlin

private val leDeviceListAdapter = LeDeviceListAdapter()
// Device scan callback.
private val leScanCallback: ScanCallback = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult) {
        super.onScanResult(callbackType, result)
        leDeviceListAdapter.addDevice(result.device)
        leDeviceListAdapter.notifyDataSetChanged()
    }
}

জাভা

private LeDeviceListAdapter leDeviceListAdapter = new LeDeviceListAdapter();

// Device scan callback.
private ScanCallback leScanCallback =
        new ScanCallback() {
            @Override
            public void onScanResult(int callbackType, ScanResult result) {
                super.onScanResult(callbackType, result);
                leDeviceListAdapter.addDevice(result.getDevice());
                leDeviceListAdapter.notifyDataSetChanged();
            }
        };