为什么发现Android Wi-Fi Direct的同行如此不可靠?

时间:2014-12-15 02:09:51

标签: android wifi-direct wifip2p

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

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

  • 我有一个Roku设备和手机B坐在手机A旁边。虽然所有设备都连接到我的Wi-Fi,但Roku只出现~10%的时间,而手机A和B相互显示

  • 当我从所有Wi-Fi断开两部手机并进行另一次扫描时,Roku出现了(!!!)但手机B没有出现至少十次。

    < / LI>

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

我能够解决&#34;每隔10秒通过请求对等体发现一些手机无法出现的问题。我想我遇到了这个问题,因为一部电话总是主持人而且我没有费心去发现同伴(因为它没有试图加入他们),Wifi Direct也会睡觉主机电话。我不会对同行结果做任何事情,但它唤醒了Wifi Direct系统。这可能是一种更好的方法,但我不确定它是什么。如果我不得不猜测我说我浪费了一些电池寿命。

答案 2 :(得分:2)

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

...
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) {
            }
        });

答案 3 :(得分:0)

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

  • 第一台设备打开对等发现
  • 第二台设备打开对等设备发现
  • 一台设备尝试与第二台设备建立连接
  • 有时可以,有时不起作用(我会说50/50)

我想问题出在小组所有者谈判(我也尝试过更改groupOwnerIntent参数,以强制谁应该成为小组所有者,但这没有帮助)。

>

那我怎么办?

我将流更改为:

  • 一个设备创建了一个群组(mManager.createGroup(...)),因此该设备始终是群组所有者
  • 第二台设备与组所有者连接
  • whooala,现在很少会停留在invited状态。