ESP32蓝牙配网实战:微信小程序端完整开发流程(附代码片段)
最近在折腾一个智能家居的小项目,核心控制器选了ESP32,功能都调通了,但每次换Wi-Fi都得重新刷固件,实在麻烦。于是琢磨着做个蓝牙配网功能,让用户能在手机上点点屏幕就能完成配置。微信小程序无疑是最方便的入口,但真动手才发现,从蓝牙通信到数据协议,每一步都有不少坑。网上资料要么太零散,要么只讲理论,真正能跑通的完整流程少之又少。这篇文章,我就把自己从零搭建ESP32蓝牙配网(基于BluFi协议)微信小程序客户端的整个过程,包括那些关键的代码转换、协议封装和调试技巧,毫无保留地分享出来。如果你也受困于设备联网配置的繁琐,希望这篇实战指南能帮你省下几天摸索的时间。
1. 项目准备与环境搭建
在开始敲代码之前,我们需要把开发环境和小程序的基础框架搭好。这不仅仅是安装软件,更是理解整个通信链路的基础。
开发工具选择:微信开发者工具是必须的,建议使用稳定版。对于ESP32端,我习惯用PlatformIO配合VSCode,它管理依赖和库比Arduino IDE要方便得多。当然,如果你更熟悉Arduino IDE,也完全没问题,核心逻辑是相通的。
关键库与SDK:
- ESP32端:确保你的ESP32 Arduino核心库或ESP-IDF版本支持蓝牙BLE。通常,我们需要使用
BluetoothSerial库进行基础BLE通信,但对于实现完整的BluFi协议,你可能需要参考Espressif官方的blufi示例,它封装了更复杂的握手、加密和数据分段逻辑。 - 小程序端:微信小程序原生提供了
wx.openBluetoothAdapter、wx.createBLEConnection等一系列蓝牙API,功能足够强大,但API调用是异步的,需要妥善处理回调地狱。
提示:在开始编码前,强烈建议先用微信开发者工具的“真机调试”功能,在手机上扫描并连接你的ESP32设备,确认基础蓝牙通信是通的。这能避免后续把时间浪费在环境问题上。
一个常见的项目目录结构可以参考下面这样,这有助于保持代码清晰:
smartconfig-miniprogram/
├── pages/
│ ├── index/ // 主页面,设备扫描与连接
│ │ ├── index.js
│ │ ├── index.json
│ │ ├── index.wxml
│ │ └── index.wxss
│ └── config/ // 配网配置页面
│ ├── config.js
│ ├── config.json
│ ├── config.wxml
│ └── config.wxss
├── utils/
│ ├── blufiProtocol.js // BluFi协议封装核心
│ ├── dataConverter.js // 数据转换工具函数
│ └── bleHelper.js // 蓝牙基础操作封装
└── app.js // 全局状态管理(如保存已连接设备ID)
初始化蓝牙适配器:这是小程序操作蓝牙的第一步,必须在用户授权后调用。代码虽然简单,但错误处理必须做好。
// 在app.js或页面onLoad中初始化
async initBLE() {
try {
const res = await wx.openBluetoothAdapter();
console.log('蓝牙适配器初始化成功', res);
this.listenBLEAdapterState(); // 开始监听适配器状态变化
} catch (err) {
console.error('初始化失败', err);
// 处理错误:如未开启蓝牙、不支持BLE等
if (err.errCode === 10001) {
wx.showModal({
title: '提示',
content: '您的设备不支持蓝牙功能',
});
}
}
}
2. 蓝牙通信基础与数据转换核心
微信小程序的BLE API操作对象主要是ArrayBuffer,而我们需要发送的Wi-Fi密码、SSID等都是字符串。这中间涉及到频繁且容易出错的数据格式转换。网上能找到的转换函数很多,但经过实测,下面这组是最稳定可靠的。
必备的四种数据转换函数:我把它们集中放在utils/dataConverter.js里,方便全局调用。
// 1. ArrayBuffer 转 16进制字符串 (用于调试输出)
function ab2hex(buffer) {
if (!buffer) return '';
const hexArr = Array.from(new Uint8Array(buffer))
.map(bit => bit.toString(16).padStart(2, '0'));
return hexArr.join('');
}
// 2. ArrayBuffer 转 普通字符串 (UTF-8)
function ab2str(buf) {
return String.fromCharCode.apply(null,
4907


&spm=1001.2101.3001.11974&articleId=151922232&d=1&t=3&u=a5cd124e44b14757ab0427d8d4c49017)

被折叠的 条评论
为什么被折叠?



