更改WiFi-Direct IP范围?在Android WiFi-Direct中强制使用IPv6?

4
我有两个Android KitKat手机,它们都正在作为组所有者运行WiFi-Direct群组,我们称它们为GO1和GO2。
我成功将GO1作为遗留客户端连接到GO2,而不会破坏任何(先前设置的)wifi-direct组。
问题在于,正如您可能知道的那样,GO IP地址是硬编码在Android源中的,并设置为192.168.49.1。
因此,我的两个设备GO1和GO2具有相同的IP地址(**)...每个设备在其本地网络上都有一个IP地址。
我的应用程序同时充当客户端和服务器。但是,两个网络都使用相同的IP范围(192.168.49.XXX),显然我无法更改它。
因此,如果它们都托管WiFi-Direct群组,则无法在它们之间创建TCP连接,因为任何设备在尝试连接到192.168.49.1时都会连接到自身。
所以问题是:
- 有没有办法更改Wifi-Direct中使用的IP范围? - 有没有办法在Wifi-Direct中使用IPv6而不是IPv4? - 是否可以在不root手机的情况下完成这些操作? - 任何其他建议?
**:实际上,因为GO1作为遗留客户端连接到GO2,所以对GO2来说,GO1被认为是192.168.49.227(例如),对GO1来说,GO2被认为是192.168.49.1。但是因为GO1也是一个GO,所以它也被其客户端(和自己)认为是192.168.49.1。
3个回答

2
不用对手机进行root,绕过此问题的方法是通过多播UDP*发送数据包。这些数据包将从GO1传输到GO2。
但是,这样做会产生一些副作用:
  • 为了在网络中使用它,您必须在OSI应用层执行封装和路由(效率低下)。

  • 您还需要基于MAC地址进行路由,因为每个设备都具有相同的192.168.49.1地址。

  • “重要的是要注意,多播套接字封装了一对多的单播通信,因此无法充分利用总可用的WiFi和WiFi直连带宽”*

值得注意的另一件事:
  • 随着GO数量的增加,所有节点都在同一个WiFi频道上运行会导致问题。少量设备不是问题,但是大量设备会成为一个巨大问题。
*这种方法在Colin Funai、Cristiano Tapparello和Wendi Heinzelman的论文《通过WiFi Direct多组网络支持多跳设备对设备网络》中提到,可以在此处找到:https://arxiv.org/pdf/1601.00028.pdf

0

无法更改IP范围,因为正如您所指出的那样,它是硬编码在Android Wi-Fi Direct系统服务中的。就个人而言,我不知道Wi-Fi P2P接口是否启用了IPv6,即使启用了,也可能是一个硬编码的IPv6地址。

如果GO1和GO2必须在GO模式下相互连接,则可以考虑使用蓝牙或其他传输方式来允许它们进行通信。如果GO1和GO2之间的通信可以延迟,则缓存要交换的任何信息,并在这两个设备之间发送它们时,其中一个设备可以成为另一个设备的客户端,例如当GO1可以停止成为GO并且可以成为GO2的客户端时。


IPv6地址很可能也会被硬编码。但这并不重要,因为我可以简单地设置GO1使用IPv4,而GO2使用IPv6。这样,即使地址是硬编码的,它们仍然会不同。最终,我选择了蓝牙方法,在这种情况下,它比具有间歇连接的延迟通信更好。 - Gett

0

实际上,可以通过使用IPv6本地链路地址(其中group是从广播或请求中收到的WifiP2pGroup)来解决这个问题:

val interfaceName = group?.`interface`
val linkInterface = NetworkInterface.getNetworkInterfaces().toList()
            .firstOrNull {
                it.name == interfaceName
            }

val linkLocalAddr = linkInterface?.inetAddresses?.toList()
            ?.firstOrNull { it.isLinkLocalAddress && it is Inet6Address } as? Inet6Address

IPv6地址是“范围限定”到特定的网络接口。使用IPv6链路本地地址,您可以发送/接收GO1和GO2之间的流量。连接设备在自动连接后无法找到链路本地地址,因此您需要以其他方式广播它(例如,使用本地服务发现 txt记录)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接