Pregunta

Actualmente estoy tratando de escribir una clase en Android que buscará los puntos de acceso, calcular qué punto de acceso tiene la mejor señal y luego conectarse a ese punto de acceso.

Así que la aplicación será capaz de escanear en movimiento y se unen a los nuevos puntos de acceso sobre la marcha.

tengo el escaneo y cálculo de la mejor señal de trabajo.

Sin embargo, cuando se trata de unir a la mejor punto de acceso Tengo problemas.

Parece que enableNetwork (netid, othersTrueFalse) es el único método para la fijación de un punto de acceso, pero esto causa problemas a medida de mis Resultados del análisis no soy capaz de obtener el identificador del punto de acceso con la señal más fuerte.

Este es mi código:


public void doWifiScan(){

  scanTask = new TimerTask() {
  public void run() {
      handler.post(new Runnable() {
          public void run() {
               sResults = wifiManager.scan(getBaseContext()); 
               if(sResults!=null)
               Log.d("TIMER", "sResults count" + sResults.size());
               ScanResult scan = wifiManager.calculateBestAP(sResults);
               wifiManager.addNewAccessPoint(scan);
           }
       });
    }};

    t.schedule(scanTask, 3000, 30000); 
}

public ScanResult calculateBestAP(List<ScanResult> sResults){

     ScanResult bestSignal = null;
        for (ScanResult result : sResults) {
          if (bestSignal == null
              || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0)
            bestSignal = result;
        }

        String message = String.format("%s networks found. %s is the strongest. %s is the bsid",
                sResults.size(), bestSignal.SSID, bestSignal.BSSID);

        Log.d("sResult", message);
        return bestSignal;
}

public void addNewAccessPoint(ScanResult scanResult){

    WifiConfiguration wc = new WifiConfiguration();
    wc.SSID = '\"' + scanResult.SSID + '\"';
    //wc.preSharedKey  = "\"password\"";
    wc.hiddenSSID = true;
    wc.status = WifiConfiguration.Status.ENABLED;        
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    int res = mainWifi.addNetwork(wc);
    Log.d("WifiPreference", "add Network returned " + res );
    boolean b = mainWifi.enableNetwork(res, false);        
    Log.d("WifiPreference", "enableNetwork returned " + b );

}

Cuando intento utilizar addNewAccessPoint (ScanResult scanResult) que sólo añade otro punto de acceso a la lista de la configuración de la aplicación con el mismo nombre que el que tiene la mejor señal, por lo que terminan con un montón de duplicados y no que se une realmente a ellos.

me puede punto cualquiera en la dirección de una solución mejor?

¿Fue útil?

Solución

Simplemente cambie

boolean b = mainWifi.enableNetwork(res, false);

a

boolean b = mainWifi.enableNetwork(res, true); 

Otros consejos

Más al punto de su pregunta. En primer lugar está determinando el resultado del escaneo con la mejor intensidad de la señal. Una vez conseguido eso, también debe obtener la lista de configuraciones wifi haya en el dispositivo y asegurar que el resultado de la exploración con la señal más fuerte no está ya configurado con el dispositivo. Si es así, sólo tiene que activar, en caso contrario, crear uno nuevo como eres. Esto le ayudará a evitar configuraciones duplicadas.

private int findExistingNetworkConfig(String ssid) {
    if (ssid != null && !ssid.isEmpty()) {
        WifiManager wifiManager = (WifiManager) mContextRef.get()
                .getSystemService(Context.WIFI_SERVICE);
        for (WifiConfiguration wifiConfig : wifiManager
                .getConfiguredNetworks()) {
            if (ssid.equals(wifiConfig.SSID)) {
                return wifiConfig.networkId;
            }
        }
    }
    // Didn't find a matching network ssid
    return -1;
}

Y sí, asegúrese de usar el parámetro 'verdadero' al habilitar redes. Esta ayuda se asegurará de que se conecte a la red que desea.

wifiManager.enableNetwork(mNetID, true);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top