Как остановить службу 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();
}
}
Я пытаюсь:
Запуск службы BLE и характеристик с UUID
Выполнить отправку данных
Завершить соединение с помощью :
//превышение лимита значения если (значение > 10) { устройство подключено = ложь; значение = 0; настраивать();
Вызов функции setup() для сброса службы и характеристик с UUID1.
Но это не работает, может ли кто-нибудь подсказать мне что-нибудь по этому поводу.
0
Смотрите также:
- Библиотека ардуино или код для ESP32 для сканирования устройств Bluetooth?
- ESP32 запускает BLE после глубокого сна
- Антенна для ESP32-pico-d4
- Как получить имя подключенного устройства через BLE?
- Как получить продолжительность сканирования менее 1 секунды с помощью Arduino BLE?
- ESP32 - BLE не подключается/не перезапускается после легкого сна
- Служба BLE ESP32 не видна Node-RED
- Ошибка стека ESP32 при чтении с устройства BLE
Было бы очень полезно, если бы вы могли подробно рассказать о том, что «это не работает»., @JRobert
@JRobert Под «это не работает» я имел в виду, что он не отключается от BLE
SERVICE_UUID
, не подключается к 'BLESERVICE_UUID1
. Я загрузил два ESP32 с BLE_client с разными UUID, он подключился к первому, но не ко второму., @Just doin Gods work