4 Stimmen

Problem mit WifiManager.calculateSignalLevel(RSSI, 5)

Ich versuche, mit dem Wifimanager den Signalpegel der während eines Scans gefundenen Access Points zu berechnen.

Ich verwende die folgende Methode:

WifiManager.calculateSignalLevel(int, int)

Aber es scheint immer den gleichen Wert zu liefern, egal wie hoch der RSSI-Wert ist.

Hier ist mein Code:


public int calculateQoS(int aRSSI){

    signalLevel = WifiManager.calculateSignalLevel(RSSI, 5);

    return signalLevel;

}

public void testCalculateQoS(){

            Log.d("signal", "signal = : "
                    + connMonitor.calculateQoS(-44)
                    + " " + connMonitor.calculateQoS(-80)
                    + " " + connMonitor.calculateQoS(-120)
                    + " " + connMonitor.calculateQoS(-20));

        }

Die Protokollierung ergibt 1 für alle Testfälle für calculateQoS(int).

Übersehe ich hier etwas Einfaches? Warum ist der SignalLevel immer 1?

11voto

Lars D Punkte 8302

Es scheint, dass calculateSignalLevel auf diese Weise implementiert ist:

public static int calculateSignalLevel(int rssi, int numLevels) {
  if (rssi <= MIN_RSSI) {
      return 0;
  } else if (rssi >= MAX_RSSI) {
      return numLevels - 1;
  } else {
      int partitionSize = (MAX_RSSI - MIN_RSSI) / (numLevels - 1);
      return (rssi - MIN_RSSI) / partitionSize;
  }
}

Vielleicht kann dieser Codeschnipsel Ihr Problem erklären. Beachten Sie auch:

http://code.google.com/p/Android/issues/detail?id=2555

7voto

slinden77 Punkte 3358

Dank dieser Frage konnte ich das Problem auf niedrigeren API-Versionen als der, auf die ich abziele, verhindern. Also habe ich dies so gemacht, dass Sie es auf jeder Plattform-Version verwenden können.

public int getWifiSignalStrength(Context context){
    int MIN_RSSI        = -100;
    int MAX_RSSI        = -55;  
    int levels          = 101;
    WifiManager wifi    = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);            
    WifiInfo info       = wifi.getConnectionInfo(); 
    int rssi            = info.getRssi();

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH){
        return WifiManager.calculateSignalLevel(info.getRssi(), levels);
    } else {             
        // this is the code since 4.0.1
        if (rssi <= MIN_RSSI) {
            return 0;
        } else if (rssi >= MAX_RSSI) {
            return levels - 1;
        } else {
            float inputRange = (MAX_RSSI - MIN_RSSI);
            float outputRange = (levels - 1);
            return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange);
        }
    }
}//end method

2voto

AJit Punkte 1274

Dieses Problem tritt nur unter Android 2.3 auf,
können Sie ihn durch den neuesten Code von WiFiManger eines Android 4.2 ersetzen

Hier ist der Code:

public 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);
        if(inputRange != 0)
            return (int) ((float) (rssi - MIN_RSSI) * outputRange / inputRange);
    }
    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X