2014-09-13 36 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

相关问题