在Arduino IDE中使用Preferences.h和BleKeyboard.h库实现ESP32的BLE功能,并在首次连接时获取并保存手机蓝牙功能MAC地址
时间: 2025-07-12 16:46:55 浏览: 13
<think>嗯,用户的问题是关于在Arduino IDE中使用Preferences.h和BleKeyboard.h库来实现ESP32的BLE功能,并且在设备首次连接时获取并存储手机的蓝牙MAC地址。我需要先理清楚这两个库的作用以及如何协同工作。
首先,BleKeyboard.h库是用来模拟蓝牙键盘的,让ESP32可以作为BLE键盘设备被手机或电脑连接。而Preferences.h库则是用于非易失性存储(NVS),可以保存数据在ESP32的闪存中,即使断电也不会丢失。用户的需求是在首次连接时获取手机的MAC地址,并存储下来,之后可能不需要重复存储。
接下来,我需要考虑如何检测首次连接。可能需要设置一个标志位,保存在Preferences中,用来判断是否是第一次连接。当设备连接时,BLE库应该会触发一个回调函数,比如onConnect,这时候可以在这个回调里获取对端的MAC地址,也就是手机的地址。
然后,在onConnect回调中,使用BLEAddress类的toString方法将MAC地址转换为字符串格式。获取到之后,检查Preferences中的标志位,如果是第一次,就将MAC地址存储,并将标志位置为已存储。需要注意的是,MAC地址的获取可能需要权限,特别是在手机上,但作为BLE外围设备,ESP32作为服务端,应该可以获取到中央设备(手机)的MAC地址。
另外,代码结构方面,需要在setup函数中初始化BLE设备,设置设备名称和服务,并启动广播。同时,初始化Preferences,读取之前保存的标志位和MAC地址。在loop函数中保持蓝牙运行即可。
可能遇到的问题包括:如何正确触发onConnect事件,确保MAC地址获取的时机正确;Preferences的读写是否正确,特别是数据类型和命名空间的处理;还有ESP32的NVS使用是否有大小限制,需要确保数据正确写入。
还需要考虑错误处理,比如如果获取MAC地址失败,或者存储过程中出现错误,应该怎么处理。可能需要在代码中加入一些调试输出,方便用户排查问题。
最后,生成相关问题时,要考虑用户可能遇到的后续问题,比如如何验证MAC地址是否存储成功,如何清除存储的数据,或者如何优化BLE连接的性能等。</think>根据你的需求,这里提供分步骤解决方案:
一、环境准备
1. 安装ESP32开发板支持包
- 在Arduino IDE中添加https://dl.espressif.com/dl/package_esp32_index.json到附加开发板管理器
- 工具 > 开发板 > 开发板管理器 搜索安装esp32包[^1]
二、核心代码实现
```cpp
#include <BleKeyboard.h>
#include <Preferences.h>
BleKeyboard bleKeyboard("MyBLEKeyboard");
Preferences preferences;
bool isFirstConnection = true;
void setup() {
Serial.begin(115200);
// 初始化BLE键盘
bleKeyboard.begin();
// 初始化NVS存储
preferences.begin("ble-config", false);
// 检查是否已有存储记录
if(preferences.getString("macAddr", "").length() > 0){
isFirstConnection = false;
Serial.print("已存储MAC地址:");
Serial.println(preferences.getString("macAddr", ""));
}
}
void loop() {
if(bleKeyboard.isConnected()){
if(isFirstConnection){
// 获取对端MAC地址
std::string peerMac = bleKeyboard.getPeerMac().toString();
// 存储到NVS
preferences.putString("macAddr", peerMac.c_str());
Serial.print("首次连接MAC地址:");
Serial.println(peerMac.c_str());
isFirstConnection = false;
}
}
delay(1000);
}
```
三、关键实现原理
1. BLE连接检测:
- 通过`bleKeyboard.isConnected()`判断连接状态
- 使用`getPeerMac()`获取对端MAC地址[^2]
2. 数据存储机制:
- Preferences库采用键值对存储
- 使用`putString()`存储字符串数据到Flash
- 数据将保留在`nvs`分区,断电不丢失
四、功能验证
1. 首次连接手机蓝牙时,串口监视器将显示获取的MAC地址
2. 重启设备后会自动读取已存储的MAC地址
3. 存储位置查看:使用ESP32的NVS查看工具可验证存储结果
阅读全文
相关推荐


















