#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// 服务UUID和特征UUID,用于标识BLE服务和特征
#define SERVICE_UUID "12345678-1234-1234-1234-123456789012"
#define CHARACTERISTIC_UUID "87654321-4321-4321-4321-210987654321"
/*BLE服务器、服务和特征的指针(服务器包含服务,服务包含特征)
声明为全局变量,否则消失后无法使用蓝牙
*/
BLEServer *pServer = nullptr;
BLEService *pService = nullptr;
BLECharacteristic *pCharacteristic = nullptr;
bool deviceConnected = false; // 跟踪设备连接状态
// 服务器回调
class MyServerCallbacks : public BLEServerCallbacks
{
void onConnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param)
{
deviceConnected = true;
Serial.print("Device connected: ");
Serial.println(BLEAddress(param->connect.remote_bda).toString().c_str()); // param->disconnect.remote_bda 获取连接设备的地址
}
void onDisconnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param)
{
deviceConnected = false;
Serial.print("Device disconnected: ");
Serial.println(BLEAddress(param->disconnect.remote_bda).toString().c_str());
pServer->getAdvertising()->start(); // 被客户端断开后重新启动广播
}
};
// 特征回调
class MyCallbacks : public BLECharacteristicCallbacks
{
void onWrite(BLECharacteristic *pCharacteristic)
{
std::string value = pCharacteristic->getValue(); // 获取接收到的消息
Serial.print("Received Value: ");
Serial.println(value.c_str());
// Echo back
pCharacteristic->setValue("Received"); // 要发送的消息
pCharacteristic->notify(); // 发送消息
}
};
void setup()
{
Serial.begin(115200);
BLEDevice::init("ESP32-C3-BLE-Server"); // 初始化BLE设备并设置设备名称
pServer = BLEDevice::createServer(); // 创建BLE服务器
pServer->setCallbacks(new MyServerCallbacks()); // 设置回调
pService = pServer->createService(SERVICE_UUID); // 创建一个BLE服务并使用之前定义的服务UUID
// 创建一个BLE特征,并设置其属性为可读和可写和通知
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ | // 允许客户端读取特征的值,当客户端读取特征时,服务器返回特征的当前值
BLECharacteristic::PROPERTY_WRITE | // 允许客户端写入特征的值
BLECharacteristic::PROPERTY_NOTIFY); // 允许服务器主动向客户端发送特征的更新通知
pCharacteristic->setCallbacks(new MyCallbacks()); // 设置回调
pCharacteristic->setValue("Hello World"); // 设置特征的初始值,当客户端第一次读取这个特征时,它会接收到这个初始值
pService->start(); // 启动广播
// BLEAdvertising 广告是BLE设备向外广播其存在和提供的服务的方式。通过广告,BLE设备可以被其他设备(如手机或其他BLE客户端)发现和连接
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); // 配置广告参数
pAdvertising->addServiceUUID(SERVICE_UUID); // 添加服务UUID到广告包
pAdvertising->setScanResponse(true); // 设置扫描响应
// 调整最小首选连接间隔
// pAdvertising->setMinPreferred(0x06); // functions that help with iPhone connections issue,约7.5毫秒,默认0x18约30ms
BLEDevice::startAdvertising(); // 启动广告
Serial.println("BLE server is now advertising");
}
void loop()
{
Serial.println("......test bluetooth......");
if (deviceConnected) // 连接状态下notify()才有用,否则不会执行任何操作
{
// 主动发送消息
std::string message = "Hello from ESP32-C3!";
pCharacteristic->setValue(message);
pCharacteristic->notify();
Serial.print("Sent message: ");
Serial.println(message.c_str());
vTaskDelay(1000 / portTICK_PERIOD_MS); // 每秒发送一次消息
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
Esp32c3作为蓝牙服务器的Arduion编程
最新推荐文章于 2025-02-20 09:36:54 发布