我正在尝试正确读取我连接的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设备时不扫描的原因。
答案 0 :(得分:1)
readRemoteRssi方法返回连接设备的rssi值,由蓝牙控制器测量。请注意,BLE连接最多可在37个通道上运行,并在每个连接事件上跳转。
扫描时获得的rssi值是每个广告包的rssi值。广告只发生在三个频道上。
主机端的蓝牙堆栈,即主CPU上运行的Android软件不会改变蓝牙控制器测量的rssi值。
因此,我能看到不同结果的唯一原因是不同的无线电频道具有不同的噪音/质量或相似性。正如你可能在网上读到的很多,rssi会有很大差异,而这正是我们必须忍受的。有关不同无线电频道的详细信息,请参阅https://www.google.com/search?q=ble+channels。
另请注意,远离所有外围设备的人在已经连接到某物时会继续做广告。
如果您认为传递null什么都不做,也许您可以检查logcat并查看是否打印了预期的错误消息?但是,我无法解释扫描如何改变readRemoteRssi为已连接设备返回的值,因为这没有任何意义。如果您认为这是黑魔法,您必须询问蓝牙控制器公司;)