更新记录
1.0.0(2026-09-13)
- 新增 HarmonyOS 支持:EspTouch V1 / V2(含 AES 加密)、SoftAP、
getCurrentWifi。 - 兼容传统 uni-app(vue2 / vue3,Android / iOS / HarmonyOS)。
- API 变更:
getCurrentWifi改为通过回调返回WifiInfo | null。 - EspTouch V2 默认超时改为 90 秒;显式传入
timeoutMs时以传入值为准。 - 修复 iOS 配网在部分网络环境下持续超时、终态不回调的问题。
- 修复停止配网后旧回调仍可能触发的问题;修复日志开关不生效的问题。
- 日志不再输出 WiFi 密码。
- 示例页改为手动发起配网。
平台兼容性
uni-app(5.24)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | √ | - | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.24)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | √ | √ | √ | - |
hans-esp-provision
为用乐鑫芯片(ESP32 / ESP32-C3 / ESP8266 等)做智能硬件、用 uni-app x 或传统 uni-app(vue2 / vue3)写配套 App 的开发者提供 WiFi 配网能力。
- EspTouch V1(一键配网 / SmartConfig,UDP 包长编码,广播模式)
- EspTouch V2(可选 AES 加密 + 自定义附加数据)
- SoftAP 热点配网(检测设备热点连接 → TCP 下发凭据 → 回包确认)
- 当前 WiFi 信息读取(
getCurrentWifi,供配网表单预填)
平台支持
| 平台 | EspTouch V1 | EspTouch V2 | SoftAP | getCurrentWifi |
|---|---|---|---|---|
| Android 5.0+ | ✔ | ✔ | ✔ | ✔ |
| iOS 14+ | ✔ | ✔ | ✔ | ✔(需 entitlement + 定位权限) |
| HarmonyOS NEXT(API 13+,6.1 真机验证) | ✔ | ✔ | ✔ | ✔ |
| Web / 小程序 | - | - | - | - |
框架支持:uni-app x 与传统 uni-app(vue2 / vue3)均可用 App 平台(Android/iOS/HarmonyOS)。
插件自带全部原生依赖,无需手工配置;鸿蒙端无三方原生依赖。iOS 广播模式 EspTouch 需要开通组播网络能力的 provisioning profile(见下方「安装与配置」),若证书不含组播权限,优先使用 SoftAP。
安装与配置
- HBuilderX 4.61+(HarmonyOS 目标建议 5.24+);插件导入后 Android 权限、iOS Info.plist/entitlements、鸿蒙 module.json5 权限会随云打包/自定义基座自动合并,无需手工拷贝(鸿蒙端权限均为系统授权,无弹窗)。
- 必须打自定义基座(含原生 jar/framework),标准调试基座无法运行本插件。
- iOS 侧需要:
- 定位权限(读 SSID)——插件已声明用途描述;
- 本地网络权限(iOS 14+ 弹窗);
Access WiFi Informationentitlement(插件已声明com.apple.developer.networking.wifi-info,需在证书/profile 中同步勾选);- 广播模式 EspTouch 需要含组播网络权限的 profile。
- Android 侧权限:INTERNET、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE、CHANGE_WIFI_MULTICAST_STATE、ACCESS_FINE_LOCATION、NEARBY_WIFI_DEVICES(12+)。
快速上手(uni-app x)
import { startProvisioning, stopProvisioning, getCurrentWifi } from '@/uni_modules/hans-esp-provision'
import { EspProvisionEvent, EspProvisionOptions, ProvisionMode, WifiInfo } from '@/uni_modules/hans-esp-provision'
// 异步预填当前 WiFi(三端 API 一致)
getCurrentWifi((wifi: WifiInfo | null) => {
if (wifi != null) console.log('当前 WiFi: ' + wifi!.ssid)
})
// options 显式声明类型,mode 字面量用 as 标注(uni-app x 编译器对内联对象字面量
// 和字面量联合的推导不稳,统一用声明式写法,三端编译一致)
const options: EspProvisionOptions = {
mode: 'esptouch_v1' as ProvisionMode,
ssid: 'MyRouter',
password: 'pwd12345',
timeoutMs: 60000
}
startProvisioning(options, (event: EspProvisionEvent) => {
if (event.state == 'success') {
console.log('设备 IP: ' + (event.result?.ip ?? ''))
} else if (event.state == 'fail') {
console.log('失败 ' + event.errCode + ': ' + (event.errMsg ?? ''))
} else {
console.log('进度: ' + event.state) // scanning | provisioning
}
})
// 用户取消
stopProvisioning()
传统 uni-app(vue2 / vue3)用法一致:导入路径相同,页面 JS 里去掉类型标注与 as 断言即可(options 与回调事件是同结构的普通对象;页面用 ts 则可保留标注)。
EspTouch V2(AES 可选):
const options: EspProvisionOptions = {
mode: 'esptouch_v2' as ProvisionMode,
ssid: 'MyRouter',
password: 'pwd12345',
aesKey: '0123456789abcdef',
reservedData: ''
}
startProvisioning(options, (event: EspProvisionEvent) => {
// 同上
})
SoftAP:提示用户连接设备热点后调用;插件按 deviceApPrefix(默认 esp32,contains 忽略大小写)校验当前 SSID,并向 192.168.4.1:8266 下发凭据。
SoftAP 固件契约
设备热点网关 192.168.4.1 TCP 8266:
- App → 设备:一行 JSON
{"ssid":"...","password":"..."}\n - 设备 → App:一行 JSON
{"ok":true,"ip":"192.168.x.x"}\n(ip可选;拒绝时ok:false)
API
| 函数 | 说明 |
|---|---|
startProvisioning(options, callback) |
启动配网;同一时刻仅允许一个会话,重复调用立即 ERR_SESSION_BUSY |
stopProvisioning() |
停止当前会话(fail/9021011 终态回调) |
getCurrentWifi(callback) |
通过 callback 返回一次 WifiInfo \| null;异步读取当前 SSID/BSSID,不可读时回调 null(iOS 超过 5 秒返回 null) |
setLogEnabled(enabled) |
日志开关(原生日志进 HBuilderX 控制台;Android 亦可 adb logcat 过滤 hans-esp-provision) |
EspProvisionOptions:mode('esptouch_v1' | 'esptouch_v2' | 'softap' | 'ble')、ssid、password、bssid?、deviceApPrefix?、deviceApPassword?、timeoutMs?(V2 默认 90000,其它模式默认 60000)、taskCount?(默认 1)、aesKey?(16 字节 UTF-8,仅 v2)、reservedData?(≤64 字节,仅 v2)。
EspProvisionEvent:state('scanning' | 'provisioning' | 'success' | 'fail')+ 终态附带 result(ip/bssid/elapsedMs)或 errCode/errMsg。
错误码
| 码 | 含义 |
|---|---|
| 9021001 | 模式/平台不支持(ble 预留) |
| 9021002 | 参数非法(缺 SSID、BSSID 格式、aesKey 长度等) |
| 9021003 | 定位/本地网络权限被拒 |
| 9021004 | 已有会话在运行 |
| 9021005 | 手机未连接 WiFi |
| 9021006 | 当前 WiFi 为 5G 频段(v1 需 2.4G;Android/鸿蒙可检,iOS 不暴露频段) |
| 9021007 | WiFi 信息不可读 |
| 9021010 / 9021011 | 超时未发现设备 / 用户停止 |
| 9021020 / 9021021 | 未连设备热点 / 设备未确认凭据 |
| 9021099 | 未知错误 |
已知边界与排障
- EspTouch V1/V2 只能配 2.4G 网络;WPA3-only 路由器大概率失败(v1 协议边界),建议路由器开 WPA2 兼容。
- iOS 读不到 SSID:检查定位权限(设置里为"使用期间")、profile 是否含 Access WiFi Information、是否真机(模拟器无 WiFi 信息)。
- V1/V2 超时:确认设备已进入配网模式、手机与设备在同一 2.4G 路由器、路由器未开 AP 隔离。
- 鸿蒙端:App 切后台期间配网定时器被系统挂起,回前台恢复(表现为配网耗时变长);手机重启或刚安装后约 3 分钟内 UDP bind 可能失败(返回 9021099 并附原因,数分钟后自愈)。
- 蓝牙(BLE)辅助配网为 v1.x 规划能力,当前调用返回 9021001。
异步读取与会话取消
getCurrentWifi(callback) 使用回调返回结果,兼容传统 uni-app iOS 真机异步桥接。iOS 侧读取不阻塞主线程;需要允许使用期间定位、开启精确位置,并在签名中包含 Access WiFi Information。
配网会等待 WiFi 查询再启动任务,iOS 的 timeoutMs 包括这段等待时间。WiFi 信息不可读返回 9021007;只有确认当前 SSID 不匹配设备热点时才返回 SoftAP 9021020。stopProvisioning() 会使待返回的查询和旧会话事件失效;终态回调内可以立即启动下一轮。一次调用的进度与终态通过同一个持续回调交付。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 392
赞赏 0
下载 12593197
赞赏 1949
赞赏
京公网安备:11010802035340号