2013-07-29 26 views
5

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.

+2

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

Odpowiedz

1

To nie może być tylko problem związany z oprogramowaniem. Zwykle karta sieciowa (wifi) jest odpowiedzialna za śledzenie poziomów sygnału i decydowanie, kiedy wędrować i gdzie wędrować. Algorytmy te są specyficzne dla dostawcy i może nie być sposobu, aby na nie wpłynąć. Roaming odbywa się poprzez wysyłanie ramek (żądań) 802.11 od klienta, a proces roamingu odbywa się na poziomie L2 (w twoim scenariuszu). Ale proces może nie być tak prosty. Oba punkty dostępu powinny być świadome, czy klient przemieścił się i ramka przełączająca wysyłanie do AP powinna mieć tę aktualizację w swojej tabeli CAM. Punkt dostępowy, z którego klient korzysta z roamingu, może buforować wszystkie klatki przeznaczone dla klienta i wysyłać go do nowego punktu dostępowego, gdy klient ponownie się złączy, co nie spowoduje utraty danych. Ponieważ nie jest to wymagane w przypadku standardu 802.11, roaming może spowodować utratę danych, a po ponownym podłączeniu do punktu dostępowego z silniejszym sygnałem nastąpi spadek połączenia, ponieważ nie jest to tylko roaming, ale pełne rozłączenie i ponowne połączenie z siecią.

Prawdopodobnie nie pomaga to w rozwiązaniu problemu, ale starałem się wskazać, że jest to naprawdę coś, co należy zrobić na niższych poziomach (fizycznym, łącza danych lub transportu), a nie na poziomie aplikacji. Pogoda w roamingu będzie praktycznie płynna, zależy od sprzętu (po obu stronach) i konfiguracji sieci, i niewiele można zrobić, aby to zmienić. Jedyne, co przychodzi na myśl, to wysyłanie żądań sond 802.11, aby klient był świadomy innych AP z potencjalnie silniejszymi sygnałami, które już robisz w swoim kodzie, i pozostawiając decyzję o wędrowaniu do karty sieciowej.

+0

Widzę, że jeśli jest to ograniczenie sprzętowe, niewiele można zrobić. Jednak zastanawiałem się, nawet przy tym cyklu rozłączania/łączenia, czy istnieje sposób na uniknięcie opuszczenia przez system istniejących połączeń. Mamy zdalny wyświetlacz, który przekracza limit czasu i całkowicie przerywa połączenie podczas przełączania, i szukamy sposobu obejścia tego problemu, który nie obejmuje pełnego ponownego połączenia aplikacji, jeśli to możliwe. –

+0

Jeśli możesz, lepiej skupić się na utrzymywaniu połączeń w aplikacji, nawet jeśli połączenie sieciowe jest niestabilne.Jest to prawdopodobny scenariusz dla Wi-Fi, a poza tym, nawet jeśli wędrujesz do innego AP, w zależności od HW i implementacji sieci możesz uzyskać przerwy w połączeniu, które mogą trwać kilka sekund, nawet jeśli proces roamingu trwa mniej niż 0,1 s. Niektóre routery/FW mogą również wysyłać Ci RST TCP/IP (resetowanie połączenia), jeśli aplikacja jest nieaktywna przez jakiś czas. Powinieneś mieć kontrolę nad aplikacją, aby poradzić sobie z takimi problemami, ponieważ niestety nie możesz ich wyeliminować. – pajaja

+0

Może to być trudne w aplikacjach działających w czasie rzeczywistym, co może wiązać się z poważniejszymi wadami podczas odłączania/łączenia się z innym punktem dostępowym zamiast roamingu. Na przykład, inne niż całkowite zresetowanie połączenia TCP DHCP może wydać inny adres IP, który w zależności od tego, w jaki sposób zaimplementowano uwierzytelnianie, może doprowadzić do więcej pracy dla ciebie, aby szybko nawiązać połączenie ponownie. Przykro mi, ale nie mogę ci pomóc. Nie jestem ekspertem od Androida, więc mogą istnieć pewne wbudowane mechanizmy, które mogą zrobić (lub pomóc), ale jest bardzo mało prawdopodobne, aby można było ich całkowicie uniknąć. – pajaja

Powiązane problemy