پیدا کردن دستگاه‌های BLE

برای پیدا کردن دستگاه‌های BLE، از روش startScan() استفاده می‌کنید. این روش ScanCallback را به‌عنوان پارامتر می‌گیرد. باید این فراخوانی برگشتی را پیاده‌سازی کنید، زیرا نتایج اسکن از این طریق برگردانده می‌شود. چون اسکن کردن مصرف باتری بالایی دارد، باید دستورالعمل‌های زیر را رعایت کنید:

  • به‌محض اینکه دستگاه موردنظر را پیدا کردید، اسکن کردن را متوقف کنید.
  • هرگز به‌صورت حلقه‌ای اسکن نکنید و همیشه برای اسکن خود محدودیت زمانی تعیین کنید. دستگاهی که قبلاً دردسترس بود ممکن است از محدوده خارج شده باشد و ادامه اسکن کردن باعث تخلیه باتری می‌شود.

در مثال زیر، برنامه BLE فعالیتی (DeviceScanActivity) را برای اسکن کردن دستگاه‌های «بلوتوث کم‌مصرف» دردسترس و نمایش آن‌ها در فهرستی به کاربر ارائه می‌دهد. قطعه کد زیر نحوه شروع و توقف اسکن را نشان می‌دهد:

کاتلین

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 اضافه می‌شود تا به کاربر نمایش داده شود.

کاتلین

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