8

我正在尝试使用获取当前 wifi 连接的信号强度getRssi()

private void checkWifi(){
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo Info = cm.getActiveNetworkInfo();
    if (Info == null || !Info.isConnectedOrConnecting()) {
        Log.i("WIFI CONNECTION", "No connection");
    } else {
        int netType = Info.getType();
        int netSubtype = Info.getSubtype();

        if (netType == ConnectivityManager.TYPE_WIFI) {
            wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            int linkSpeed = wifiManager.getConnectionInfo().getLinkSpeed();
            int rssi = wifiManager.getConnectionInfo().getRssi();
            Log.i("WIFI CONNECTION", "Wifi connection speed: "+linkSpeed + " rssi: "+rssi);


        //Need to get wifi strength
        } 
    }
}

问题是我得到了 -35 或 -47 等数字。我不明白它们的值。我查看了 android 文档及其所有内容:

公共 int getRssi ()

自:API 级别 1 返回当前 802.11 网络的接收信号强度指示器。

这不是标准化的,但应该是!

返回 RSSI,范围为 ??? 至 ???

有人可以解释如何“规范化”或理解这些结果吗?

4

4 回答 4

13

我在WifiManager.java中找到了这个:

/** Anything worse than or equal to this will show 0 bars. */
private static final int MIN_RSSI = -100;

/** Anything better than or equal to this will show the max bars. */
private static final int MAX_RSSI = -55;

android 上的相关 rssi 范围介于 -100 和 -55 之间

有这个静态方法WifiManager.calculateSignalLevel(rssi,numLevel)将为您计算信号电平:

int wifiLevel = WifiManager.calculateSignalLevel(rssi,5);

返回 0 到 4 之间的数字(即 numLevel-1):您在工具栏中看到的条数。

编辑 API 30+

静态方法现在已弃用,您应该使用实例方法

wifiManager.calculateSignalLevel(rssi)

主要区别在于级别数现在由下式给出wifiManager.getMaxSignalLevel()

于 2012-12-05T10:58:48.057 回答
7

根据 IEEE 802.11 文档:较小的负值表示较高的信号强度。

范围在 -100 到 0 dBm 之间,接近 0 表示强度更高,反之亦然。

于 2012-11-07T17:55:25.213 回答
0

来自维基百科:

供应商为实际功率(以 mW 或 dBm 测量)及其 RSSI 值范围(从 0 到 RSSI_Max)提供自己的精度、粒度和范围。

例如,Cisco Systems 卡的 RSSI_Max 值为 100,将报告 101 个不同的功率级别,其中 RSSI 值为 0 到 100。另一个流行的 Wi-Fi 芯片组由 Atheros 制造。基于 Atheros 的卡将返回 0 到 127 (0x7f) 的 RSSI 值,其中 128 (0x80) 表示无效值。

所以这在很大程度上取决于设备。

于 2012-11-07T18:02:28.970 回答
0

从ben75的回答开始,我们可以使用这种方法来规范化rssi:

public static int normalizeRssi(int rssi){
  // Anything worse than or equal to this will show 0 bars
  final int MIN_RSSI = -100;
  // Anything better than or equal to this will show the max bars.
  final int MAX_RSSI = -55;

  int range = MAX_RSSI - MIN_RSSI;
  return 100 - ((MAX_RSSI - rssi) * 100 / range);
}
于 2013-05-09T08:04:00.563 回答