Rozwijamy małą aplikację dla systemu Android, aby płynnie przełączać się między dwoma różnymi punktami dostępu bezprzewodowego w tej samej sieci (ten sam identyfikator SSID i tę samą konfigurację sieci, ale różne lokalizacje fizyczne), aby nie zrzucać istniejących połączeń po wykonaniu przekazania. Czytałem kilka postów wyjaśniających programowo sterowanie wifi, a teraz mamy półdziałające rozwiązanie.Płynne przekazywanie WiFi w systemie Android
Sposób, w jaki go zaimplementowaliśmy, usługa skanuje AP pod kątem zgodności z naszymi kryteriami z najlepszym sygnałem, a jeśli jest inny niż ten, z którym system jest obecnie połączony, przełączy się na nowy AP. Odpowiedni fragment kodu:
...
// Some initializations and bestOne is the ScanResult with the best signal
conf.BSSID = bestOne.BSSID;
actualNid = mWifiManager.updateNetwork(conf);
mWifiManager.enableNetwork(actualNid, false);
mWifiManager.saveConfiguration();
conf = getWifiConfiguration(mWifiManager, conf);
if(conf == null) {
return;
}
if(!mWifiManager.enableNetwork(conf.networkId, true)) {
return;
}
if (mWifiManager.reconnect()) {
// Great
} else {
// Error
}
Problem polega na tym, że wszystkie wykonanie przechodzi oczekiwanej ścieżki kodu. Jednak przekazanie nie jest wykonywane, dzienniki są wyświetlane podczas ponownego nawiązywania połączenia i zwracana jest wartość true. Ponadto nie ma żadnych zdarzeń od żadnego SUPPLICANT_CONNECTION_CHANGE_ACTION lub SUPPLICANT_STATE_CHANGED_ACTION, więc wydaje się, że przekazanie nie zostało nawet wywołane.
Kolejnym faktem jest to, że jeśli włączysz mWifiManager.disconnect() przed włączeniem sieci, przekazanie zostanie faktycznie wykonane. Nie jest to jednak możliwe, ponieważ uruchomione aplikacje tracą łączność, co powoduje przerwanie sesji, czego właśnie chcemy uniknąć.
Wszelkie sugestie są mile widziane.
Nie sądzę, że jest to możliwe do osiągnięcia z poziomu aplikacji. Na poziomie sterownika Wi-Fi prawdopodobnie, ale nie jest to łatwe: http://code.google.com/p/android/issues/detail?id=12649 (mówi "To jest funkcja sprzętowa" - więc może nawet nie na poziom sterownika) – zapl