在Arduino IDE中使用Preferences.h和BleKeyboard.h库实现ESP32 中BLE功能 初次连接手机端的MAC地址并保存
时间: 2025-07-12 22:44:50 浏览: 15
<think>好的,我现在需要帮助用户解决在Arduino IDE中使用Preferences.h和BleKeyboard.h库实现ESP32的BLE功能,并在首次连接时获取并保存手机MAC地址的问题。首先,我得理清楚用户的需求。用户提到的两个库,Preferences.h是用于持久化存储的,而BleKeyboard.h则是处理BLE键盘功能的库。用户希望当手机首次通过BLE连接ESP32时,能够获取手机的MAC地址并保存下来,以便后续使用。
首先,我需要确认这两个库的基本用法。Preferences库是ESP32的非易失性存储(NVS)的封装,可以用来保存键值对数据。BleKeyboard库则模拟蓝牙键盘设备,允许ESP32通过BLE发送按键指令到连接的设备,比如手机或电脑。
接下来,用户的需求是在首次连接时获取并存储MAC地址。这里的关键点是如何检测到首次连接,并触发获取MAC地址的操作。BLE设备的连接过程中,当设备连接时,BLE库通常会触发一个回调函数。因此,我需要查看BleKeyboard库是否有相关的回调函数或事件处理机制,用于检测连接事件。
查阅BleKeyboard库的文档或示例代码,通常会有onConnect和onDisconnect这样的回调函数。当设备连接时,onConnect会被调用,这时候可以在这个回调函数中获取对端设备(即手机)的MAC地址。获取到MAC地址后,使用Preferences库将其保存到NVS中。同时,需要判断是否是首次连接,也就是检查NVS中是否已经存在存储的MAC地址。如果不存在,则存储;如果已经存在,则跳过。
然后,代码结构的大致流程可能是这样的:初始化Preferences库,读取之前保存的MAC地址。如果不存在,则初始化BLE并等待连接。当有设备连接时,触发onConnect回调,从中获取MAC地址,并保存到Preferences中。之后,每次启动时都先检查是否已有MAC地址,避免重复获取。
需要考虑的几个问题:如何正确获取对端设备的MAC地址?在BLE协议中,连接的双方都可以获取对方的地址。BleKeyboard库可能提供了获取对端地址的方法,比如通过回调函数的参数或者某个成员变量。另外,保存到Preferences的数据类型,MAC地址通常是字符串形式,比如"AA:BB:CC:DD:EE:FF",所以需要用putString方法存储。
可能的错误点:在连接事件中未能正确获取MAC地址,或者保存的时机不对。需要确保在连接成功后才触发保存操作,并且只保存一次。此外,ESP32的NVS有分区大小的限制,需要确保存储的数据不会超出限制,但MAC地址字符串长度固定,应该不会有问题。
还需要考虑用户是否已经正确安装了ESP32的开发板支持包和所需的库。用户提到参考了安装ESP32包的步骤,所以假设开发环境已经配置好。但可能需要提醒用户检查库的版本兼容性,特别是BleKeyboard库是否支持ESP32C3芯片,因为有些库可能针对特定芯片优化或存在已知问题。
最后,编写示例代码的大纲:包含必要的头文件,定义BLE设备名称,初始化Preferences,设置BLE回调函数,处理连接事件,保存MAC地址,并在主循环中处理BLE事件。需要测试代码是否能正确编译和上传到ESP32C3,并在实际连接手机时触发保存操作。
可能的测试步骤:上传代码后,打开手机蓝牙,搜索并连接ESP32的BLE设备。首次连接时,代码应保存MAC地址到NVS,之后重启ESP32时,应不再重复保存。可以通过串口输出查看保存的MAC地址是否正确,或者通过读取Preferences中的数据来验证。
总结,解决方案的关键步骤是:利用BLE连接事件的回调获取MAC地址,使用Preferences库持久化存储,并在初始化时检查是否已存在存储的值以避免重复保存。</think>### 实现步骤与代码示例
#### 1. 环境配置
- 确保已安装 ESP32 开发板支持包(参考[^1])
- 安装 `BleKeyboard` 库:Arduino IDE 菜单栏 → 工具 → 管理库 → 搜索安装
#### 2. 核心代码实现
```cpp
#include <BleKeyboard.h>
#include <Preferences.h>
BleKeyboard bleKeyboard("ESP32-BLE-KEYBOARD"); // BLE设备名称
Preferences preferences; // 非易失存储对象
String storedMac = ""; // 存储的MAC地址
// BLE连接状态回调
void onConnect() {
if (storedMac.isEmpty()) { // 首次连接时保存MAC
String peerMac = bleKeyboard.getPeerMac().c_str();
preferences.putString("mac", peerMac);
Serial.println("保存MAC地址: " + peerMac);
}
}
void setup() {
Serial.begin(115200);
preferences.begin("ble-config", false); // 打开命名空间
storedMac = preferences.getString("mac", ""); // 读取已存地址
if (storedMac.isEmpty()) {
Serial.println("等待首次连接...");
bleKeyboard.onConnect(onConnect); // 注册连接回调
bleKeyboard.begin();
} else {
Serial.println("已注册MAC: " + storedMac);
}
}
void loop() {
// BLE事件处理
if (storedMac.isEmpty()) {
delay(1000);
}
}
```
#### 3. 关键点说明
1. **MAC地址获取**:通过 `bleKeyboard.getPeerMac()` 获取连接设备的 MAC 地址
2. **持久化存储**:使用 `Preferences` 库的 `putString()` 方法保存字符串数据到 NVS
3. **首次连接判断**:通过检查 `storedMac` 是否为空判断是否首次连接
4. **回调机制**:`onConnect` 事件在 BLE 连接成功时自动触发
#### 4. 使用建议
- 烧录代码后打开串口监视器(波特率 115200)观察输出
- 首次连接后重启设备,验证是否跳过保存步骤
- MAC地址格式为 `XX:XX:XX:XX:XX:XX`,可通过手机蓝牙设置查看验证
阅读全文
相关推荐




















