Я создаю приложение, которое периодически (предположим, каждые 5 секунд) посредством сканирования показывает пользователю на экране количество устройств вокруг него. Мы также предполагаем, что пользователь принял все разрешения.
Это пример кода:
class ExampleBle(private val viewModel: Mainviewmodel) {
private val deviceAddresses = arrayListOf<String>()
private val bleAdapter: BluetoothAdapter by lazy {
val b = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
b.adapter
}
private val bleScan : BluetoothLeScanner by lazy {
bleAdapter.bluetoothLeScanner
}
private val scanSettings = ScanSettings.Builder()
//Questo tipo di scan è usato per scan di lunga durata e spreca meno energia
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
private val scanCallback = object : ScanCallback() {
@SuppressLint("MissingPermission")
override fun onScanResult(callbackType: Int, result: ScanResult) {
deviceAddresses.add(result.device.address)
}
override fun onScanFailed(errorCode: Int) {
Log.e("ScanCallback", "onScanFailed: code $errorCode")
}
}
//function to repeat every 5 seconds
fun startScan(){
bleScan.startScan(null, scanSettings, scanCallback)
// at this point the deviceAddresses list contains the addresses
// of all the devices around
viewModel.updateNumberDevices(deviceAddresses.size)
//clear the list to recollect all the device addresses from the next scan after 5 seconds
deviceAddresses.clear()
}
}
Итак, если вокруг пользователя 10 устройств: startScan() -> bleScan.startScan() -> scanCallBack -> {deviceAddresses.add(result.device1.address)} . . . -> scanCallBack -> {deviceAddresses.add(result.device10.address)}
Соответствует ли код тому, чего я хотел бы достичь? У меня тоже есть некоторые сомнения:
Надеюсь, я хорошо объяснил и не привел слишком «грубый» пример. Я просто хотел бы очень прямо и просто понять, как сканирование ble работает на более практическом уровне.
Код выглядит в основном соответствующим тому, чего вы пытаетесь достичь. Главное, чего не хватает, — это печать сканируемых устройств и обработка обратного вызова остановки сканирования, но я предполагаю, что обе эти вещи выполняются где-то еще. Что касается других ваших вопросов: -
«Если вокруг много устройств (например, 100), сможет ли сканирование вернуть все адреса за 5 секунд?»
Это зависит от многих переменных, таких как среда, параметры сканирования и параметры, в которых рекламируются другие устройства. Если предположить, что все остальные устройства передают рекламу с максимальной скоростью (20 мс), то теоретически вы можете прочитать 100 рекламных объявлений устройств за 2. секунды. Однако на самом деле это число, вероятно, будет намного ниже из-за других переменных. Я думаю, что 5 секунд — это хорошая продолжительность для большинства приложений, но если вы хотите иметь больше шансов захватить все устройства поблизости, возможно, увеличьте продолжительность сканирования до 10 секунд.
«Если это не удастся и я запущу функцию bleStartScan до завершения предыдущей, будут ли у меня какие-то нарушения в списке, который я обновляю (например, повторяющиеся адреса и т. д.)?»
Вы не сможете запустить новую функцию сканирования до завершения предыдущей. Вы получите сообщение об ошибке, сообщающее, что сканирование уже выполняется.
По моему мнению, лучший способ понять эти вещи — делать именно то, что вы делаете: опробовать практический пример, а также немного почитать в фоновом режиме. Я думаю, что следующие ссылки являются очень хорошим руководством по началу работы с Android и BLE:
Отлично, большое спасибо за подробное объяснение и за документацию, на которую вы мне ссылались, я прочитаю ее, чтобы получить более четкое представление :)