123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- //https://blog.csdn.net/Naisu_kun/article/details/115958024
- #include <BLEDevice.h> // 引入相关库
- #include <BLE2902.h>
- #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...");
- }
- }
|