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

برای یافتن دستگاه های BLE، از متد startScan() استفاده می کنید. این روش یک ScanCallback به عنوان پارامتر می گیرد. شما باید این callback را پیاده سازی کنید، زیرا نتایج اسکن به این ترتیب برگردانده می شود. از آنجایی که اسکن باتری فشرده است، باید دستورالعمل های زیر را رعایت کنید:

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

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

کاتلین

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