проблема с wifimanager.calculatesignalstrenth - PullRequest
2 голосов
/ 09 мая 2011

Я использую следующий код для расчета мощности сигналов Wi-Fi:

List<ScanResult> results = wifiDemo.wifi.getScanResults();

for(int i=0;i<results.size();i++)
{    
    int signallevel=WifiManager.calculateSignalLevel(result.level,10);    
}

Но он возвращает одинаковое значение для всех точек доступа Wi-Fi.Может кто-нибудь сказать, пожалуйста, что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2013

вот код:

public int getWifiSignalState(Context ctx) {
    int signalStrength = -1;
    try {
        final WifiManager wifi = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
        int state = wifi.getWifiState();
        if(state == WifiManager.WIFI_STATE_ENABLED) {
            List<ScanResult> results = wifi.getScanResults();
            if(results == null)
                return signalStrength;
            for (ScanResult result : results) {
                if(result != null && wifi != null && wifi.getConnectionInfo() != null && result.BSSID != null
                        && result.BSSID.equals(wifi.getConnectionInfo().getBSSID())) {
                    int level = 0;
                    level = calculateSignalLevel(wifi.getConnectionInfo().getRssi(), result.level);

                    // this is to handle java.lang.ArithmeticException: divide by zero
                    if(level != 0 && result.level != 0) {
                        // convert signal strength into percentage
                        int difference = level * 100 / result.level;
                        if(difference >= 100)
                            signalStrength = 4;
                        else if(difference >= 75)
                            signalStrength = 3;
                        else if(difference >= 50)
                            signalStrength = 2;
                        else if(difference >= 25)
                            signalStrength = 1;
                    }
                }

            }
        }
    } catch(Exception e) {
        ErrorReporter.handleSilentException(ctx, e);
    }

    return signalStrength;
}

// Этот метод решает проблему деления Android 2.3 на ноль исключений

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;
}
1 голос
/ 25 мая 2016

функция WifiManager.calculateSignalLevel(int RSSI_level, int range) принимает уровень RSSI в качестве первого аргумента и диапазон для второго аргумента.

Второй аргумент легко понять. По сути, функция возвращает значение в диапазоне [от 0 до range-1).

Первый аргумент должен быть в диапазоне MIN_RSSI и MAX_RSSI. Anything <=MIN_RSSI возвращает 0, а any >=MAX_RSSI возвращает значение, которое вы передали в качестве второго аргумента, минус 1 (range-1).

И критическая информация: MIN_RSSI определяется как константа, равная -100, а MAX_RSSI равна -55. Любое значение, которое вы передадите между этими двумя значениями, будет нормализовано.

Когда вы передаете значение выше MAX_RSSI, функция всегда возвращает одно и то же значение.

0 голосов
/ 09 мая 2011

Следует помнить, что WifiManager.calculateSignalLevel(result.level, 10) вернет только число от 0 до 9.Поэтому его лучше всего использовать для некоторых приложений, в которых отображается индикатор силы Wi-Fi (с несколькими различными состояниями, например один обычный индикатор WiFi в Android).То, какой номер возвращается, зависит от параметра RSSI.Таким образом, даже если RSSI двух точек доступа немного отличается, этот метод даст тот же результат.Если вам нужны более точные результаты, используйте число больше 10 или сами значения RSSI.

...