前言
代码最终实现功能:蓝牙从机(服务器端)通过Notify向蓝牙主机(客户端)发送数据
一、蓝牙从机(服务器端)
// 首先是蓝牙设备(Device)作为服务器使用(Server);
// 一个服务器中运行了一个或多个服务(Service),每个服务由一个UUID来标识;
// 每个服务中含有一个或多个特征(Characteristic),每个特征由一个UUID来标识;
// 每个特征中包含一个值(Value),另外还包含零个或多个描述(Descriptor),每个描述由一个UUID来标识;
// 通过notify向主机也就是客户端发送数据,因为notify是非阻塞,不会确认客户端是否收到,但默认情况智慧发送value的前20字节数据
#include <BLEDevice.h>
#include <BLE2902.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" // 自定义UUID
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" // 自定义UUID
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
uint32_t value = 0;
// Server回调函数声明
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("设备接入~");
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("设备断开~");
// 在有设备接入后Advertising广播会被停止,所以要在设备断开连接时重新开启广播
// 不然的话只有重启ESP32后才能重新搜索到
pServer->startAdvertising(); //该行效果同 BLEDevice::startAdvertising();
}
};
// 特征回调函数声明
class MyCharacteristicCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue(); // 读取特征的新值
Serial.print("特征值已更新,新值为: ");
Serial.println(value.c_str());
}
};
void setup() {
Serial.begin(115200);
Serial.println();
BLEDevice::init("ESP32-BLE");
BLEServer *pServer = BLEDevice::createServer(); // 创建服务器
BLEService *pService = pServer->createService(SERVICE_UUID); // 创建服务
// pCharacteristic = pService->createCharacteristic( // 创建特征
// CHARACTERISTIC_UUID,
// BLECharacteristic::PROPERTY_NOTIFY | // 启用通知
// BLECharacteristic::PROPERTY_INDICATE // 启用通知
// );
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,