Utilizo o seguinte código para chavear dois relés com o smartphone em um ESP32 via BLE. O código funciona até agora, mas só consigo conectar um smartphone ao ESP32, assim que ele é conectado, o ESP32 não fica mais visível para outros smartphones - somente quando desligo o primeiro smartphone, o ESP32 fica visível novamente e outro smartphone pode se reconectar.
Portanto, tenho as seguintes perguntas:
Vários smartphones podem se conectar ao ESP32 via Bluetooth ao mesmo tempo?
Caso contrário, a conexão com o smartphone anterior pode ser interrompida assim que um novo quiser se conectar ao ESP32?
Aqui está meu código atual:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// Relais-Pins
const int relay1Pin = 18; // GPIO 18
const int relay2Pin = 19; // GPIO 19
BLEServer *pServer = NULL;
BLECharacteristic *pCharacteristic = NULL;
bool relay1State = false;
bool relay2State = false;
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {
// Handle connection
}
void onDisconnect(BLEServer *pServer) {
// Handle disconnection
BLEDevice::startAdvertising(); // Start advertising to allow reconnection
}
};
class MyCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() > 0) {
if (value[0] == '1') {
digitalWrite(relay1Pin, true);
delay(500);
digitalWrite(relay1Pin, false);
} else if (value[0] == '2') {
digitalWrite(relay2Pin, true);
delay(500);
digitalWrite(relay2Pin, false);
}
}
}
};
void setup() {
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
digitalWrite(relay1Pin, relay1State);
digitalWrite(relay2Pin, relay2State);
BLEDevice::init("ESP32_Relay_Control");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(BLEUUID("0000FFFF-0000-1000-8000-00805F9B34FB"));
pCharacteristic = pService->createCharacteristic(
BLEUUID("0000FF01-0000-1000-8000-00805F9B34FB"),
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setCallbacks(new MyCallbacks());
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(pService->getUUID());
pAdvertising->start();
}
void loop() {
}
A publicidade pára automaticamente quando uma central se conecta.
Atualmente, você volta a anunciar apenas na desconexão (onDisconnect). Você pode começar a anunciar novamente no Connect. Então você deve ser capaz de obter várias conexões. Apenas certifique-se de lidar com o caso quando o máximo de conexões for atingido.