6

我正在尝试使用 Android 的 Wi-Fi Direct(或 P2P,如果您愿意)。我认为它在我的两部手机之间运行得非常好,但我意识到我遇到了WifiP2pManager.discoverPeers()and/or的问题WifiP2pManager.requestPeers()。我观察到了这些结果:

  • 1 分钟内没有发现任何对等点,也没有触发任何回调。我也通过 Android Wi-Fi 设置的 Wi-Fi Direct 部分观察到这一点。这很奇怪,因为有时发现几乎立即完成。

  • 我有一个 Roku 设备和电话 B 坐在电话 A 旁边。虽然所有设备都连接到我的 Wi-Fi,但 Roku 仅出现约 10% 的时间,而电话 A 和 B 彼此出现。

  • 当我断开两部手机与所有 Wi-Fi 的连接并进行另一次扫描时,Roku 出现了(!!!)但手机 B 直到我至少刷新了十次才出现。

我的两部手机是 Nexus 7(运行 4.4.4)和 Nexus 5(运行 5.0)。

4

4 回答 4

7

我最近一直在开发一个基于 WiFi Direct(带有 WiFi P2P 服务发现)的连接系统的应用程序,而我可以肯定地说的一件事是整个事情是一个巨大的痛苦......。主要是因为缺乏文档,还因为在开发基于 wifi-direct 的解决方案时,在进行任何方法调用之前,您需要注意基本上所有的事情(尤其是来自侦听器的所有回调)。

我猜有两件最烦人的事情:

于 2014-12-15T02:55:47.740 回答
5

根据我的经验,它是可靠的。经过大量尝试,我得到了如下强大的可行流程:

...
wifiP2pManager.clearLocalServices(wifiP2pChannel, new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                HashMap<String, String> record = new HashMap<>();
                record.put("name", "Amos");
                WifiP2pDnsSdServiceInfo serviceInfo = WifiP2pDnsSdServiceInfo.newInstance(AppConfig.DNS_SD_SERVICE_NAME, AppConfig.DNS_SD_SERVICE_TYPE, record);
                wifiP2pManager.addLocalService(wifiP2pChannel, serviceInfo, new WifiP2pManager.ActionListener() {
                    @Override
                    public void onSuccess() {
                        wifiP2pManager.setDnsSdResponseListeners(wifiP2pChannel, WifiDirectFragment.this, WifiDirectFragment.this);
                        wifiP2pManager.clearServiceRequests(wifiP2pChannel, new WifiP2pManager.ActionListener() {
                            @Override
                            public void onSuccess() {
                                wifiP2pManager.addServiceRequest(wifiP2pChannel, WifiP2pDnsSdServiceRequest.newInstance(), new WifiP2pManager.ActionListener() {
                                    @Override
                                    public void onSuccess() {
                                        wifiP2pManager.discoverPeers(wifiP2pChannel, new WifiP2pManager.ActionListener() {
                                            @Override
                                            public void onSuccess() {
                                                wifiP2pManager.discoverServices(wifiP2pChannel, new WifiP2pManager.ActionListener() {
                                                    @Override
                                                    public void onSuccess() {
                                                        // this is my recursive discovery approach                                                            
                                                        handler.postDelayed(discoveryRunnable, AppConfig.DNS_SD_SERVICE_DISCOVERABLE_DURATION_S * 1000);
                                                    }

                                                    @Override
                                                    public void onFailure(int code) {
                                                    }
                                                });
                                            }

                                            @Override
                                            public void onFailure(int code) {
                                            }
                                        });
                                    }

                                    @Override
                                    public void onFailure(int code) {
                                    }
                                });
                            }

                            @Override
                            public void onFailure(int code) {
                            }
                        });
                    }

                    @Override
                    public void onFailure(int code) {
                    }
                });
            }

            @Override
            public void onFailure(int code) {
            }
        });
于 2016-11-04T02:25:00.250 回答
4

我能够通过每 10 秒请求一次对等发现来“解决”某些手机没有出现的问题。我想我遇到了这个问题,因为一部手机始终是主机,我没有费心让它发现对等方(因为它不会尝试加入它们),并且 Wifi Direct 将在主机手机上休眠。我不对对等结果做任何事情,但它会唤醒 Wifi Direct 系统。可能有更好的调用方法,但我不确定它是什么。如果我不得不猜测我会说我在浪费一些电池寿命。

于 2014-12-16T06:07:33.523 回答
1

在设备之间建立连接时我遇到了一个非常大的问题:

  • 第一个设备打开对等发现
  • 第二台设备打开对等发现
  • 一台设备尝试与第二台设备建立连接
  • 有时有效,有时无效(我会说 50/50)

我想问题是组所有者协商(我也尝试更改groupOwnerIntent参数以强制谁应该成为组所有者,但它没有帮助)。

那么,我做了什么?

我将流程更改为:

  • 一台设备创建群组 ( mManager.createGroup(...)),因此该设备始终是群组所有者
  • 第二台设备与群组所有者连接
  • whooala,现在很少会卡在invited状态上。
于 2019-07-10T09:41:17.977 回答