Wi-Fi P2P。通知所有可用的同事

时间:2015-04-19 19:17:31

标签: android wifi-direct wifip2p

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

2 个答案:

答案 0 :(得分:10)

首先,您需要记住,如果您决定在项目中使用WiFiP2P,则需要在困难时期做好准备。不幸的是(正如你已经注意到的那样:))WiFiP2P Android的官方文档并不是很好。不同的设备以不同的方式运行(例如,它们以不同的顺序调用某些WifiP2P个事件),而文档根本不会覆盖它。实现稳定的联系需要引入非常规的,有时甚至是激烈的措施。获取WifiP2P连接与显示系统窗口(询问您是否确实要连接到设备)密不可分。

在开始实施WifiP2P解决方案之前,您需要考虑几件事情:

  1. 您的游戏玩家是否可以同时连接多个房间?
  2. 您的游戏玩家是否能够在连接到另一个游戏时检测到新房间?
  3. 您的游戏玩家是否能够以“人类可读”的名称命名他们的房间?其他用户(不是房间的创建者)会使用这些名称来选择他们想要连接的房间吗?
  4. 情景A:

    如果您对问题1或2的回答为“是”,则您真的需要考虑是否确实要使用WifiP2PWifiP2P(Android的Wifi-Direct实施)并不真正符合您的需求。 使用WifiP2P可能意味着会议室所有者创建WifiP2P-group,任何想要加入会议室的人都必须连接到此WifiP2p-group。 问题是Android不允许单个设备同时加入多个组(这也意味着它不允许同时创建多个组)。检测可用WiFiP2P设备周围的更改也存在问题(当您已连接到设备时)。

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

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

    情景B:

    如果对问题3回答“是”,并且您确实需要使用WifiP2P,则需要找到一些方法将“人类可读”名称广播到其他设备。

    您可能认为这非常简单:您连接到其他设备,告诉您已创建的房间的名称,并且您已完成。不那么简单。正如我之前所说:

      

    获取WifiP2P连接与显示系统窗口(询问您是否确实要连接到设备)密不可分?

    所以整个过程会更多:

    1. 设备A:启动连接到设备B(此步骤也可由设备B执行

    2. 设备B:出现丑陋的系统窗口,询问您是否要连接到Android-ao12ij219sa(某些程序化不可更改系统设备名称)

    3. 设备B:接受

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

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

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

    7. 设备B:获取设备A的房间名称,断开连接(未来的连接请求也会显示系统窗口)

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

      可以做些什么:

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

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

答案 1 :(得分:2)

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

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

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

然后与客户一起,只需进行服务发现,一旦找到“房间”,只需连接到它。

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