我有两个Android KitKat手机,两个都是作为群组所有者运行WiFi-Direct群组,我们称之为GO1和GO2
我设法将GO1作为传统客户端连接到GO2而不会破坏任何(先前设置的)wifi直接组。
问题在于,正如您所知,GO IP地址在Android源代码中是硬编码的,并设置为192.168.49.1
因此,我的两个设备GO1和GO2在本地网络上都有相同的IP地址(**)。
我的应用程序同时是客户端和服务器。但是两个网络都使用相同的IP范围(192.168.49.XXX),显然,我无法改变。
因此,如果他们同时托管WiFi-Direct组,我就无法在他们之间创建TCP连接,因为任何设备在尝试连接到192.168.49.1时都会连接到自身
所以问题是:
**:实际上,因为GO1作为传统客户端连接到GO2,所以GO1被称为192.168.49.227(例如)到GO2,GO2被称为192.168.49.1到GO1。但是因为GO1也是GO,它的客户(以及它自己)也称为192.168.49.1。
答案 0 :(得分:1)
在不使用手机的情况下解决此问题的方法是通过多播UDP *发送数据包。这些数据包将从GO1到GO2。
这有一些副作用:
要将其用于网络,您必须在OSI应用程序级别执行封装和路由(效率不高)。
您还需要根据MAC地址进行路由,因为每个设备都具有相同的192.168.49.1地址。
"重要的是要注意多播套接字封装了一对多的单播通信,因此,无法充分利用总的可用WiFi和WiFi Direct带宽" *
还有其他值得注意的事情:
*这种方法在Colin Funai,Cristiano Tapparello和Wendi Heinzelman论文中提到,标题为"通过WiFi直接多组网络支持多跳设备到设备网络"在这里找到:https://arxiv.org/pdf/1601.00028.pdf
答案 1 :(得分:0)
无法更改IP范围,因为正如您正确指出的那样,它在Android Wi-Fi Direct系统服务中是硬编码的。就个人而言,我不知道在Wi-Fi P2P接口上启用了IPv6,即使它是,它也可能是一个硬编码的IPv6地址。
如果GO1和GO2必须在GO模式下相互连接,那么可能会考虑使用蓝牙或其他传输来允许它们进行通信。如果可以延迟GO1和GO2之间的通信,则缓存要交换的任何信息,并且当一个设备可以是另一个设备的客户端时,可以在这两个设备之间发送它。当GO1可以停止成为GO并且可以成为GO2的客户时。