Android WIFI直连 2 设备发现

进入设备发现状态、发现附近的设备

进入发现状态才可以被发现

本机设备进入设备发现状态,查找附近也进入发现状态的远程设备。远程设备必须进入发现状态,才可以被发现。

也就是说,进行通信的两端,必须都进入设备发现状态。

这一点和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>();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值