进入设备发现状态、发现附近的设备
进入发现状态才可以被发现
本机设备进入设备发现状态,查找附近也进入发现状态的远程设备。远程设备必须进入发现状态,才可以被发现。
也就是说,进行通信的两端,必须都进入设备发现状态。
这一点和BLE是不同的,对于通信的两端(两个设备),BLE只需要一端去扫描,而另一端需要进入被扫描的状态。
发现是连接的前提,设备必须被发现,才可以进行连接。
调用discoverPeers方法发现附近的设备
这个方法的调用是异步的。同时如果你创建了一个WifiP2pManager.ActionListener监听器的话,你会通过onSuccess()或者onFailure()方法收到发现成功或失败的消息。
onSuccess()方法只能通知你发现的过程是否成功,而不能提供任何关于发现设备的信息:
// 发现附近的设备
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// 发现设备成功
}
@Override
public void onFailure(int reason) {
// 发现设备失败
}
});
discoverPeers方法
Initiate peer discovery. A discovery process involves scanning for available Wi-Fi peers for the purpose of establishing a connection. 开始设备发现。一个发现过程,涉及到扫描可以用来建立连接的的WIFI设备。
channel – is the channel created at initialize
listener – for callbacks on success or failure. Can be null.
public void discoverPeers(Channel channel, ActionListener listener)
监听设备发现开始或结束
WIFI_P2P_DISCOVERY_CHANGED_ACTION
对于一般的Peer Discovery而言,如果搜索结束,会收到广播WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION。
设备发现开始,会收到这个广播。
设备发现结束,也会收到这个广播。
Broadcast intent action indicating that peer discovery has either started or stopped.
Note that discovery will be stopped during a connection setup. If the application tries to re-initiate discovery during this time, it can fail.
public static final String WIFI_P2P_DISCOVERY_CHANGED_ACTION =
"android.net.wifi.p2p.DISCOVERY_STATE_CHANGE";
得到设备发现状态
One extra EXTRA_DISCOVERY_STATE indicates whether discovery has started or stopped.
这个属性表示设备发现已经开始了,还是已经结束了。
EXTRA_DISCOVERY_STATE:
The lookup key for an int that indicates whether p2p discovery has started or stopped. Retrieve it with android. content. Intent. getIntExtra(String, int).
See Also:
WIFI_P2P_DISCOVERY_STARTED, WIFI_P2P_DISCOVERY_STOPPED
public static final String EXTRA_DISCOVERY_STATE = "discoveryState";
监听这个广播:保持设备发现状态
我们已知connect成功的前提条件是:进行配对的两台设备都必须能够扫描到对方。那么如何保证本机一直处于搜索状态呢?
方法1:三分钟搜索一次
答:经过测试得知,一般情况下,本机Scan一次,能够保持在线状态3分钟,即能够搜索到其他设备/被其他设备搜索到的时间一般是3分钟。
但是这个3分钟不是非常准确的,这跟手机性能或者WIFI芯片都有很大关系。因此我们能做的方案就是如果搜索结束,就重启一次搜索。
方法2:监听搜索结束,再搜索一次
Peer Discovery搜索结束,会收到广播WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION。
在收到广播后,重新搜索(discoverPeers),就可以保持设备处于设备发现的状态。
远程p2p设备列表发生了变化(设备发现成功)
WIFI_P2P_PEERS_CHANGED_ACTION
指示可用的远程p2p设备列表发生了变化的广播。
这个广播在远程p2p设备们被发现、丢失、更新的时候会收到。
Broadcast intent action indicating that the available peer list has changed.
This can be sent as a result of peers being found, lost or updated.
public static final String WIFI_P2P_PEERS_CHANGED_ACTION =
"android.net.wifi.p2p.PEERS_CHANGED";
收到这个广播需要的权限
All of these permissions are required to receive this broadcast: android. Manifest. permission. ACCESS_WIFI_STATE and either android. Manifest. permission. ACCESS_FINE_LOCATION or android. Manifest. permission. NEARBY_WIFI_DEVICES
包含p2p设备列表的extra数据
An extra EXTRA_P2P_DEVICE_LIST provides the full list of current peers. 额外数据EXTRA_P2P_DEVICE_LIST提供了当前远程p2p设备的完整列表。
The full list of peers can also be obtained any time with requestPeers. 也可以在任何时候,调用requestPeers方法来得到远程p2p设备列表。
监听这个广播
如果发现过程成功且检测到了对等设备,系统将会广播出一个WIFI_P2P_PEERS_CHANGED_ACTION Intent。
这样你就可以利用BroadcastReceiver监听,然后去请求发现的设备列表。
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION -> {
Log.i(TAG, "onReceive() WIFI_P2P_PEERS_CHANGED_ACTION")
...
}
获取处于发现状态的远程设备列表——requestPeers
接收到WIFI_P2P_PEERS_CHANGED_ACTION Intent时,可以调用requestPeers()方法,获取发现设备的列表。
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION -> {
Log.i(TAG, "onReceive() WIFI_P2P_PEERS_CHANGED_ACTION")
mWifiP2pManager?.requestPeers(mWifiP2pChannel, object : PeerListListener {
override fun onPeersAvailable(peers: WifiP2pDeviceList?) {
Log.i(TAG, "onPeersAvailable() peers: $peers")
}
})
}
requestPeers方法
Request the current list of peers.
public void requestPeers(Channel channel, PeerListListener listener)
WifiP2pDeviceList——P2P设备列表
A class representing a Wi-Fi P2p device list.
Note that the operations are not thread safe.
public class WifiP2pDeviceList implements Parcelable
WifiP2pDeviceList.mDevices
private final HashMap<String, WifiP2pDevice> mDevices = new HashMap<String, WifiP2pDevice>();