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

时间:2016-04-24 07:30:36

标签: android client-server wifi-direct wifip2p

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

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

3 个答案:

答案 0 :(得分:5)

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

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

组所有者地址由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对象上,链接地址设置为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的机制。如果需要在设备之间同步数据,则很容易模拟“流失”,并且在成为另一个GO的客户端并同步任何数据之前,GO仅在一段时间内成为GO。

答案 1 :(得分:1)

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

无论如何,基本的实现会相当简单。服务器将调用GreateGroup,因此在所有情况下都是Groupowner。然后开始本地服务广告。客户端然后只需查找广告,一旦他们看到广告,他们就会启动到服务器的连接过程。一个服务器连接通过Wifi直接进行,您只需启动从客户端到服务器的套接字通信(服务器将始终监听套接字)。

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

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

答案 2 :(得分:0)

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

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

我建议关注Android' Service Discovery Demo并尝试自己实施。以下是演示的source code