2014-09-13 35 views
19

我正在開發移動應用程序(iOS和Android)以通過Wi-Fi控制設備。該設備創建無線網絡(SoftAP),但不提供對互聯網的訪問。Android:如何爲特定主機使用Wifi網絡,但使用手機使用移動網絡一切

在iOS上,我可以連接到設備並向其IP地址(192.168.70.1)發出請求,但所有其他請求都會回退到移動網絡。這可讓手機在通過Wi-Fi連接到設備時保持互聯網連接。

在Android上,如果我連接到設備無線網絡,互聯網請求不會回退到移動連接,它們只會失敗。

在我的Android應用程序中,我可以使用ConnectivityManager.requestRouteToHost來強制從我的應用程序使用移動網絡的請求。但是,其他應用程序發出的請求仍然使用設備WiFi網絡並失敗。

我也曾嘗試使用ConnectivityManager更改與網絡偏好:

ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE)

這將導致使用移動網絡的所有電話所有應用程序的請求。無線網絡無法使用。看來在以前版本的Android Wi-Fi仍然可以使用,即使它不是「首選」網絡,但這似乎不適用於KitKat。它可能與Android 4.2中的更改有關:https://code.google.com/p/android/issues/detail?id=73509「ConnectivityManager自4.2撕下不屬於NetworkPreference的網絡」

是否有解決方案允許Android應用程序使用Wi-Fi作爲特定IP地址,移動網絡的一切?也許這可以通過NDK完成?

+0

您是否找到了解決方案來指定您想要在所有Android版本上使用的女巫網絡? – DjimOnDev 2015-04-28 08:00:48

+0

不,這可能是有一個棒棒糖的解決方案,但我還沒有時間去調查它。 – 2015-04-28 23:07:33

+0

@PaulGreyson,你是怎麼做到這一點的iOS?我正在尋找類似的解決方案,通過移動網絡在設備使用wifi時發出http請求。 – keno 2015-07-02 18:44:36

回答

2

Android通常會撕下不屬於網絡偏好的網絡。 您可以使用的解決方法是通過移動應用程序創建一個AP,並讓設備連接到它。 通過這種方式,手機可以保持互聯網連接以及與設備進行通信。

請參考以下鏈接的實現細節:

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

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

+0

感謝您的建議,但我需要一個解決方案,使設備充當AP。 – 2014-11-21 21:49:10

1

類似之前問,Enable simultaneouly wifi and 3G interface on Android和快速的答案是NO。

但它實際上是可能的,像SuperDownload 一些軟件實現(見stackexchange

該軟件需要root。

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

雙通道下載也在一些新的Android手機做廣告。(我找不到鏈接,他們用新的營銷術語,支持WiFi + 3G一起使用)

有沒有一種解決方案,允許Android應用使用WiFi以一個特定的IP地址和其他所有的移動網絡?也許這可以通過NDK完成?

可能是因爲只需要本地地址的WiFi,你可以去製作特殊的WiFi驅動程序的方式,但是這又不會簡單。

而且會進一步下跌到軟件:

這個功能是TCP/IP包的路由。如果你知道如何在Linux上實現,你已經完成了一半。接下來會讓它在Android上運行。但我想這不會啓用非系統應用程序,因爲這將是容易利用的安全整體(例如替代銀行服務器IP)

+0

要求root不是我的選擇,也不是創建一個特殊的WiFi驅動程序。 Wrt直接使用TCP/IP路由,問題在於在使用ConnectivityManager.setNetworkPreference來強制設備的其餘部分通過移動網絡後,是否可以讓WiFi系統運行。 – 2014-11-26 16:30:01

9

其實你可以,但只有自從棒棒堂(API 21)。

從Android API文檔21:

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. 

所以,你可以使用NetworkRequest.Builder類來創建一個NetworkRequest發送超過一定Transport Type請求。

使用以下功能:

NetworkRequest.Builder addTransportType(int transportType) 

要爲您的要求設置傳輸類型(WIFIETHERNETCELLULAR爲例)。

+0

這看起來像是正確的解決方案。謝謝! – 2014-11-26 01:14:32

+0

關於第二個想法,我將需要對此進行測試以驗證。問題是這個新API是否可以與ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE) – 2014-11-26 15:20:37

+1

一起成功使用。希望在請求wifi網絡後,setNetworkPreference()會將設備的其餘部分切換到移動網絡並離開wifi網絡到位。 – 2014-11-26 16:24:17

0

這可能是一個簡單的解決方案:每次需要控制設備時將WiFi設置爲首選接口,並在完成作業後立即設置移動網絡。這樣做可能會中斷併發的Internet活動,但請注意,TCP和大多數應用程序允許延遲幾秒(甚至更多)。如果您的設備的控制作業零星且不需要長時間等待,則中斷可以忽略不計。

如果不是這種情況,請做相反的處理:將WiFi設置爲首選接口作爲默認接口,並且無需控制設備即可設置首選移動網絡。但請確保您經常切換回移動網絡,例如每3秒鐘一次,以防止您的互聯網活動超時。

+0

不幸的是,這在我的方案中不起作用,因爲我需要維護與設備的持續TCP連接。 – 2014-11-26 16:26:19

相關問題