//https://blog.csdn.net/Naisu_kun/article/details/115958024 #include // 引入相关库 #include #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" // 服务 自定义UUID #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" // 特征UUID bool deviceConnected = false; BLECharacteristic *pCharacteristic; int ledPin = 8; // Server回调函数声明 class MyServerCallbacks: public BLEServerCallbacks { void onConnect(BLEServer* pServer) { //有设备接入 Serial.println("device open~"); digitalWrite(ledPin, LOW); deviceConnected = true; }; void onDisconnect(BLEServer* pServer) { //设备断开 Serial.println("device break~"); // 在有设备接入后Advertising广播会被停止,所以要在设备断开连接时重新开启广播 // 不然的话只有重启ESP32后才能重新搜索到 pServer->startAdvertising(); //该行效果同 BLEDevice::startAdvertising(); digitalWrite(ledPin, HIGH); deviceConnected = false; } }; class MyCallbacks: public BLECharacteristicCallbacks { void onRead(BLECharacteristic* pCharacteristic) { // 客户端读取事件回调函数 Serial.println("value read"); } void onWrite(BLECharacteristic *pCharacteristic) { // 客户端写入事件回调函数 Serial.println("value write"); } }; void bleSetup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); BLEDevice::init("APTBLE"); // 填写自身对外显示的蓝牙设备名称,并初始化蓝牙功能 BLEServer *pServer = BLEDevice::createServer(); // 创建服务器 pServer->setCallbacks(new MyServerCallbacks()); // 绑定回调函数 BLEService *pService = pServer->createService(SERVICE_UUID); // 创建服务 pCharacteristic = pService->createCharacteristic( // 创建特征 CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | // 启用读取 BLECharacteristic::PROPERTY_WRITE | // 启用写入 BLECharacteristic::PROPERTY_NOTIFY | // 启用通知 BLECharacteristic::PROPERTY_INDICATE // 启用通知 ); pCharacteristic->setCallbacks(new MyCallbacks()); pCharacteristic->addDescriptor(new BLE2902()); // 不加这行可能无法使用通知 pCharacteristic->setValue("this is apt"); // 设置该Characteristic的Value值 pService->start(); // 启动服务 BLEDevice::startAdvertising(); // 开启Advertising广播 } //消息通知 void bleNotify(){ pCharacteristic->notify(); Serial.println("notify..."); } int loopBleSize=1000; //loop间隔 int bleMillisTime; void bleLoop() { //1秒发送1次通知 if (!deviceConnected)return; int bleTimeCurrent = millis(); if(bleTimeCurrent<=0)bleMillisTime = bleTimeCurrent; if((bleTimeCurrent - bleMillisTime)>loopBleSize){ bleMillisTime = bleTimeCurrent; pCharacteristic->notify(); Serial.println("notify..."); } }