Wi-Fi P2P可以连接多少个设备?

7
我需要在客户端-服务器网络中连接20多个Android设备。每个客户端Android设备将与服务器Android设备进行通信,反之亦然。客户端设备不需要彼此通信。 当连接到客户端时,服务器设备需要短暂访问互联网。
我的问题是,Wi-Fi P2P能否可靠地支持那么多连接?如果可以,我该如何实现它们? 或者,我是否必须确保所有设备都在同一个WLAN上?

你如何在两个安卓设备之间或者在两个安卓设备上的两个应用程序之间启动wifi p2p连接?你对wifi p2p有什么想法? - greenapps
@greenapps: 我希望能够按照Android文档这里的指引,使用示例代码进行开发。我对网络编程还不熟悉。设备需要连接以便在客户端和服务器之间传递指令,根据指令更新用户界面。 - Love2Code
我不会跟随你的链接。我期望你在这里发布一个可读且易懂的文本。 - greenapps
@greenapps:抱歉,我是第一次使用Stack Overflow。链接是http://developer.android.com/guide/topics/connectivity/wifip2p.html。 - Love2Code
3个回答

10

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

理论上,在Wi-Fi P2P组中,GO是一个Android设备时,设备的最大数量为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
据我所知,最大数量未指定,因此您需要测试以确定。此外,硬件之间可能存在差异。
无论如何,基本实现方法相当简单。服务器将调用GreateGroup,因此在所有情况下都将是Groupowner。然后启动本地服务广告。然后客户端只需寻找广告,一旦看到它,他们就会开始连接过程到服务器。一旦通过Wifi直接连接到服务器,您只需从客户端到服务器启动套接字通信(服务器始终具有侦听套接字)。
请注意,连接需要用户单击对话框,当客户端尝试连接到群组所有者时显示。如果要摆脱这种情况。那么你实际上可以使用GreateGroup创建的Accesspoint,并将访问点名称以及密码添加到广告中。然后,您的客户端实际上可以使用访问点连接(例如任何Wlan访问点)
请注意,Wifi直接方式不会干扰Wifi连接,也不需要它。但是,访问点方式意味着来自客户端的任何现有Wifi连接都将断开,并且设备认为与服务器建立的连接将提供正常的互联网连接。

0

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