blemanager.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //https://blog.csdn.net/Naisu_kun/article/details/115958024
  2. #include <BLEDevice.h> // 引入相关库
  3. #include <BLE2902.h>
  4. #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" // 服务 自定义UUID
  5. #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" // 特征UUID
  6. bool deviceConnected = false;
  7. BLECharacteristic *pCharacteristic;
  8. int ledPin = 8;
  9. // Server回调函数声明
  10. class MyServerCallbacks: public BLEServerCallbacks {
  11. void onConnect(BLEServer* pServer) {
  12. //有设备接入
  13. Serial.println("device open~");
  14. digitalWrite(ledPin, LOW);
  15. deviceConnected = true;
  16. };
  17. void onDisconnect(BLEServer* pServer) {
  18. //设备断开
  19. Serial.println("device break~");
  20. // 在有设备接入后Advertising广播会被停止,所以要在设备断开连接时重新开启广播
  21. // 不然的话只有重启ESP32后才能重新搜索到
  22. pServer->startAdvertising(); //该行效果同 BLEDevice::startAdvertising();
  23. digitalWrite(ledPin, HIGH);
  24. deviceConnected = false;
  25. }
  26. };
  27. class MyCallbacks: public BLECharacteristicCallbacks {
  28. void onRead(BLECharacteristic* pCharacteristic) { // 客户端读取事件回调函数
  29. Serial.println("value read");
  30. }
  31. void onWrite(BLECharacteristic *pCharacteristic) { // 客户端写入事件回调函数
  32. Serial.println("value write");
  33. }
  34. };
  35. void bleSetup() {
  36. pinMode(ledPin, OUTPUT);
  37. digitalWrite(ledPin, HIGH);
  38. BLEDevice::init("APTBLE"); // 填写自身对外显示的蓝牙设备名称,并初始化蓝牙功能
  39. BLEServer *pServer = BLEDevice::createServer(); // 创建服务器
  40. pServer->setCallbacks(new MyServerCallbacks()); // 绑定回调函数
  41. BLEService *pService = pServer->createService(SERVICE_UUID); // 创建服务
  42. pCharacteristic = pService->createCharacteristic( // 创建特征
  43. CHARACTERISTIC_UUID,
  44. BLECharacteristic::PROPERTY_READ | // 启用读取
  45. BLECharacteristic::PROPERTY_WRITE | // 启用写入
  46. BLECharacteristic::PROPERTY_NOTIFY | // 启用通知
  47. BLECharacteristic::PROPERTY_INDICATE // 启用通知
  48. );
  49. pCharacteristic->setCallbacks(new MyCallbacks());
  50. pCharacteristic->addDescriptor(new BLE2902()); // 不加这行可能无法使用通知
  51. pCharacteristic->setValue("this is apt"); // 设置该Characteristic的Value值
  52. pService->start(); // 启动服务
  53. BLEDevice::startAdvertising(); // 开启Advertising广播
  54. }
  55. //消息通知
  56. void bleNotify(){
  57. pCharacteristic->notify();
  58. Serial.println("notify...");
  59. }
  60. int loopBleSize=1000; //loop间隔
  61. int bleMillisTime;
  62. void bleLoop() {
  63. //1秒发送1次通知
  64. if (!deviceConnected)return;
  65. int bleTimeCurrent = millis();
  66. if(bleTimeCurrent<=0)bleMillisTime = bleTimeCurrent;
  67. if((bleTimeCurrent - bleMillisTime)>loopBleSize){
  68. bleMillisTime = bleTimeCurrent;
  69. pCharacteristic->notify();
  70. Serial.println("notify...");
  71. }
  72. }