Android 应用程序的蓝牙 BLE 扫描在广告停止时停止。为什么?

标签 android bluetooth bluetooth-lowenergy scanning

我有一个在移动设备上运行的 Android 6 - 23 级应用程序,它同时发布和扫描 BLE 无连接数据包。

问题:

我发现当我调用 stopAdvertising() 时,连续运行的 BLE 扫描操作会暂停或停止工作 1-4 秒,然后再次恢复。我知道这一点,因为我可以很容易地看到每 0.10 秒持续收到的广告数据包在 1-4 秒内没有收到。这意味着当广告操作以编程方式停止时,扫描操作将暂停或停止。

我如何定期启动和停止 BLE 广播,不会对 BLE 扫描操作造成不利影响

我尝试使用不同的 Android 版本 API 开发我的应用程序,但都遇到了同样烦人的扫描暂停问题: 安卓 6 - 23 级 安卓 8 级 26

仅供引用,以下是一些 Android 6 代码 fragment :

       // create advertiser and save in list, so advertising instance can be stopped in future.           
       mBluetoothAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

       // start advertising!
       mBluetoothAdvertiser.startAdvertising( settings, data, mBluetoothAdvertiseCallback );

       // do some work...

      // TESTED BAD - the call below causes the BLE scan operation to halt for 1-4 seconds.
       mBluetoothAdvertiser.stopAdvertising(mBluetoothAdvertiseCallback);

最佳答案

在安卓的蓝牙栈中,扫描和广告是完全独立的。所有操作都简单地发送到蓝牙芯片,并由其固件进行扫描和广播。

通常只有一个 radio 的蓝牙芯片需要调度扫描和广告,因为同时只能执行一个操作。

显然你看到了这个效果。不同蓝牙芯片制造商使用的调度算法是专有的,通常不公开。您必须询问您正在使用的特定设备的制造商,为什么他们会以特定方式运行。

不过,Android 会发送扫描间隔的提示。在 Android 中,间隔为 5 秒,因此这可能会影响您的结果。

关于Android 应用程序的蓝牙 BLE 扫描在广告停止时停止。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957998/

相关文章:

java - 链接 Activity 会导致 OOM

java - 遍历数组元素OnClickListener android studio

.net - 是否有 API 调用来开始扫描硬件设备

ios - 获取为 native iOS 应用程序编写的代码并将其转换为 DLL

ios - 通过 EDR 在两个双模设备之间传输 BT 低功耗 GATT 配置文件

android - 如何在 flutter 中播放 youtube 视频?

Android 构建错误 "AndroidManifest.xml requires a placeholder substitution"

linux - 为什么蓝牙固件需要在驱动初始化时加载?

android - 为什么我们要为 BT 名称设置最大长度?

ios - 关于蓝牙低功耗 API 的 'proximity profile' 到底是什么?