2010-05-13 24 views
7

Je suis actuellement en train d'essayer d'écrire une classe dans Android qui va rechercher les points d'accès, calculer quel point d'accès a le meilleur signal et ensuite se connecter à ce point d'accès. Ainsi, l'application pourra numériser en déplacement et se connecter à de nouveaux points d'accès en déplacement.Android - Comment scanner les points d'accès et sélectionner le signal le plus fort?

J'ai le balayage et le calcul du meilleur signal de travail.

Mais quand il s'agit de s'attacher au meilleur point d'accès, j'ai des problèmes. Il semble que enableNetwork (netid, othersTrueFalse) est la seule méthode pour attacher à un point d'accès, mais cela pose problème à cause de mes résultats d'analyse. Je n'arrive pas à 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 de l'utiliser ajoute juste addNewAccessPoint (ScanResult scanResult) un autre point d'accès à la liste dans l'application des paramètres avec le même nom que celui avec le meilleur signal, donc je me retrouve avec des charges de doublons et pas vraiment attachés à eux.

Quelqu'un peut-il me diriger vers une meilleure solution?

Répondre

3

changer simplement

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

à

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

Plus au point de votre question. Vous commencez par déterminer le résultat du balayage avec la meilleure force de signal. Une fois que vous avez cela, vous devriez également obtenir la liste des configurations wifi déjà sur l'appareil et assurez-vous que le résultat de l'analyse avec le signal le plus fort n'est pas déjà configuré avec l'appareil. Si c'est le cas, activez-le simplement, sinon, créez-en un nouveau tel que vous êtes. Cela vous aidera à éviter les 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, veillez à utiliser le paramètre 'true' lors de l'activation des réseaux. Cela vous aidera à vous connecter au réseau que vous avez l'intention de créer.

wifiManager.enableNetwork(mNetID, true);