برای یافتن دستگاه های 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(); } };