在安卓WifiManager中,Rssi的含义是什么?

9

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

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等数字,但我不理解它们的值。我查看了安卓文档,但仅有以下内容:

public int getRssi ()

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

这不是归一化的,但应该是!

返回范围在???到???之间的RSSI。

请问有人能解释如何“归一化”或理解这些结果吗?

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;

在安卓系统中,相关的rssi范围为-100到-55。

有一个静态方法WifiManager.calculateSignalLevel(rssi,numLevel),可以为您计算信号强度级别:

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

返回0到4之间的数字(即numLevel-1):工具栏中出现的条形数。

编辑API 30+

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

wifiManager.calculateSignalLevel(rssi)

主要的区别是现在的级别数量由wifiManager.getMaxSignalLevel()给出。


1
已弃用。它被 public int calculateSignalLevel (int rssi) 替代。https://developer.android.com/reference/android/net/wifi/WifiManager#calculateSignalLevel(int) - Maor Hadad

7
根据IEEE 802.11文档,较小的负值表示更强的信号强度。范围在-100到0 dBm之间,越接近0则信号强度越高,反之亦然。

但是范围是多少?有人知道吗? - erik
1
不行。-100比0更弱,甚至可以说是比-99还要弱。 - PravinCG
这不是文档所说的。大家都说“数字越低,强度越高”。 - erik
更正文档只是重复了我在原帖中写的内容。但是这个链接显示大多数人说的与你所说的相反:http://www.droidrzr.com/index.php/topic/664-how-do-i-interpret-signal-level-readings/page__p__18478#entry18478 - erik
3
“lower” 意思是 “小于”,-100 < -99 < 0。它不代表“越靠近零”。 - AI0867
显示剩余3条评论

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);
}

0

来自维基百科:

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

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

因此,这强烈依赖于设备。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接