2014-09-13 6 views
19

Pracuję nad aplikacją mobilną (iOS i Android), aby sterować urządzeniem przez Wi-Fi. Urządzenie tworzy sieć bezprzewodową (SoftAP), ale nie zapewnia dostępu do Internetu.Android: Jak korzystać z sieci Wi-Fi dla konkretnych hostów, ale korzystam z telefonu Sieć komórkowa dla wszystkiego innego

W systemie iOS mogę połączyć się z urządzeniem i wysyłać żądania na jego adres IP: (192.168.70.1), ale wszystkie inne żądania zostają cofnięte do sieci komórkowej. Dzięki temu telefon może utrzymywać połączenie z Internetem, gdy jest podłączony do urządzenia przez Wi-Fi.

Jeśli korzystam z systemu Android po połączeniu się z siecią bezprzewodową urządzenia, żądania Internetu nie powracają do połączenia mobilnego, po prostu się nie udają.

W mojej aplikacji na Androida mogę użyć numeru ConnectivityManager.requestRouteToHost, aby wymuszać żądania z mojej aplikacji do korzystania z sieci komórkowej. Jednak żądania innych aplikacji nadal wykorzystują sieć Wi-Fi urządzenia i kończą się niepowodzeniem.

Próbowałem również użyć ConnectivityManager zmienić preferencje sieciowe z:

ConnectivityManager.setNetworkPreference (ConnectivityManager.TYPE_MOBILE)

To powoduje, że telefon do korzystania z sieci komórkowej dla wszystkich wnioski ze wszystkich aplikacji. Wi-Fi jest wyłączone. Wygląda na to, że w poprzednich wersjach Androida Wi-Fi można było nadal używać, nawet jeśli nie jest to "preferowana" sieć, ale nie działa to w KitKat. Prawdopodobnie jest to związane ze zmianą w systemie Android 4.2: https://code.google.com/p/android/issues/detail?id=73509 "Menedżer połączeń od 4.2 rozdzierania sieci, które nie są NetworkPreference"

Czy istnieje rozwiązanie, które pozwala aplikacji na Androida na korzystanie z Wi-Fi dla określonego adresu IP i sieć mobilna na wszystko inne? Może to zrobić za pośrednictwem NDK?

+0

Czy znalazłeś rozwiązanie, aby określić sieć czarownic, której chcesz używać we wszystkich wersjach Androida? – DjimOnDev

+0

Nie. Możliwe, że istnieje rozwiązanie dla Lollipopa, ale nie miałem jeszcze czasu na jego zbadanie. –

+0

@PaulGreyson, jak to zrobiłeś dla systemu iOS? Szukam podobnego rozwiązania, aby wysyłać żądania http przez sieć komórkową, gdy urządzenie jest w sieci Wi-Fi. – keno

Odpowiedz

2

Android zwykle rozdziera sieci, które nie są preferowane w sieci. Obejściem, z którego można skorzystać, jest utworzenie punktu dostępowego za pośrednictwem aplikacji mobilnej i połączenie urządzenia z tym urządzeniem. W ten sposób telefon komórkowy może utrzymywać łączność internetową oraz komunikować się z urządzeniem.

sprawdź poniższe linki do szczegółów implementacji:

https://github.com/opengarden/android-tether

https://code.google.com/p/android-wifi-tether/

+0

Dzięki za sugestię, ale potrzebuję rozwiązania, które umożliwi działanie urządzenia jako AP. –

1

Podobny zadawane przed jak Enable simultaneouly wifi and 3G interface on Android i szybka odpowiedź nie była.

Ale to jest rzeczywiście możliwe i realizowane w niektórych programach, takich jak SuperDownload (patrz stackexchange)

To oprogramowanie wymaga korzeń.

http://geeknizer.com/wp-content/uploads/2012/08/super-download-3g-wifi.jpg

dwukanałowy do pobrania jest również polecała w jakiś nowy telefon z Androidem.(Nie mogę znaleźć linku, używali nowy termin marketingowy dla WiFi + 3G używany razem)

Czy istnieje rozwiązanie, które pozwala Android aplikacja do korzystania z sieci WiFi dla określonego adresu IP i sieci komórkowej do wszystkiego ? Może to zrobić za pośrednictwem NDK?

Prawdopodobnie dlatego, że WiFi jest potrzebne tylko dla lokalnego adresu, możesz zrobić specjalny sterownik WiFi, ale to znowu nie będzie proste.

Idąc dalej w dół do oprogramowania:

ta funkcja jest pakiety IP Routing TCP /. Jeśli wiesz, jak zaimplementować to w Linuksie, jesteś w połowie gotowy. Kolejny będzie działał na Androida. Ale myślę, że nie byłoby to możliwe dla aplikacji niesystemowej, ponieważ byłoby to łatwe do wykorzystania zabezpieczenie całości (np. Zastępczy adres IP serwera bankowego)

+0

Wymaganie roota nie jest dla mnie opcją, ani nie tworzy specjalnego sterownika Wi-Fi. W przypadku bezpośredniego działania z routingiem TCP/IP, pytanie brzmi, czy mogę uzyskać działanie systemu Wi-Fi po użyciu ConnectivityManager.setNetworkPreference, aby zmusić resztę urządzenia do sieci mobilnej. –

9

Właściwie możesz, ale tylko od Lollipopa (API 21).

Z Android API 21 Dokumentacja:

Android 5.0 provides new multi-networking APIs that let your app dynamically scan for available 
networks with specific capabilities, and establish a connection to them. This functionality is useful 
when your app requires a specialized network, such as an SUPL, MMS, or carrier-billing network, or if 
you want to send data using a particular type of transport protocol. 

Więc można użyć klasy NetworkRequest.Builder stworzyć NetworkRequest który wysyła żądanie nad pewnym Transport Type.

pomocą następujących funkcji:

NetworkRequest.Builder addTransportType(int transportType) 

Aby ustawić rodzajów transportu (WIFI, ETHERNET lub CELLULAR na przykład) dla swoich żądań.

+0

To wygląda jak właściwe rozwiązanie. Dzięki! –

+0

Po drugie, będę musiał przetestować to, aby zweryfikować.Pytanie brzmi, czy ten nowy interfejs API może być z powodzeniem używany w połączeniu z ConnectivityManager.setNetworkPreference (ConnectivityManager.TYPE_MOBILE). –

+1

Mamy nadzieję, że po żądaniu sieci wifi setNetworkPreference() przełączy resztę urządzenia na sieć mobilną i opuści sieć Wi-Fi w miejscu. –

0

To może być proste rozwiązanie: ustaw Wi-Fi jako preferowany interfejs za każdym razem, gdy potrzebujesz kontrolować urządzenie i ustaw preferowaną sieć komórkową zaraz po zakończeniu pracy. Może to przerwać jednoczesne działania internetowe, ale pamiętaj, że TCP i większość aplikacji pozwala na opóźnienie do kilku sekund (lub nawet więcej). Przerwa jest znikoma, jeśli praca kontrolna urządzenia jest sporadyczna i nigdy nie wymaga długiego oczekiwania.

Jeśli powyższa sytuacja nie ma miejsca, wykonaj odwrotność: ustaw Wi-Fi jako preferowany interfejs jako domyślny i ustaw preferowaną sieć komórkową, gdy nie musisz sterować urządzeniem. Ale pamiętaj, aby często przełączać się z powrotem do sieci komórkowej, na przykład co 3 sekundy, aby zapobiec przekroczeniu limitu czasu aktywności w Internecie.

+0

Niestety to nie zadziała w moim scenariuszu, ponieważ muszę utrzymywać trwałe połączenie TCP z urządzeniem. –

Powiązane problemy