【问题标题】:How many devices can i connect with Wi-Fi P2P?我可以使用 Wi-Fi P2P 连接多少台设备?
【发布时间】:2016-08-17 15:44:53
【问题描述】:

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

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

【问题讨论】:

  • 如何在两台安卓设备之间启动wifi p2p?或者在两个安卓设备上的两个应用程序之间?您对 wifi p2p 有什么想法?
  • @greenapps :我希望遵循 android 文档 here 并使用示例代码进行构建。我是网络编程的新手。需要连接设备以在客户端-服务器之间发送指令,根据该指令更新 UI。
  • 我不会关注你的链接。我希望您在此处发布可读可理解的文本。
  • @greenapps :对不起,我刚开始使用堆栈溢出。链接是http://developer.android.com/guide/topics/connectivity/wifip2p.html

标签: android client-server wifi-direct wifip2p


【解决方案1】:

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

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

我建议关注 Android 的 Service Discovery Demo 并尝试自己实现它。这是演示的source code

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      根据经验,在实际部署 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 一段时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2012-04-13
        相关资源
        最近更新 更多