Android:如何为特定主机使用Wifi网络,但手机使用移动网络用于其他所有主机

时间:2014-09-13 00:53:47

标签: android networking mobile

我正在开发一个移动应用程序(iOS和Android)来通过Wi-Fi控制设备。该设备创建无线网络(SoftAP),但不提供对互联网的访问。

在iOS上,我可以连接到设备并向其IP地址(192.168.70.1)发出请求,但所有其他请求都会回退到移动网络。这样,手机可以在通过Wi-Fi连接到设备时保持互联网连接。

在Android上,如果我连接到设备无线网络,互联网请求不会回退到移动连接,它们就会失败。

在我的Android应用中,我可以使用ConnectivityManager.requestRouteToHost强制来自我的应用的请求来使用移动网络。但是,其他应用程序发出的请求仍然使用设备wifi网络并失败。

我还尝试使用ConnectivityManager更改网络偏好设置:

  

ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE)

这会导致手机使用移动网络处理来自所有应用程序的所有请求。 Wi-Fi已禁用。似乎在早期版本的Android中,即使它不是“首选”网络,仍然可以使用Wi-Fi,但这似乎在KitKat中不起作用。这可能与Android 4.2中的更改有关:https://code.google.com/p/android/issues/detail?id=73509“自4.2以来ConnectivityManager拆除了不是NetworkPreference的网络”

是否有一个解决方案允许Android应用将Wi-Fi用于特定的IP地址,移动网络用于其他所有内容?也许这可以通过NDK来完成?

4 个答案:

答案 0 :(得分:10)

实际上你可以,但仅限于Lollipop(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)。

答案 1 :(得分:3)

Android通常会删除不是网络偏好的网络。 您可以使用的解决方法是通过移动应用程序创建AP并让设备连接到它。 通过这种方式,移动设备可以保持互联网连接以及与设备通信。

请参阅以下链接以了解实施细节:

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

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

答案 2 :(得分:2)

类似之前被问到Enable simultaneouly wifi and 3G interface on Android并且快速回答是否定的。

但它实际上可以在SuperDownload等软件中实现并实现 (见stackexchange

该软件需要root。

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

两个频道下载也在一些新的Android手机上做广告。 (我找不到链接,他们使用新的营销术语一起使用WiFi + 3G)

  

是否有一个解决方案允许Android应用将Wi-Fi用于特定的IP地址,移动网络用于其他所有内容?也许这可以通过NDK来完成?

可能因为只需要本地地址的WiFi,你可以开始制作特殊的WiFi驱动程序,但这又不简单。

进一步深入软件:

此功能是TCP / IP包路由。如果你知道如何在Linux上实现这一点,你就完成了一半。接下来就是让它在Android上运行。但我想这不会启用非系统应用程序,因为这将是易于利用的安全整体(例如替代银行服务器IP)

答案 3 :(得分:1)

这可能是一个简单的解决方案:每次需要控制设备时将WiFi设置为首选界面,并在完成作业后立即设置移动网络首选项。这样做可能会中断并发Internet活动,但提醒TCP和大多数应用程序允许延迟几秒钟(甚至更长时间)。如果您的设备的控制作业是零星的并且从不需要长时间等待,则中断可以忽略不计。

如果上述情况不是这样,请执行相反的操作:将WiFi设置为首选接口作为默认设置,并在您不必控制设备时将移动网络设置为首选。但请确保频繁切换回移动网络,比如每3秒钟一次,以防止您的互联网活动超时。