uni-app Wi-Fi 感知
uni-app Wi-Fi 感知
https://developer.android.com/develop/connectivity/wifi/wifi-aware?hl=zh-cn#kotlin
Wi-Fi 感知
WLAN 感知功能使搭载 Android 8.0(API 级别 26)及更高版本的设备能够发现彼此并直接进行连接,它们之间无需任何其他类型的连接。Wi-Fi 感知也称为“近邻感知网络”(NAN)。
Wi-Fi 感知网络的工作原理是与相邻设备组成集群,或者创建新集群(如果设备是某个区域中的第一个设备)。此聚类行为适用于整个设备,并由 Wi-Fi 感知系统服务管理;应用无法控制聚类行为。应用使用 Wi-Fi 感知 API 与 Wi-Fi 感知系统服务通信,该服务管理设备上的 Wi-Fi 感知硬件。
应用可通过 WLAN 感知 API 执行以下操作:
- 发现其他设备:该 API 具有用于查找其他附近设备的机制。当一台设备发布一项或多项可检测到服务时,该过程就会开始。然后,当设备订阅一项或多项服务并进入发布者的 Wi-Fi 范围时,订阅者会收到通知,告知已发现匹配的发布者。在订阅者发现发布者后,订阅者可以发送短消息或与发现的设备建立网络连接。设备可以既是发布者又是订阅者。
- 创建网络连接:两台设备发现彼此后,可以创建没有接入点的双向 Wi-Fi 感知网络连接。
与蓝牙连接相比,Wi-Fi 感知网络连接在距离更长的距离内支持更高的吞吐率。这些类型的连接对于在用户之间共享大量数据的应用(例如照片共享应用)非常有用。
Android 12(API 级别 31)增强功能
Android 12(API 级别 31)为 Wi-Fi 感知功能添加了一些增强功能:
- 在搭载 Android 12(API 级别 31)或更高版本的设备上,当您的应用因服务停止或超出范围而丢失已发现的服务时,您可以使用
onServiceLost()
回调来收到提醒。 - Wi-Fi 感知数据路径的设置已简化。早期版本使用 L2 消息传递功能提供发起方的 MAC 地址,这会导致延迟。在搭载 Android 12 及更高版本的设备上,可以将响应程序(服务器)配置为接受任何对等方,也就是说,它不需要预先知道发起程序的 MAC 地址。这可加快数据路径的启动速度,并只需一个网络请求即可实现多个点对点链接。
- 在 Android 12 或更高版本上运行的应用可以使用
WifiAwareManager.getAvailableAwareResources()
方法获取当前可用数据路径的数量、发布会话和订阅会话。这有助于应用确定是否有足够的可用资源来执行所需功能。
在处理uni-app中的Wi-Fi感知功能时,我们需要利用设备的Wi-Fi扫描能力来检测周围的Wi-Fi网络。虽然uni-app本身没有直接提供Wi-Fi扫描的API,但我们可以通过调用原生插件或条件编译的方式来实现这一功能。下面是一个基于条件编译和原生插件实现的示例代码框架。
1. 原生插件开发(以Android为例)
首先,我们需要为Android平台开发一个原生插件来扫描Wi-Fi。
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
WifiManagerPlugin.java
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import com.alibaba.fastjson.JSONArray;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;
public class WifiManagerPlugin extends UniModule {
public void scanWifi(UniJSCallback callback) {
WifiManager wifiManager = (WifiManager) getMContext().getSystemService(Context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
wifiManager.startScan();
// 使用Handler或广播接收器来获取扫描结果
// 这里为了简化,省略了具体获取扫描结果的代码
JSONArray result = new JSONArray();
// 填充result数组
callback.invoke(result);
}
}
2. 在uni-app中调用原生插件
pages/index/index.vue
<template>
<view>
<button @click="scanWifi">Scan WiFi</button>
</view>
</template>
<script>
export default {
methods: {
scanWifi() {
#ifdef APP-PLUS
plus.bridge.exec('WifiManagerPlugin', 'scanWifi', [], (res) => {
console.log('WiFi Scan Results:', res);
});
#endif
}
}
}
</script>
<style>
/* 样式省略 */
</style>
注意事项
- 权限处理:在实际应用中,需要处理用户授权问题,特别是在Android 6.0及以上版本中,需要动态申请位置权限。
- 结果处理:上述示例中省略了获取Wi-Fi扫描结果的代码,实际开发中需要通过广播接收器来监听扫描结果,并将结果传递给uni-app。
- iOS实现:iOS平台与Android平台在实现上有较大差异,需要使用CoreWLAN框架,并处理相应的权限和API调用。
通过上述步骤,你可以在uni-app中实现Wi-Fi感知功能。具体实现细节(如权限申请、结果处理等)需要根据实际需求进行完善。