2010-05-13 12 views
7

Obecnie próbuję napisać klasę w systemie Android, która będzie skanować punkty dostępu, oblicz, który punkt dostępu ma najlepszy sygnał, a następnie połączyć się z tym punktem dostępu.Android - Jak skanować punkty dostępu i wybierać najsilniejszy sygnał?

Dzięki temu aplikacja będzie mogła skanować w ruchu i dołączać do nowych punktów dostępu w podróży.

Mam skanowanie i obliczanie najlepszego sygnału działającego.

Ale jeśli chodzi o dołączanie do najlepszego punktu dostępu, mam problem.

Wygląda na to, że enableNetwork (netid, otherTrueFalse) jest jedyną metodą dołączenia do punktu dostępu, ale powoduje to problemy, ponieważ z moich wyników skanowania nie jestem w stanie uzyskać identyfikatora punktu dostępowego z najsilniejszym sygnałem.

To jest mój kod:


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

} 

Kiedy próbuję użyć addNewAccessPoint (ScanResult scanResult) to tylko dodaje inny AP lista w aplikacji ustawień o tej samej nazwie, co ta z najlepszym sygnałem, więc kończę z mnóstwem duplikatów i nie przywiązuję się do nich.

Czy ktoś może wskazać mi kierunek lepszego rozwiązania?

Odpowiedz

3

Wystarczy zmienić

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

do

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

Więcej do punktu pytanie. Najpierw określasz wynik skanowania z najlepszą siłą sygnału. Gdy już to zrobisz, powinieneś również uzyskać listę konfiguracji wifi już na urządzeniu i upewnić się, że wynik skanowania z najsilniejszym sygnałem nie jest już skonfigurowany z urządzeniem. Jeśli tak, po prostu włącz go, jeśli nie, utwórz nowy tak jak w rzeczywistości. Pomoże to uniknąć duplikowania konfiguracji.

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

I tak, należy pamiętać, aby użyć parametru "true" podczas włączania sieci. Pomoże to zapewnić połączenie z siecią, którą zamierzasz.

wifiManager.enableNetwork(mNetID, true); 
Powiązane problemy