Question

Je tente actuellement d'écrire une classe dans Android qui recherche les points d'accès, calculate quel point d'accès a le meilleur signal, puis se connecter à ce point d'accès.

Ainsi, l'application sera capable de scanner en mouvement et le joindre à de nouveaux points d'accès sur la route.

Je l'analyse et le calcul du meilleur travail du signal.

Mais quand il vient à attacher au meilleur point d'accès Je ne parviens pas.

Il semble que enableNetwork (netid, othersTrueFalse) est la seule méthode pour la fixation à un point d'accès, mais cela pose des problèmes à partir de mes résultats d'analyse que je ne suis pas en mesure d'obtenir l'identifiant du point d'accès avec le signal le plus fort.

Ceci est mon 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 );

}

Lorsque je tente d'utiliser addNewAccessPoint (ScanResult scanResult), il ajoute juste un autre point d'accès à la liste dans les paramètres de l'application avec le même nom que celui avec le meilleur signal, donc je finis avec des charges de doublons et de ne pas attacher réellement les.

point Quelqu'un peut-moi dans le sens d'une meilleure solution?

Était-ce utile?

La solution

Il suffit de changer

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

à

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

Autres conseils

Plus au point de votre question. D'abord, vous déterminez le résultat d'analyse avec la meilleure puissance du signal. Une fois que vous avez, vous devriez également obtenir la liste des configurations wifi déjà sur l'appareil et faire en sorte que le résultat d'analyse avec le signal le plus puissant est pas déjà configuré avec l'appareil. Dans ce cas, il suffit d'activer, sinon, créez une nouvelle que vous êtes. Cela vous aidera à éviter configs en double.

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

Et oui, assurez-vous d'utiliser le paramètre « true » lors de l'activation des réseaux. Cela vous aidera à assurer vous connecter au réseau que vous souhaitez.

wifiManager.enableNetwork(mNetID, true);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top