Android 安卓:如何在特定主机上使用Wifi网络,而在其他主机上使用手机网络

Android 安卓:如何在特定主机上使用Wifi网络,而在其他主机上使用手机网络,android,networking,mobile,Android,Networking,Mobile,我正在开发一个移动应用程序(iOS和Android),通过Wi-Fi控制设备。该设备创建无线网络(SoftAP),但不提供对internet的访问 在iOS上,我可以连接到设备并向其IP地址(192.168.70.1)发出请求,但所有其他请求都返回到移动网络。这允许手机在通过Wi-Fi连接到设备时保持互联网连接 在Android上,如果我连接到设备无线网络,互联网请求不会返回到移动连接,它们只是失败 在我的Android应用程序中,我可以使用来强制我的应用程序的请求使用移动网络。但是,其他应用程

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

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

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

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

我还尝试使用
ConnectivityManager
更改网络首选项:

ConnectionManager.setNetworkPreference(ConnectionManager.TYPE_MOBILE)

这会导致手机使用移动网络处理来自所有应用程序的所有请求。Wi-Fi已禁用。在以前的Android版本中,尽管Wi-Fi不是“首选”网络,但它似乎仍然可以使用,但在KitKat中似乎不起作用。这可能与Android 4.2中的一个变化有关:“ConnectivityManager,因为4.2破坏了不属于NetworkPreference的网络”


有没有一种解决方案可以让Android应用程序使用Wi-Fi连接特定的IP地址,移动网络连接其他所有内容?也许这可以通过NDK来实现?

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

有关实施细节,请参阅以下链接:

以前也问过类似的问题,快速回答是否定的

但它实际上是可能的,并在一些软件中实现,如 (见附件)

那个软件需要root


(来源:)

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

有没有一种解决方案可以让Android应用程序使用Wi-Fi连接特定的IP地址,移动网络连接其他所有内容?也许这可以通过NDK完成

可能是因为只有本地地址才需要WiFi,所以你们可以制作特殊的WiFi驱动程序,但这也不简单

进一步深入到软件领域:


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

实际上你可以,但只有在棒棒糖(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 addTransportType(int transportType)

为您的请求设置传输类型(,或例如)。

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


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

谢谢您的建议,但我需要一个解决方案,允许该设备充当AP。再想一想,我需要对此进行测试以验证。问题是这个新API是否可以成功地与ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE)结合使用。希望在请求wifi网络后,setNetworkPreference()将设备的其余部分切换到移动网络,并保留wifi网络。不幸的是,这在我的场景中不起作用,因为我需要保持与设备的持久TCP连接。我不能选择使用root,也不能创建特殊的wifi驱动程序。Wrt直接使用TCP/IP路由,问题是,在使用ConnectivityManager.setNetworkPreference强制将设备的其余部分转移到移动网络后,我是否可以让WiFi系统运行。您是否找到一个解决方案来指定要在所有android版本上使用的witch网络?没有。可能有一个解决方案可以解决棒棒糖问题,但我没有时间调查一下吧。@PaulGreyson,你是怎么为iOS做这件事的?我正在寻找一个类似的解决方案,当设备在wifi上时,通过移动网络发出http请求。在iOS上,只要wifi路由器没有说它可以路由互联网请求,它“就可以工作”。在我的例子中,逻辑都在提供AP的设备上的udhcpd.conf中,我没有提供选项subnet、domain和dns设置。iOS显然认识到,这意味着AP不是一个合适的网关,而是转到LTE。