Android - Как сканировать точки доступа и выбирать самый сильный сигнал? - PullRequest
7 голосов
/ 13 мая 2010

В настоящее время я пытаюсь написать в Android класс, который будет сканировать точки доступа, вычислять, какая точка доступа имеет лучший сигнал, и затем подключаться к этой точке доступа.

Таким образом, приложение сможет сканировать на ходу и подключаться к новым точкам доступа на ходу.

У меня работает сканирование и расчет лучшего сигнала.

Но когда дело доходит до подключения к лучшей точке доступа, у меня возникают проблемы.

Похоже, что enableNetwork (netid, othersTrueFalse) является единственным методом подключения к точке доступа, но это вызывает проблемы, так как из результатов сканирования я не могу получить идентификатор точки доступа с самым сильным сигналом.

Это мой код:


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

}

Когда я пытаюсь использовать addNewAccessPoint (ScanResult scanResult), он просто добавляет еще одну точку доступа в список в приложении настроек с тем же именем, что и имя с лучшим сигналом, поэтому я получаю множество дубликатов и фактически не подключаю их.

Может кто-нибудь указать мне в сторону лучшего решения?

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Просто изменить

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

до

boolean b = mainWifi.enableNetwork(res, true); 
0 голосов
/ 27 февраля 2014

Подробнее к сути вашего вопроса. Сначала вы определяете результат сканирования с наилучшим уровнем сигнала. После этого вы также должны получить список конфигураций Wi-Fi, уже имеющихся на устройстве, и убедиться, что результат сканирования с самым сильным сигналом еще не настроен на устройстве. Если это так, просто включите его, если нет, создайте новый, как вы. Это поможет вам избежать дублирования конфигов.

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

И да, обязательно используйте параметр true при включении сетей. Это поможет вам подключиться к сети, которую вы собираетесь.

wifiManager.enableNetwork(mNetID, true);
...