android - 相当于蓝牙 RSSI 的 WifiManager.calculateSignalLevel

标签 android bluetooth android-bluetooth rssi

我想在蓝牙低功耗设备的 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/

相关文章:

java - 不从蓝牙健康设备读取数据(适用于Android 2.2及以上版本)

android - BLE 设备名称无法恢复

javascript - Sencha Touch 2.1.0 如何让列表高度自动增加

android - 在 PC 上显示 Android 屏幕

android - 更改操作栏中的搜索图标

使用蓝牙时 Android 设备作为从设备

python - 我可以在另一台计算机上运行和开发 python 程序吗?

java - java接收数据后无法将string转换为int

Android在棉花糖中获取蓝牙地址

java - 使用 split 方法拆分字符串