2010-08-09 14 views
11

Estoy construyendo una aplicación que lee la intensidad de la señal de cada punto de acceso WiFi disponible. código¿Cómo obtener la fuerza de conexión de los puntos de acceso Wifi?

que he escrito como:

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

    // Get WiFi status 
    WifiInfo info = wifi.getConnectionInfo(); 
    textStatus.append("\n\nWiFi Status: " + info.toString()); 

    // List available networks 
    List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); 

Sin embargo, tengo dos problemas:

  1. En la depuración, configs sólo contiene una conexión. Sin embargo, puedo ver que hay varios AP disponibles en la configuración wifi del sistema. Es decir. configs es una lista incompleta.

  2. No sé cómo obtener la potencia de la señal en WifiConfiguration.

btw, estoy usando HTC Hero y Android 1.5.

Respuesta

15

Según la documentación de la API de Android WifiManager.getConfiguredNetworks() no llena los parámetros de intensidad de la señal. Esta información solo representa la configuración del punto de acceso memorizada, no las configuraciones visibles.

Para obtener redes realmente visibles, debe llamar al WifiManager.startScan() para iniciar el escaneo de radio WiFi y WifiManager.getScanResults() después de un tiempo para obtener los resultados del escaneo.

+1

¿Cuánto tiempo quiere decir exactamente por "un tiempo"? ¿No hay alguna llamada de bloqueo a este método API? – Hosane

+3

Por lo general, es de 2 a 10 segundos (sin embargo, no hay restricciones implícitas). Pero tenga en cuenta que puede omitir algunos puntos de acceso visibles si escanea demasiado. Los puntos de acceso Wi-Fi son detectados por paquetes especiales de difusión (llamados "beacons") que se emiten periódicamente. Escanear en busca de puntos de acceso en realidad significa escuchar los faros y recopilarlos. http://www.wi-fiplanet.com/tutorials/article.php/1492071 –

+0

No hay función síncrona para todo el proceso. Aunque puede llamar a getScanResults() para obtener resultados de un escaneo previo realizado por el sistema. Tal vez los resultados sean lo suficientemente recientes para su propósito. Sin embargo, no espero que sea bueno si tiene una conexión WiFi activa: creo que los componentes del sistema Android no ejecutan escaneos cuando hay una buena conexión. Simplemente no hay razón para hacer eso. –

3
mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
receiverWifi = new WifiReceiver(); 
    registerReceiver(receiverWifi, new IntentFilter(
      WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
class WifiReceiver extends BroadcastReceiver { 
    public void onReceive(Context c, Intent intent) { 

     List<ScanResult> wifiList = mainWifi.getScanResults(); 
     ArrayList<WifiConnectionBean> m4MessagesList = new ArrayList<WifiConnectionBean>(); 
     for (int i = 0; i < wifiList.size(); i++) { 
      ScanResult scanResult = wifiList.get(i); 
      WifiConnectionBean bean = new WifiConnectionBean(); 
      bean.setConnectionName(scanResult.SSID); // + "--" + 
                 // scanResult.frequency); 
      bean.setDescription(scanResult.capabilities); 
      bean.setId(scanResult.SSID); 
      bean.setLevel(String.valueOf(scanResult.level)); 
      bean.setSignalStrength(String.valueOf(scanResult.BSSID)); 
      m4MessagesList.add(bean); 
     } 
     if (m4MessagesList == null) { 
      Toast.makeText(WifiIdentificationActivity.this, 
        "WifiConnection not available", Toast.LENGTH_SHORT) 
        .show(); 
     } else { 
      String message = "Scanning complete. " + m4MessagesList.size() 
        + " connections found!"; 
     } 
     pd.dismiss(); 

    } 
} 

donde scanResult.SSID proporciona la potencia de la señal.

+0

No creo que ni el BSSID ni el SSID otorguen potencia a la señal. SSID devuelve el nombre del punto de acceso mientras BSID devuelve la dirección del punto de acceso. https://developer.android.com/reference/android/net/wifi/ScanResult.html – danijax

7

continuación Código ayudará a conseguir la barra de wifi:

registerReceiver(new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
      int state = wifi.getWifiState(); 
      if(state == WifiManager.WIFI_STATE_ENABLED) { 
       List<ScanResult> results = wifi.getScanResults(); 

       for (ScanResult result : results) { 
        if(result.BSSID.equals(wifi.getConnectionInfo().getBSSID())) { 
         int level = WifiManager.calculateSignalLevel(wifi.getConnectionInfo().getRssi(), 
           result.level); 
         int difference = level * 100/result.level; 
         int signalStrangth= 0; 
         if(difference >= 100) 
          signalStrangth = 4; 
         else if(difference >= 75) 
          signalStrangth = 3; 
         else if(difference >= 50) 
          signalStrangth = 2; 
         else if(difference >= 25) 
          signalStrangth = 1; 
         tv.setText(tv.getText() + "\nDifference :" + difference + " signal state:" + signalStrangth); 

        } 

       } 
      } 
     } 
    }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION)); 
0
private void checkNetworkStrengh() { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo Info = cm.getActiveNetworkInfo(); 
     if (Info == null || !Info.isConnectedOrConnecting()) { 
      Log.i(TAG, "No connection"); 
     } else { 
      int netType = Info.getType(); 
      int netSubtype = Info.getSubtype(); 

      if (netType == ConnectivityManager.TYPE_WIFI) { 
       Log.i(TAG, "Wifi connection"); 
       WifiManager wifiManager = (WifiManager) getApplication().getSystemService(Context.WIFI_SERVICE); 
       List<ScanResult> scanResult = wifiManager.getScanResults(); 
       for (int i = 0; i < scanResult.size(); i++) { 
        Log.d("scanResult", "Speed of wifi"+scanResult.get(i).level);//The db level of signal 
       } 


       // Need to get wifi strength 
      } else if (netType == ConnectivityManager.TYPE_MOBILE) { 
       Log.i(TAG, "GPRS/3G connection"); 
       // Need to get differentiate between 3G/GPRS 
      } 
     } 
    } 
1
WifiManager wifiManager = (WifiManager) 
    MonitorActivity.this.getSystemService(Context.WIFI_SERVICE); 

    wifiManager.addNetwork(conf); 

    int numberOfLevels = 5; 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels); 

    Log.e("level", "" + level); 
    // you will get the levels. Using these levels you can calculate strenghts. 
Cuestiones relacionadas