我想在蓝牙低功耗设备的 UI 上将蓝牙连接强度显示为“信号强度条”。为此,我需要使用 BluetoothGattCallback.onReadRemoteRssi
中的 RSSI 值。但是,该方法以分贝形式返回 RSSI,而不是条形刻度。我需要某种方法来可靠地将这个值转换为条形比例或百分比。
在浏览 Android 文档寻找答案时,我偶然发现了 WifiManager.calculateSignalLevel(int rssi, int numLevels)
。是否可以用这种方法来解读蓝牙信号强度?如果没有,我该如何去做呢?
最佳答案
对于以分贝为单位的 RSSI(负数),请使用:
int bars = WifiManager.calculateSignalLevel(rssi, 5);
使条形处于通常范围 0 - 4 内。
WiFiManager 中的代码(来自 GrepCode)是:
private static final int MIN_RSSI = -100;
private static final int MAX_RSSI = -55;
public static int calculateSignalLevel(int rssi, int numLevels) {
if (rssi <= MIN_RSSI) {
return 0;
} else if (rssi >= MAX_RSSI) {
return numLevels - 1;
} else {
float inputRange = (MAX_RSSI - MIN_RSSI);
float outputRange = (numLevels - 1);
return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange);
}
}
}
我发现在我的 Galaxy S4 和 Note 10.1 上,此代码未给出返回的级别。它更像是 MAX_RSSI = -63 的代码,但又不完全一样。我不知道有什么方法可以找到这些三星设备中实际使用的代码。
我确实发现结果似乎与手机显示的信号电平相同。但是,我将其用于 Wifi 信号级别,而不是蓝牙。我没有使用蓝牙方法的经验。
关于android - 相当于蓝牙 RSSI 的 WifiManager.calculateSignalLevel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26280230/