无线 P2P。将某些事件通知所有可用的对等点

Wi-fi P2P. Inform all peers available of some event

问题:我正在制作一款离线多人游戏 android,人们可以在其中创建或加入房间并通过 Wi-Fi 一起玩。考虑这样一种情况,当一个用户创建了一个房间并且他(当然)必须通知所有其他用户有一个可用的房间。所以问题是"How?"。我读了大约1000次thisthis。 那里写着,为了将一些数据发送到另一台设备,其中一个应该是服务器,另一个应该是客户端。客户端向服务器发送一些信息,服务器接受它。那么,这是否意味着我必须让所有 "players" 服务器和 "room creator" 应该成为客户端?这听起来很疯狂。请帮忙,可能是我读错了文档?

基本上,在我看来,您的设计具有非常简单的 Wifi Direct 设计解决方案。

基本上在创建其他人可以加入的 "a room" 时,只需创建一个组,然后添加本地服务来宣传房间。

请注意,您可能需要启动对等发现,以便您的本地服务可见,至少我的经验是,您确实需要以某种方式处于活动状态,否则您将无法被发现。

然后对于客户端,只需进行服务发现,一旦找到 "room",只需连接到它即可。

然后当客户端发起连接时,接受对话框应该显示在组所有者端。

首先你需要记住,如果你决定在你的项目中使用 WiFiP2P,你需要为一些困难时期做好准备。不幸的是(您可能已经注意到了:))WiFiP2P Android 的官方文档不是很好。不同的设备以不同的方式运行(例如,它们以不同的顺序调用一些 WifiP2P 事件)并且文档根本​​没有涵盖它。实现稳定的连接需要采取非常规的、有时甚至是激烈的措施。获得 WifiP2P 连接与显示系统 window 密不可分(询问您是否真的要连接到设备)。

在开始实施 WifiP2P 解决方案之前,您需要考虑的事项很少:

  1. 您的游戏玩家可以同时连接到多个房间吗?
  2. 您游戏的玩家在连接到另一个房间时能否检测到新房间?
  3. 您游戏的玩家可以用 "human-readable" 名称来命名他们的房间吗?其他用户(不是房间的创建者)会使用这些名称来选择他们想要连接的房间吗?

场景 A:

如果您对问题 1. 或 2. 的回答是 "Yes",那么您真的需要考虑是否真的要使用 WifiP2PWifiP2P(Android 对 Wifi-Direct 的实现)并不能真正满足您的需求。 使用 WifiP2P 可能意味着房间所有者创建了一个 WifiP2P-group,任何想要加入房间的人都必须连接到这个 WifiP2p-group。 问题是Android不允许单个设备同时加入多个群组(这也意味着它不允许同时创建多个群组) .检测周围可用 WiFiP2P 设备的变化也存在问题(当您已经连接到设备时)。

如果您真的想使用 Wifi-Direct,您可能需要使用一个 WiFiP2P-group 并将所有设备连接到它。这个组就像一个常规网络一样,所有与游戏室相关的东西都必须由一个节点作为典型服务器(或者可能不是典型服务器,而是一些其他网络解决方案)来管理。

如果您真的不需要 WifiP2P,请使用常规的 Wifi。将所有设备连接到一个网络(甚至可以在您的一台设备上启动热点),整个连接过程可以相对简单,在后台执行,无需用户直接参与。人类可读的房间名称不是问题,因为您可以从您的服务器发送任何内容。

场景 B:

如果您对问题 3 的回答是 "Yes",并且您确实需要使用 WifiP2P,您将需要找到某种方式将您的 "human-readable" 名称广播到其他设备。

您可能认为这非常简单:您连接到其他设备,说出您创建的房间的名称,然后就完成了。没那么简单。正如我之前所说:

obtaining a WifiP2P connection is inseperably linked with displaying a system window (asking if you really want to connect to a device)

所以整个过程会比较少:

  1. Device A:开始连接Device B(此步骤也可以由Device B执行

  2. 设备 B: 丑陋的系统 window 出现询问您是否要连接到 Android-ao12ij219sa(某些 PROGRAMMATICALLY UNCHANGEABLE 系统设备名称)

  3. 设备 B: 接受

  4. 设备B:等待连接结果

  5. 设备B:已连接,等待设备A的房间名称信息

  6. 设备A:已连接,发送房间名称

  7. Device B:获取到Device A的房间名,正在断开(以后的连接请求也会导致显示系统window)

在执行步骤 1-7 时,没有其他设备可以连接到设备 A(因此在此期间没有其他设备可以获取房间名称)。

可以做什么:

  1. 使用WifiP2P Service Discovery。它允许在不需要获得连接的情况下广播一些信息。不幸的是,它的记录甚至比 WifiP2P 本身更糟糕,而且它可能更不可靠(主观上)。如果您想基于此制定可靠的解决方案,您将需要花费数小时的时间进行测试并找出可能无法正常工作的不同情况。我从经验中知道这是可能的,但需要您实施一些解决方法,以便它始终可以获得稳定的 WiFiP2P 连接。

  2. 以其他方式向您的设备发送那些(不可更改的)WifiP2P 名称和创建的房间名称之间的映射。例如通过你的服务器 api 或其他东西...