在Android WifiManager中Rssi的含义是什么?

时间:2012-11-07 17:50:07

标签: android android-wifi

我正在尝试使用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等数字...而我不明白他们的价值观..我已经看过android文档及其所有声明:

  

public int getRssi()

     

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

     

这不是规范化的,但应该是!

     

返回RSSI,范围是???到???

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

4 个答案:

答案 0 :(得分:11)

我在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):您在工具栏中看到的条数。

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

来自维基百科:

  

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

     

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

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

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