2014-12-31 3 views
0

У меня есть код для отображения значения RSSI подключенной сети. Фоновый процесс постоянно вызывает getRssi, а время цикла - несколько миллисекунд.Как долго wifi rssi берет андроид?

В цикле я отправляю значения обработчиком в поток пользовательского интерфейса, где я показываю текущее время вместе со скоростью цикла.

Однако дисплей пользовательского интерфейса обновляется каждые несколько секунд, тогда как скорость цикла составляет несколько миллисекунд. Почему расхождение?

package uk.co.moonsit.apps.wifi; 

import uk.co.moonsit.apps.sensors.R; 
import android.app.Activity; 
import android.content.Context; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.text.format.Time; 
import android.view.View; 
import android.widget.TextView; 

public class WifiRssiActivity extends Activity { 

private WifiManager wifi; 
private Handler handler = new Handler(); 
// private String toastText; 
private TextView tvStrength; 
private TextView tvSpeed; 
private TextView tvSSID; 
private TextView tvTime; 
private View view; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_wifi_rssi); 

    tvStrength = (TextView) findViewById(R.id.textViewWifiRssi); 
    tvSpeed = (TextView) findViewById(R.id.textViewSpeed); 
    tvSSID = (TextView) findViewById(R.id.textViewSSID); 
    tvTime = (TextView) findViewById(R.id.textViewTime); 

    String service = Context.WIFI_SERVICE; 
    wifi = (WifiManager) getSystemService(service); 

    Thread thread = new Thread(null, doBackgroundThreadProcessing, 
      "Background"); 
    thread.start(); 
    view = this.getWindow().getDecorView(); 
    view.setKeepScreenOn(true); 
} 

private Runnable doBackgroundThreadProcessing = new Runnable() { 

    public void run() { 
     backgroundThreadProcessing(); 
    } 
}; 

private boolean isRunning = true; 

// Method which does some processing in the background. 
private void backgroundThreadProcessing() { 

    long mark = System.currentTimeMillis(); 
    while (isRunning) { 
     int strength = 0; 
     int speed = 0; 
     String units = null; 
     String ssid = null; 
     long ms = 0; 
     WifiInfo info = wifi.getConnectionInfo(); 
     if (info.getBSSID() != null) { 
      strength = WifiManager 
        .calculateSignalLevel(info.getRssi(), 100); 
      speed = info.getLinkSpeed(); 
      units = WifiInfo.LINK_SPEED_UNITS; 
      ssid = info.getSSID(); 
     } 
     long now = System.currentTimeMillis(); 
     ms = now - mark; 
     mark = now; 
     GUIRunnable doUpdateGUI = new GUIRunnable(strength, speed, units, 
       ssid, ms); 
     handler.post(doUpdateGUI); 
    } 
} 

public class GUIRunnable implements Runnable { 

    private int strength; 
    private int speed; 
    private String units; 
    private String ssid = null; 
    private long ms; 

    public GUIRunnable(int st, int sp, String u, String ss, long m) { 
     strength = st; 
     speed = sp; 
     units = u; 
     ssid = ss; 
     ms = m; 
    } 

    public void run() { 
     updateGUI(strength, speed, units, ssid, ms); 
    } 
} 

private void updateGUI(int strength, int speed, String units, String ssid, 
     long ms) { 
    Time today = new Time(Time.getCurrentTimezone()); 
    today.setToNow(); 

    String millis = String.valueOf(System.currentTimeMillis()); 
    String time = today.format("%k:%M:%S.") 
      + millis.substring(millis.length() - 3); 

    tvStrength.setText("" + strength); 
    tvTime.setText(time + " - " + ms); 

    if (speed > 0) 
     tvSpeed.setText("" + speed + units); 
    if (ssid == null || ssid.length() == 0) 
     tvSSID.setText("No wifi connection"); 
    else 
     tvSSID.setText(ssid); 
    // Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_LONG) 
    // .show(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    isRunning = true; 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    // ssid = null; 
    isRunning = false; 
} 

} 

ответ

0

андроид апи не определяет скорость, с которой RSSI обновляется или при его обновлении, но в целом я сомневаюсь, что это быстрее, чем один раз в секунду в целях экономии электроэнергии.

Я нашел статью о том, как использовать широковещательный приемник для получения обновлений RSSI (а не непрерывно опроса): http://android-er.blogspot.com/2011/01/check-rssi-by-monitoring-of.html

АНИ позволяет предположить, что getRSSI и другие методы просто возвращают данные из последнего сканирования, так вероятно, скорость обновления - это интервал проверки Wi-Fi. Обычно это контролируется файлом build.prop (см. Строку 103 этого файла примера: http://androidforums.com/threads/stock-build-prop-download.561012/) и может быть очень разным от устройства к устройству. Самый эффективный способ обновления пользователя по RSSI (или другим параметрам wifi) - использовать широковещательный приемник и обновление, если доступно.

Примечание. На основании ответов на этот вопрос некоторые драйверы устройств Wi-Fi не поддерживают настройку файла build.prop, поэтому даже если у кого-то есть доступ к корню для изменения файла, это не гарантирует, что вы может изменить интервал сканирования: https://android.stackexchange.com/questions/37621/where-can-i-find-settings-for-wifi-internal-scan-period

+0

Спасибо, я постараюсь вещательный приемник. – PerceptualRobotics

+0

Любая идея, почему обновление времени происходит каждые несколько секунд, хотя хотя пост обработчика вызывается с той же скоростью, что и цикл? – PerceptualRobotics

+0

Да - это в значительной степени то, что объясняет мой ответ. Скажем, андроид обновляет RSSI каждые 2 секунды. Даже если вы вызываете обработчик 500 раз в секунду, значение RSSI будет меняться каждые две секунды. Обработчик никоим образом не влияет на частоту измерения RSSI. – iheanyi

1

проверял источники Google, и мне кажется, что Android будет проводить опрос WIFI RSSI только каждые 3 секунды (скорее всего, это позволит сэкономить ресурсы процессора и батареи).

Вот отрывок из WifiStateMachine.java:-

/** 
* Interval in milliseconds between polling for RSSI 
* and linkspeed information 
*/ 
private static final int POLL_RSSI_INTERVAL_MSECS = 3000; 
Смежные вопросы