我正在创建一个应用程序,它定期(假设每隔5秒)通过BE扫描,在屏幕上向用户显示他周围的设备数量. 我们还假设用户已接受所有权限.

以下是代码的一个示例:

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()-&gt;bleScan.startScan() -&gt;scanCallBack-&gt;{deviceAddresse.add(Result.device1.Address)} . . . -&gt;scanCallBack-&gt;{deviceAddresses.add(result.device10.address)}

代码是否与我想要实现的目标一致? 我也有一些疑问:

  • 如果周围有许多设备(例如100台),扫描是否能够在5秒内返回所有地址?
  • 如果它没有成功,并且我在前一个函数完成之前启动了bleStartScan函数,我正在更新的列表中是否会有一些不规范的地方(例如重复的地址等)?

我希望我已经很好地解释了我的意思,我没有举一个太"粗暴"的例子. 我只是想以非常直接和基本的方式了解BE扫描是如何在更实际的水平上工作的.

推荐答案

代码看起来与您要实现的目标基本一致.缺少的主要工作是打印扫描的设备和处理扫描停止回调,但我猜这两件事都在其他地方完成.至於你提出的其他问题,详情如下:

如果周围有许多设备(例如100台),扫描是否能够在5秒内返回所有地址?

这取决于许多变量,例如环境、您的扫描参数以及其他设备正在通告的参数.假设所有其他设备都在以最大速率(20ms)进行广告,那么理论上你可以在2秒内阅读100个设备广告.然而,在现实中,由于其他变数,这个数字可能会低得多.我认为5秒对于大多数应用程序来说是一个很好的持续时间,但如果你想要更大的机会捕获附近的所有设备,也许可以将扫描持续时间增加到10秒.

如果它不成功,并且我在前一个操作完成之前启动了bleStartScan函数,我正在更新的列表中是否会有一些不规范之处(如重复地址等)?

在前一个扫描功能完成之前,您应该无法启动新的扫描功能.您将收到一个错误,告诉您扫描已在进行中.

在我看来,理解这些事情的最好方法就是准确地做你正在做的事情:-try 一个实际的例子,并在背景中阅读一些东西.我认为以下链接是非常好的Android和BLE入门指南:

Android相关问答推荐

如何自定义所选的NavigationBar项目?

如何将Hilt添加到Android Studio中的Kotlin项目中?

Android:MethodHandle. invoke和MethodHandle. invokeExact仅从Android O( - min—api 26)开始支持

Kotlin Gzip字符串未按预期工作

Android Jetpack Compose Material3主题配色方案

Jetpack Compose:如何将浮动操作按钮上方的子按钮居中对齐?

Android Kotlin ImageView内置于Kotlin ImageView中.适配器未按预期更新

如何显示具体的商品数量?

如何在 Jetpack Compose LazyColumn 中将项目分组在一起,例如卡片

布局可组合项如何具有可测量和约束参数?

我需要在房间数据库中保留旧的自动迁移行吗?

更改当前活动并返回后,Android webview 滚动不起作用

将 CircularProgressIndicator 添加到按钮而不增加其高度

Kotlin 协程、 retrofit 、android

GridLayout 和 GridView 有什么好用和区别

Android 12 通过包管理器中断 APK 安装?

jetpack compose 中的可点击指示是什么?

Android Studio:如何添加应用程序质量洞察窗口以查看 Android Studio 中的 Crashlytics 数据?

我的自定义视图没有显示我应该如何修复它?

使用协程访问数据库