esp32_蓝牙ble通信
效果

原理
ble通信步骤

- 创建蓝牙Ble服务
cpp
#include <BLEDevice.h>
#include "arduino.h"
// 初始化BLE设备,设置设备名称
BLEDevice::init("ESP32-BLE");
p_server = BLEDevice::createServer();
// 创建服务
p_service = p_server->createService(SERVICE_UUID);
// 服务回调
p_server->setCallbacks(new MyServerCallbacks()); // 设置回调断连时再次打开蓝牙服务回调
cpp
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
Serial.println("Client connected");
}
void onDisconnect(BLEServer* pServer) {
Serial.println("Client disconnected, restarting advertising");
p_advertising->start(); // 断开连接后重新开始广播
}
};- 创建特征
- 设置特征描述符
- 设置特征值
cpp
// 创建特征
p_characteristic = p_service->createCharacteristic(
CHARACTERISTIC_UUID, // UUID
BLECharacteristic::PROPERTY_READ // 读取描述符
| BLECharacteristic::PROPERTY_WRITE // 写入描述符
| BLECharacteristic::PROPERTY_NOTIFY // 通知描述符
);
// p_characteristic->setValue("Hello BLE"); // 设置特征值
p_characteristic->setCallbacks(new MyCharacteristicCallbacks()); // 设置读取回调
p_characteristic->addDescriptor(new BLE2902()); // 添加客户端配置描述符,允许通知和指示
p_service->start(); // 启动服务蓝牙主动通知读取
cpp
if (p_server->getConnectedCount() > 0)
{
static unsigned long lastSendMillis = 0;
if (millis() - lastSendMillis >= 1000)
{
// 每秒通知一次,避免过于频繁
p_characteristic->setValue(time_str); // 获取当前显示数据并设置为特征值
p_characteristic->notify();
lastSendMillis = millis();
}
}读取回调
cpp
// 纯虚函数不能直接new,需要实现接口类
class MyCharacteristicCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic* pCharacteristic) {
std::string value = pCharacteristic->getValue();
Serial.print("Received value: ");
Serial.println(value.c_str());
}
};- 创建广播
cpp
// 启动广播
p_advertising = BLEDevice::getAdvertising(); // 获取广告对象
p_advertising->addServiceUUID(SERVICE_UUID); // 广播服务UUID
p_advertising->setScanResponse(true); // 设置扫描响应
p_advertising->start();