uni-app Wi-Fi 感知

发布于 1周前 作者 phonegap100 来自 Uni-App

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() 方法获取当前可用数据路径的数量、发布会话和订阅会话。这有助于应用确定是否有足够的可用资源来执行所需功能。

1 回复

在处理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>

注意事项

  1. 权限处理:在实际应用中,需要处理用户授权问题,特别是在Android 6.0及以上版本中,需要动态申请位置权限。
  2. 结果处理:上述示例中省略了获取Wi-Fi扫描结果的代码,实际开发中需要通过广播接收器来监听扫描结果,并将结果传递给uni-app。
  3. iOS实现:iOS平台与Android平台在实现上有较大差异,需要使用CoreWLAN框架,并处理相应的权限和API调用。

通过上述步骤,你可以在uni-app中实现Wi-Fi感知功能。具体实现细节(如权限申请、结果处理等)需要根据实际需求进行完善。

回到顶部