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?