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).
我最近一直在开发一个基于WiFi Direct(使用WiFi P2P服务发现)的连接系统的应用程序,我可以肯定地说,整个事情是......的巨大痛苦.主要是因为缺乏文档,而且因为在开发基于wifi直接的解决方案时,在进行任何方法调用之前,您需要注意基本上所有内容(特别是对于来自侦听器的所有回调).
我猜两个最烦人的事情是:
一个未记录的UNKNOWN_ERROR(我认为它的int代码是-3)被抛出的方法.这似乎是wifi守护进程本身的某种问题.唯一可以防止它发生的事情就是在你开始搞乱WiFi直接之前重置WiFi.ActionListener onFailure
一些错误的状态你的方法调用是-例如,如果WIFI_P2P_STATE_CHANGED_ACTION尚未收到您的广播接收器与WIFI_P2P_STATE_ENABLED或者"your_device"还没有收到合适status的WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.这通常导致onFailure你ActionListener的一个人打电话(例如ERROR或BUSY失败原因).
我能够通过每 10 秒请求一次对等发现来“解决”某些电话未出现的问题。我想我遇到这个问题是因为一部手机始终是主机,我懒得让它发现对等点(因为它不会尝试加入它们),并且 Wifi Direct 将在主机手机上休眠。我没有对同行结果做任何事情,但它会唤醒 Wifi Direct 系统。可能有更好的方法可以调用,但我不确定它是什么。如果我不得不猜测的话,我会说我浪费了一些电池寿命。
根据我的经验,它是可靠的。经过大量的尝试,我得到了如下强大的可行流程:
...
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)
| 归档时间: |
|
| 查看次数: |
4006 次 |
| 最近记录: |