2010-05-13 4 views
7

Attualmente sto provando a scrivere una classe in Android che effettuerà la scansione dei punti di accesso, calcolerà quale punto di accesso ha il segnale migliore e poi si connetterà a quel punto di accesso.Android - Come scansionare i punti di accesso e selezionare il segnale più forte?

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

Ho la scansione e il calcolo del segnale migliore funzionante.

Ma quando si tratta di collegarsi al punto di accesso migliore, ho problemi.

Sembra che enableNetwork (netid, othersTrueFalse) sia l'unico metodo per collegarsi a un punto di accesso ma questo causa problemi come dai miei risultati di 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 APla lista nell'applicazione impostazioni con lo stesso nome di quella con il segnale migliore, quindi finisco con un sacco di duplicati e in realtà non li leggo.

Qualcuno può indicarmi la direzione di una soluzione migliore?

risposta

3

semplicemente cambiare

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

a

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

Più al punto della tua domanda. Per prima cosa si determina il risultato della scansione con la migliore potenza del segnale. Una volta ottenuto ciò, si dovrebbe anche ottenere l'elenco delle configurazioni wifi già presenti sul dispositivo e assicurarsi che il risultato della scansione con il segnale più forte non sia già configurato con il dispositivo. Se lo è, abilitalo semplicemente, altrimenti creane uno nuovo come sei. Questo ti aiuterà a evitare duplicati di configurazioni.

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 "true" quando si abilitano le reti. Ciò ti aiuterà a connetterti alla rete che intendi.

wifiManager.enableNetwork(mNetID, true); 
Problemi correlati