Esp32c3作为蓝牙服务器的Arduion编程

#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值