BLE读取RSSI值不可靠

时间:2018-05-06 15:00:19

标签: android bluetooth-lowenergy bluetooth-gatt

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

我发现mBluetoothAdapter.startLeScan(null);返回的RSSI有很多"跳跃"。我开始做一个运行平均值(在过去10秒内)以获得更平滑的值。这没有帮助,因为价值有很多高峰。

我发现做null会使值更加平滑。我知道官方文档在连接到设备时不鼓励扫描,但实际上 - 在LG和三星设备上它确实可以工作。

接下来 - 如果我将onCharasteristicWritten()作为回调传递,则此方法不应执行任何操作(请参阅https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/bluetooth/BluetoothAdapter.java#L2833)。这让我相信三星和LG确实会修改Android蓝牙堆栈。

任何人都可以解释我看到了什么吗?任何人都可以提供更好的阅读解决方案"真实" RSSI值?

编辑:

我发现onRssiRead()被称为几次(?)次,具有相同的值,即使硬件只发送一次也很难。我们现在手动过滤这些值。另外def first_half(str): return str[:len(str)/2] 被多次调用。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

另请注意,远离所有外围设备的人在已经连接到某物时会继续做广告。

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