我的问题是,Wi-Fi P2P能否可靠地支持那么多连接?如果可以,我该如何实现它们? 或者,我是否必须确保所有设备都在同一个WLAN上?
根据实际经验,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服务器-这并不令人惊讶。当组已经启动且设备是组所有者时调用此方法。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的客户端并同步任何数据。
请记住,设备不需要连接到网络就可以相互连接。Wi-Fi Direct允许它们直接连接。
以下是一些您可能会发现有用的Wi-Fi Direct资源:https://groups.google.com/forum/#!topic/wi-fi-direct/uWpuOzHY6y0
我建议您跟随Android的Service Discovery Demo并尝试自己实现它。这里是演示的源代码。