Разъяснения о том, как работает сканирование BLE

Я создаю приложение, которое периодически (предположим, каждые 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)}

Соответствует ли код тому, чего я хотел бы достичь? У меня тоже есть некоторые сомнения:

  • Если вокруг много устройств (например, 100), сможет ли сканирование вернуть все адреса за 5 секунд?
  • Если это не удастся и я запущу функцию bleStartScan до завершения предыдущей, будут ли у меня какие-либо нарушения в обновляемом списке (например, повторяющиеся адреса и т. д.)?

Надеюсь, я хорошо объяснил и не привел слишком «грубый» пример. Я просто хотел бы очень прямо и просто понять, как сканирование ble работает на более практическом уровне.

1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код выглядит в основном соответствующим тому, чего вы пытаетесь достичь. Главное, чего не хватает, — это печать сканируемых устройств и обработка обратного вызова остановки сканирования, но я предполагаю, что обе эти вещи выполняются где-то еще. Что касается других ваших вопросов: -

«Если вокруг много устройств (например, 100), сможет ли сканирование вернуть все адреса за 5 секунд?»

Это зависит от многих переменных, таких как среда, параметры сканирования и параметры, в которых рекламируются другие устройства. Если предположить, что все остальные устройства передают рекламу с максимальной скоростью (20 мс), то теоретически вы можете прочитать 100 рекламных объявлений устройств за 2. секунды. Однако на самом деле это число, вероятно, будет намного ниже из-за других переменных. Я думаю, что 5 секунд — это хорошая продолжительность для большинства приложений, но если вы хотите иметь больше шансов захватить все устройства поблизости, возможно, увеличьте продолжительность сканирования до 10 секунд.

«Если это не удастся и я запущу функцию bleStartScan до завершения предыдущей, будут ли у меня какие-то нарушения в списке, который я обновляю (например, повторяющиеся адреса и т. д.)?»

Вы не сможете запустить новую функцию сканирования до завершения предыдущей. Вы получите сообщение об ошибке, сообщающее, что сканирование уже выполняется.

По моему мнению, лучший способ понять эти вещи — делать именно то, что вы делаете: опробовать практический пример, а также немного почитать в фоновом режиме. Я думаю, что следующие ссылки являются очень хорошим руководством по началу работы с Android и BLE:

Отлично, большое спасибо за подробное объяснение и за документацию, на которую вы мне ссылались, я прочитаю ее, чтобы получить более четкое представление :)

Daniele Mazzei 08.03.2024 15:31

Другие вопросы по теме