Skip to content

esp32_蓝牙ble通信

效果

原理

ble通信步骤

  1. 创建蓝牙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(); // 断开连接后重新开始广播
    }
};
  1. 创建特征
    • 设置特征描述符
    • 设置特征值
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());
    }
};
  1. 创建广播
cpp
// 启动广播
p_advertising = BLEDevice::getAdvertising(); // 获取广告对象
p_advertising->addServiceUUID(SERVICE_UUID); // 广播服务UUID
p_advertising->setScanResponse(true);        // 设置扫描响应
p_advertising->start();

参考资料

ESP32低功耗蓝牙BLE教学_哔哩哔哩_bilibili

最近更新