Frage

Ich versuche zur Zeit eine Klasse in Android zu schreiben, die für Access Points Scan werden, berechnen den Zugangspunkt das beste Signal hat und dann zu diesem Zugangspunkt zu verbinden.

So ist die Anwendung in der Lage, in Bewegung und heftet sie an neue Access Points auf dem Sprung zu scannen.

Ich habe das Scannen und die Berechnung der besten Signalverarbeitung.

Aber wenn es darum geht, den besten Zugang zu befestigen ich Probleme, bin.

Es scheint, dass enableNetwork (netid, othersTrueFalse) ist die einzige Methode zu einem Access Point Anbringen aber dies führt zu Problemen, wie aus meinem Prüfergebnissen ich nicht in der Lage bin 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, addNewAccessPoint zu verwenden (ScanResult scanResult) fügt nur eine weitere AP in die Liste der Einstellungen-Anwendung mit dem gleichen Namen wie das mit dem besten Signal, so dass ich mit jeder Menge Duplikate am Ende und nicht wirklich angebracht zu sie.

Kann jemand Punkt mich in Richtung einer besseren Lösung?

War es hilfreich?

Lösung

Einfach ändern

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

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

Andere Tipps

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

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. Dies wird dazu beitragen sicherzustellen, dass Sie mit dem Netzwerk verbinden Sie beabsichtigen.

wifiManager.enableNetwork(mNetID, true);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top