我可以使用 Wi-Fi P2P 连接多少台设备?

How many devices can i connect with Wi-Fi P2P?

我需要在客户端-服务器网络中连接 20 多个 android 设备。每个客户端 Android 设备将与服务器 Android 设备通信,反之亦然。客户端设备不需要相互通信。 服务器设备在连接到客户端时需要短暂访问互联网。

我的问题是,Wi-Fi P2P 能否可靠地支持那么多连接?如果是,我该如何实施它们? 还是我必须确保所有设备都在同一个 WLAN 上?

请记住,设备无需连接到网络即可相互连接。 Wi-Fi Direct 允许他们直接连接。

以下是您可能会觉得有用的 Wi-Fi Direct 资源列表:https://groups.google.com/forum/#!topic/wi-fi-direct/uWpuOzHY6y0

我建议按照 Android 的 Service Discovery Demo and try implementing it yourself. And here is the source code 进行演示。

据我所知,没有指定最大数量,因此您需要进行测试才能确定。硬件之间也可能存在差异。

不管怎样,基本的实现还是比较简单的。服务器会调用 GreateGroup,因此在所有情况下它都是 Groupowner。然后开始本地服务广告。然后,客户只需查找广告,一旦他们看到广告,他们就会开始与服务器的连接过程。一种服务器连接是通过 Wifi 直接建立的,您只需启动从客户端到服务器的套接字通信(服务器将始终监听套接字)。

请注意,连接需要用户单击客户端尝试连接到组所有者时显示的对话框。如果你想摆脱这个。然后你就可以实际使用GreateGroup创建的接入点,并将接入点名称和密码添加到广告中。然后您的客户实际上可以使用接入点进行连接(就像连接到任何 Wlan 接入点)

请注意,虽然 Wifi Direct 方式不会干扰 Wifi 连接,但也不需要它。但是接入点方式意味着来自客户端的任何现有 Wifi 连接都将断开,并且设备认为与服务器建立的连接将提供正常的互联网连接。

根据经验,在 Android Wi-Fi Direct 应用程序的实际部署中,20 台设备应该不是问题。

理论上,GO 是 Android 设备的 Wi-Fi P2P 群组中的最大设备数量为 254。群组所有者分配的 IP 为 192.168.49.1。客户端分配的 IP 地址范围为 192.168.49.2 到 192.168.49.254。

群组所有者地址由WifiP2pServiceImpl.java中的以下内容定义:

/* Is chosen as a unique address to avoid conflict with
   the ranges defined in Tethering.java */
private static final String SERVER_ADDRESS = "192.168.49.1";

按如下方式确定客户端范围:

WifiP2pServiceImpl.java 中,startDhcpServer(String intf) 方法将为给定接口启动 DHCP 服务器 - 不足为奇。当组已经启动并且设备是组所有者时调用此方法。

仔细看这段代码,我们可以看到在InterfaceConfiguration对象上,link地址设置为192.168.49.1,前缀长度为24(前缀长度是设置的位数在子网掩码中,这里相当于 255.255.255.0) - 这意味着答案,但我们可以进一步挖掘。

ifcg = mNwService.getInterfaceConfig(intf);
ifcg.setLinkAddress(new LinkAddress(NetworkUtils.numericToInetAddress(
                    SERVER_ADDRESS), 24));
ifcg.setInterfaceUp();
mNwService.setInterfaceConfig(intf, ifcg);

接下来,以下命令将重新启动与 String[]、tetheringDhcpRanges 指定的 DHCP 范围的网络共享。 mNwService(网络管理服务)方法的调用将执行适当的netd命令。

ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
    Context.CONNECTIVITY_SERVICE);
String[] tetheringDhcpRanges = cm.getTetheredDhcpRanges();
if (mNwService.isTetheringStarted()) {
    if (DBG) logd("Stop existing tethering and restart it");
    mNwService.stopTethering();
}
mNwService.tetherInterface(intf);
mNwService.startTethering(tetheringDhcpRanges);

cm.getTetheredDhcpRanges()最终是对下面的引用(ConnectivityManager.getTetheredDhcpRanges() -> ConnectivityService.getTetheredDhcpRanges() -> Tethering.getTetheredDhcpRanges()):

// USB is  192.168.42.1 and 255.255.255.0
// Wifi is 192.168.43.1 and 255.255.255.0
// BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1
// with 255.255.255.0
// P2P is 192.168.49.1 and 255.255.255.0

private String[] mDhcpRange;
private static final String[] DHCP_DEFAULT_RANGE = {
    "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254",
    "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254",
    "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254",
    "192.168.48.2", "192.168.48.254", "192.168.49.2", "192.168.49.254",
}

和:

mDhcpRange = context.getResources().getStringArray(
    com.android.internal.R.array.config_tether_dhcp_range);
if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) {
    mDhcpRange = DHCP_DEFAULT_RANGE;
}

com.android.server.connectivity.Tethering.

当然,设备制造商可以更改此代码,因此也值得考虑。

对于那些计划在有很多用户的地方部署应用程序的人来说,需要一种允许多个设备成为 GO 的机制。如果需要在设备之间同步数据,很简单模拟"churn"并且让GO在成为另一个GO的客户端并同步任何数据之前只作为一个GO一段时间。