2016-04-24 118 views
3

我需要连接客户端 - 服务器网络中的20多个android设备。每个客户端Android设备将与服务器Android设备进行通信,反之亦然。客户端设备不需要相互通信。 服务器设备在连接到客户端时需要短暂的时间访问互联网。我可以使用Wi-Fi P2P连接多少台设备?

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

+0

你将如何启动两个Android设备之间的WiFi p2p?或两个Android设备上的两个应用程序之间?你对WiFi p2p有什么想法? – greenapps

+0

@greenapps:我希望能够遵循android文档[这里](http://developer.android.com/guide/topics/connectivity/wifip2p.html)并使用示例代码进行构建。我是网络编程的新手。需要连接这些设备才能在用户界面将要更新的客户端 - 服务器之间发送指令。 – Ritz

+0

我不会跟随你的链接。我希望你在这里发表可读的可理解文本。 – greenapps

回答

1

根据经验,在实际部署的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定义:

WifiP2pServiceImpl.java,该startDhcpServer(String intf)方法将启动DHCP服务器为:

/* 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"; 

确定对于客户端的范围被如下进行一个给定的界面 - 并不意外。当组启动并且设备是组所有者时调用此方法。

仔细看看这段代码,我们可以看到在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); 

接着,下面的命令将重新启动与由所述字符串[],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; 
} 

in com.android.server.connectivity.Tethering

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

对于那些计划部署应用程序的地方会有很多用户,需要一种允许多个设备进行GO的机制。如果数据需要在设备之间进行同步,则模拟“流失”很容易,并且在GO成为另一个GO的客户端并同步任何数据之前,GO只能成为GO一段时间。

1

据我所知,没有指定最大数量,所以你需要测试一下。硬件之间也可能存在差异。

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

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

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

相关问题