0

我正在尝试正确读取我连接的 BLE 设备的 RSSI,以便将其发送到上游服务器。

我发现返回的RSSIBluetoothGatt.readRemoteRssi()有很多“跳跃”。我开始做一个运行平均值(过去 10 秒)以获得更平滑的值。这没有帮助,因为该值有很多尖峰。

我发现这样做mBluetoothAdapter.startLeScan(null);会使值更平滑。我知道官方文档不鼓励在连接到设备时进行扫描,但实际上 - 在 LG 和三星设备上它确实有效。

进一步 - 如果我null作为回调传递,这个方法应该什么都不做(参见https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/bluetooth/BluetoothAdapter.java#L2833)。这让我相信三星和 LG 确实对 Android 蓝牙堆栈进行了很多修改。

谁能解释我看到了什么?谁能提供更好的解决方案来读取“真实”RSSI 值?


编辑:

我发现它onCharasteristicWritten()被调用了几次(?)具有相同的值,即使硬件只发送一次。我们现在正在手动过滤这些值。也onRssiRead()被叫了好几次。

可能是 Android 文档建议在连接到 BT 设备时不进行扫描的原因。

4

1 回答 1

2

readRemoteRssi 方法返回连接设备的 rssi 值,由蓝牙控制器测量。请注意,BLE 连接最多可在 37 个通道上运行,并在每个连接事件上跳转。

扫描时获得的 rssi 值是每个广告数据包的 rssi 值。广告只发生在三个渠道上。

主机端的蓝牙堆栈,即在主 CPU 上运行的 Android 软件不会改变蓝牙控制器测量的 rssi 值。

所以我能看到你的不同结果的唯一原因是不同的无线电频道有不同的噪音/质量或类似的。正如你可能在网上读到的那样,rssi 会有很大的不同,而这正是我们必须忍受的。有关不同无线电频道的详细信息,请参阅https://www.google.com/search?q=ble+channels

另请注意,当它们已经连接到某物时,并非所有外围设备都会继续做广告。

如果您认为传递 null 没有任何作用,也许您可​​以检查 logcat 并查看是否打印了预期的错误消息?但是,我无法解释扫描将如何改变 readRemoteRssi 针对已连接设备返回的值,因为这没有任何意义。如果您认为这是黑魔法,您必须询问蓝牙控制器公司;)

于 2018-05-06T22:46:40.730 回答