如何在ESP32上使用NimBLE蓝牙库接收蓝牙串口数据?
使用NimBLE库在ESP32上接收蓝牙数据并打印
要实现通过NimBLE接收蓝牙发来的字符串并打印,核心是给BLE特征值配置可写属性,并通过回调函数处理接收到的数据。以下是完整实现步骤和代码:
关键实现逻辑
- 给Characteristic配置可写权限,支持客户端写入数据
- 自定义回调类,重写
onWrite方法捕获并处理收到的数据 - 将回调绑定到目标Characteristic,启动服务并开启广播等待连接
完整代码示例
#include "NimBLEDevice.h" // 自定义特征值回调类,处理写入的数据 class MyCharacteristicCallbacks : public NimBLECharacteristicCallbacks { void onWrite(NimBLECharacteristic *pCharacteristic) override { // 获取接收到的字符串 std::string receivedData = pCharacteristic->getValue(); if (!receivedData.empty()) { // 打印接收到的数据 printf("收到蓝牙数据:%s\n", receivedData.c_str()); } } }; void app_main(void) { // 初始化BLE设备,设置设备名称 NimBLEDevice::init("ESP32_NimBLE"); // 创建BLE服务器 NimBLEServer *pServer = NimBLEDevice::createServer(); // 创建BLE服务(UUID:"ABCD") NimBLEService *pService = pServer->createService("ABCD"); // 创建特征值,配置可写+可读属性 // WRITE_NR表示无需响应的写入,适合串口类连续数据传输;若需可靠传输可改用WRITE NimBLECharacteristic *pCharacteristic = pService->createCharacteristic( "1234", NIMBLE_PROPERTY::WRITE_NR | NIMBLE_PROPERTY::READ ); // 绑定自定义回调到特征值 pCharacteristic->setCallbacks(new MyCharacteristicCallbacks()); // 启动BLE服务 pService->start(); // 开启广播,让客户端能搜索到设备 NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising(); pAdvertising->addServiceUUID("ABCD"); pAdvertising->start(); }
代码关键点说明
- 特征值属性:
NIMBLE_PROPERTY::WRITE_NR允许客户端无响应发送数据,适合串口类数据传输;如果需要确保数据送达,可替换为NIMBLE_PROPERTY::WRITE(需要ESP32回复确认)。 - 回调触发:当客户端向该特征值写入数据时,
onWrite方法会自动执行,通过pCharacteristic->getValue()可直接获取发送的字符串。 - 广播配置:必须启动广播并添加服务UUID,否则客户端无法搜索到ESP32设备。
测试时,用BLE调试工具(如nRF Connect)连接ESP32,找到UUID为ABCD的服务和1234的特征值,向其写入字符串,ESP32的串口控制台就会打印出收到的数据。
内容的提问来源于stack exchange,提问作者Savad
相关产品推荐
相关产品推荐

