2010-05-13 8 views
7

Ich versuche gerade, eine Klasse in Android zu schreiben, die nach Access Points scannt, berechnet, welcher Access Point das beste Signal hat, und dann eine Verbindung zu diesem Access Point herzustellen.Android - So scannen Sie Access Points und wählen das stärkste Signal aus?

So wird die Anwendung in der Lage sein, unterwegs zu scannen und unterwegs an neue Access Points anzuhängen.

Ich habe das Scannen und Berechnen des besten Signals funktioniert.

Aber wenn es darum geht, an den besten Zugangspunkt anzubringen, habe ich Probleme.

Es scheint, dass enableNetwork (netid, othersTrueFalse) ist die einzige Methode zum Anfügen an einen Access-Point, aber dies verursacht Probleme, wie von meinem Scan-Ergebnisse Ich bin nicht in der Lage, die ID des Access-Point mit dem stärksten Signal zu erhalten.

Dies ist mein Code:


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

} 

Wenn ich versuche, es addNewAccessPoint (ScanResult scanResult) zu verwenden, fügt nur eine weitere AP die Liste in den Einstellungen Anwendung mit dem gleichen Namen wie der mit dem besten Signal, so dass ich am Ende mit vielen Duplikaten und nicht wirklich an ihnen anhängen.

Kann mir jemand in Richtung einer besseren Lösung zeigen?

Antwort

3

einfach zu ändern

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

zu

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

Mehr zu dem Punkt Ihrer Frage. Zuerst ermitteln Sie das Scan-Ergebnis mit der besten Signalstärke. Sobald Sie dies haben, sollten Sie auch die Liste der WLAN-Konfigurationen auf dem Gerät abrufen und sicherstellen, dass das Scan-Ergebnis mit dem stärksten Signal nicht bereits mit dem Gerät konfiguriert ist. Wenn dies der Fall ist, aktivieren Sie es einfach, wenn nicht, erstellen Sie einen neuen wie Sie sind. Dies wird Ihnen helfen, doppelte Konfigurationen zu vermeiden.

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

Und ja, sollten Sie den ‚wahren‘ Parameter zu verwenden, wenn Netzwerke ermöglicht. Dadurch können Sie sicherstellen, dass Sie eine Verbindung mit dem gewünschten Netzwerk herstellen.

wifiManager.enableNetwork(mNetID, true); 
Verwandte Themen