我需要在客户端 - 服务器网络中连接20多个Android设备。每个客户端Android设备将与服务器Android设备通信,反之亦然。客户端设备不需要彼此通信。 服务器设备在连接到客户端时需要在短时间内访问互联网。
我的问题是,Wi-Fi P2P能否可靠地支持多个连接?如果是的话,我该如何实施呢? 或者我是否必须确保所有设备都在同一个WLAN上?
答案 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。