WLAN 直连(对等连接或 P2P)概览 | Connectivity | Android Developers
WLAN 扫描流程
扫描流程分为三步:
-
为 SCAN_RESULTS_AVAILABLE_ACTION 注册一个广播监听器,系统会在完成扫描请求时调用此监听器,提供其成功/失败状态。对于搭载 Android 10(API 级别 29)及更高版本的设备,系统将针对平台或其他应用在设备上执行的所有完整 WLAN 扫描发送此广播。应用可以使用广播被动监听设备上所有扫描的完成情况,无需发出自己的扫描。
-
使用 WifiManager.startScan() 请求扫描。请务必检查方法的返回状态,因为调用可能因以下任一原因失败:
- 由于短时间扫描过多,扫描请求可能遭到节流。
- 设备处于空闲状态,扫描已停用。
- WLAN 硬件报告扫描失败。
-
使用 WifiManager.getScanResults() 获取扫描结果。系统返回的扫描结果为最近更新的结果,但如果当前扫描尚未完成或成功,可能会返回以前扫描的结果。也就是说,如果在收到成功的 SCAN_RESULTS_AVAILABLE_ACTION 广播前调用此方法,您可能会获得较旧的扫描结果。
注意:需要开启定位和wifi的权限
可让具有相应硬件的设备通过 Wi-Fi 直接相互连接,而无需中间接入点。借助这些 API,您可以发现并连接到其他设备(当每台设备支持 Wi-Fi 点对点时),然后通过高速连接进行通信,这些距离远远超过蓝牙连接。这对于在用户之间共享数据的应用非常有用,例如多人游戏或照片共享应用。
WLAN P2P API 包含以下主要部分:
- 可让您发现、请求和连接到对等方的方法,这些方法在 WifiP2pManager 类中定义。
- 可让您收到关于
WifiP2pManager
方法调用成功或失败的通知的监听器。调用WifiP2pManager
方法时,每个方法都可以接收作为参数传入的特定监听器。 - 用于通知您 Wi-Fi 点对点框架检测到的特定事件(例如连接断开或新发现对等设备)的 intent。
您会经常一起使用 API 的这三个主要组件。例如,您可以为对 discoverPeers() 的调用提供 WifiP2pManager.ActionListener,以便 ActionListener.onSuccess() 和 ActionListener.onFailure() 方法可以通知您。如果 discoverPeers()
方法发现对等设备列表已更改,系统也会广播 WIFI_P2P_PEERS_CHANGED_ACTION intent。
发现对等设备
调用 discoverPeers()
以检测范围内且可用于连接的可用对等设备。对此函数的调用是异步进行的,如果您创建了 WifiP2pManager.ActionListener
,系统会使用 onSuccess()
和 onFailure()
将成功或失败传达给应用。onSuccess()
方法只会通知您发现过程已成功,而不会提供它发现的实际对等设备(如果有)的任何信息。以下代码示例展示了如何进行设置
连接到对等设备
获得可能对等设备的列表并选择要连接的设备后,请调用 connect()
方法来连接到该设备。此方法调用需要 WifiP2pConfig 对象,其中包含要连接的设备的相关信息。WifiP2pManager.ActionListener
可以通知您连接成功或失败。以下代码展示了如何创建与设备的连接。
传输数据
建立连接后,您可以使用套接字在设备之间传输数据。数据传输的基本步骤如下:
- 创建 ServerSocket。此套接字会等待来自指定端口上的客户端的连接,并阻塞直至连接发生,因此请在后台线程中执行此操作。
- 创建客户端 Socket。客户端使用服务器套接字的 IP 地址和端口连接到服务器设备。
- 将数据从客户端发送到服务器。当客户端套接字成功连接到服务器套接字后,您可以使用字节流将数据从客户端发送到服务器。
- 服务器套接字等待客户端连接(使用 accept() 方法)。此调用会阻塞,直到客户端连接为止,因此请在另一个线程中调用。发生连接时,服务器设备可以从客户端接收数据。