Domanda

Attualmente sto cercando di scrivere una classe in Android che esegue la scansione dei punti di accesso, calcolare quale punto di accesso ha il miglior segnale e quindi connettersi a tale punto di accesso.

Quindi, l'applicazione sarà in grado di eseguire la scansione in movimento e allegare a nuovi punti di accesso in movimento.

Ho la scansione e calcolo della migliore funzionamento del segnale.

Ma quando si tratta di attaccare al miglior punto di accesso Sto avendo dei problemi.

Sembra che enableNetwork (netid, othersTrueFalse) è l'unico metodo per il fissaggio ad un punto di accesso, ma questo causa problemi come dai miei risultati della scansione non sono in grado di ottenere l'id del punto di accesso con il segnale più forte.

Questo è il mio codice:


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 );

}

Quando provo ad usare addNewAccessPoint (ScanResult scanResult) si aggiunge solo un altro AP all'elenco nell'applicazione impostazioni con lo stesso nome di quello con il miglior segnale, così finisco con un sacco di duplicati e non in realtà il collegamento a loro.

Qualcuno può punto me nella direzione di una soluzione migliore?

È stato utile?

Soluzione

Basta cambiare

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

a

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

Altri suggerimenti

Più al punto della tua domanda. In primo luogo si determina il risultato della scansione con la migliore potenza del segnale. Una volta che avete, si dovrebbe anche ottenere l'elenco delle formazioni wifi già presenti sul dispositivo e garantire che il risultato della scansione con il segnale più forte non è già configurato con il dispositivo. Se lo è, semplicemente consentire, se non, crearne uno nuovo come sei. Questo vi aiuterà a evitare configurazioni duplicati.

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;
}

E sì, assicurarsi di utilizzare il parametro 'vero' quando si abilita reti. Questo aiuto assicurerà ci si connette alla rete che si intende.

wifiManager.enableNetwork(mNetID, true);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top