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

Mar*_*her 5 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没有,直到我刷新至少十次.

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

Bar*_*ski 6

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

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


Mar*_*her 5

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


Amo*_*mos 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) {
            }
        });
Run Code Online (Sandbox Code Playgroud)