Как остановить службу BLE и начать новую с другим UUID в ESP32

/*
    Video: https://www.youtube.com/watch?v=oCMOYS71NIU
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
    Ported to Arduino ESP32 by Evandro Copercini
    updated by chegewara

   Create a BLE server that, once we receive a connection, will send periodic notifications.
   The service advertises itself as: 4fafc201-1fb5-459e-8fcc-c5c9c331914b
   And has a characteristic of: beb5483e-36e1-4688-b7f5-ea07361b26a8

   The design of creating the BLE server is:
   1. Create a BLE Server
   2. Create a BLE Service
   3. Create a BLE Characteristic on the Service
   4. Create a BLE Descriptor on the characteristic
   5. Start the service.
   6. Start advertising.

   A connect hander associated with the server starts a background task that performs notification
   every couple of seconds.
*/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint32_t value = 0;

// См. следующее для генерации UUID:
// https://www.uuidgenerator.net/

#define SERVICE_UUID1        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID1 "beb5483e-36e1-4688-b7f5-ea07361b26a8"

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331915b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b215b"


class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
      BLEDevice::startAdvertising();
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};


uint8_t once1 = 0;

void setup() {
  Serial.begin(115200);

  // Создаем BLE-устройство
  BLEDevice::init("ESP32");

  // Создаем BLE-сервер
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());


  if (once1 == 0)
  {
    // Создаем службу BLE
    BLEService *pService = pServer->createService(SERVICE_UUID);

    // Создаем характеристику BLE
    pCharacteristic = pService->createCharacteristic(
                        CHARACTERISTIC_UUID,
                        BLECharacteristic::PROPERTY_READ   |
                        BLECharacteristic::PROPERTY_WRITE  |
                        BLECharacteristic::PROPERTY_NOTIFY |
                        BLECharacteristic::PROPERTY_INDICATE
                      );

    // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
    // Создаем BLE-дескриптор
    pCharacteristic->addDescriptor(new BLE2902());

    // Запускаем службу
    pService->start();
  }
  else
  {
    BLEService *pService = pServer->createService(SERVICE_UUID1);

    // Создаем характеристику BLE
    pCharacteristic = pService->createCharacteristic(
                        CHARACTERISTIC_UUID1,
                        BLECharacteristic::PROPERTY_READ   |
                        BLECharacteristic::PROPERTY_WRITE  |
                        BLECharacteristic::PROPERTY_NOTIFY |
                        BLECharacteristic::PROPERTY_INDICATE
                      );
    // https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
    // Создаем BLE-дескриптор
    pCharacteristic->addDescriptor(new BLE2902());

    // Запускаем службу
    pService->start();
  }





  // Начать рекламу
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  if (once1 == 0)
    pAdvertising->addServiceUUID(SERVICE_UUID);
  else
    pAdvertising->addServiceUUID(SERVICE_UUID1);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);  // установите значение 0x00, чтобы не рекламировать этот параметр
  BLEDevice::startAdvertising();
  Serial.println("Waiting a client connection to notify...");

  once1 = 1;
}

void loop() {
  // уведомляем об изменении значения
  if (deviceConnected) {
    pCharacteristic->setValue((uint8_t*)&value, 4);
    pCharacteristic->notify();
    
  }
  value++;
  delay(2000); // стек bluetooth будет перегружен, если будет отправлено слишком много пакетов, за 6 часов теста я смог пройти всего 3 мс

  
  // отключение
  if (!deviceConnected && oldDeviceConnected) {
    delay(500); // дать стеку bluetooth возможность подготовиться
    pServer->startAdvertising(); // перезапустить рекламу
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }
  // подключение
  if (deviceConnected && !oldDeviceConnected) {
    // делаем что-то здесь при подключении
    oldDeviceConnected = deviceConnected;
  }

  //превышение лимита значения
  if (value > 10)
  {
    deviceConnected = false;
    value = 0;
    setup();
  }
}

Я пытаюсь:

  1. Запуск службы BLE и характеристик с UUID

  2. Выполнить отправку данных

  3. Завершить соединение с помощью :

    //превышение лимита значения если (значение > 10) { устройство подключено = ложь; значение = 0; настраивать();

  4. Вызов функции setup() для сброса службы и характеристик с UUID1.

Но это не работает, может ли кто-нибудь подсказать мне что-нибудь по этому поводу.

, 👍0

Обсуждение

Было бы очень полезно, если бы вы могли подробно рассказать о том, что «это не работает»., @JRobert

@JRobert Под «это не работает» я имел в виду, что он не отключается от BLE SERVICE_UUID, не подключается к 'BLE SERVICE_UUID1. Я загрузил два ESP32 с BLE_client с разными UUID, он подключился к первому, но не ко второму., @Just doin Gods work