上代码
#include <BLEDevice.h>
#include <BLE2902.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
uint32_t value = 0;
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("现在有设备接入~");
};
void onDisconnect(BLEServer* pServer) {
Serial.println("现在有设备断开连接~");
deviceConnected = false;
// 在有设备接入后Advertising广播会被停止,所以要在设备断开连接时重新开启广播
// 不然的话只有重启ESP32后才能重新搜索到
pServer->startAdvertising(); //该行效果同 BLEDevice::startAdvertising();
}
};
class MyCallbacks: public BLECharacteristicCallbacks {
void onRead(BLECharacteristic* pCharacteristic) { // 客户端读取事件回调函数
Serial.println("触发读取事件");
}
void onWrite(BLECharacteristic *pCharacteristic) { // 客户端写入事件回调函数
Serial.println("触发写入事件");
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0)
{
String rxload = "";
for (int i = 0; i < rxValue.length(); i++)
{
rxload += (char)rxValue[i];
Serial.print(rxValue[i]);
}
Serial.println("");
Serial.println(rxValue.c_str());
pCharacteristic->setValue("hfk中g"); // 设置value值
pCharacteristic->notify(); // 使用notify方法向客户端发送数据,也可以使用indicate方法
}
}
};
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_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_INDICATE
);
pCharacteristic->addDescriptor(new BLE2902()); // 不加这行可能无法使用通知
pServer->setCallbacks(new MyServerCallbacks());
pCharacteristic->setCallbacks(new MyCallbacks());
pService->start();
BLEDevice::startAdvertising();
}
void loop() {
// if (deviceConnected) {
// pCharacteristic->setValue((uint8_t*)&value, 4); // 设置value值
// pCharacteristic->notify(); // 使用notify方法向客户端发送数据,也可以使用indicate方法
// value++;
// // delay(3); // 等待蓝牙处理完成
// }
// delay(2000);
}