implemented keep alive (clients that have not sent the KeepAlive command for more than ten seconds will be disconnected)

This commit is contained in:
Dorian Zedler 2020-10-15 16:58:06 +02:00
parent 1be53b8925
commit 20fc2784db
Signed by: dorian
GPG key ID: D3B255CB8BC7CD37
5 changed files with 53 additions and 7 deletions

View file

@ -60,10 +60,11 @@ public:
void sendData(String data); void sendData(String data);
bool getDeviceConnected(); bool getDeviceConnected();
bool disconnectCurrentDevice();
protected: protected:
// callbacks for BLEServer // callbacks for BLEServer
void onConnect(BLEServer *pServer) override; void onConnect(BLEServer *pServer, esp_ble_gatts_cb_param_t *param) override;
void onDisconnect(BLEServer *pServer) override; void onDisconnect(BLEServer *pServer) override;
// callback for BLECharacteristic // callback for BLECharacteristic
@ -75,6 +76,9 @@ private:
const char *rxUUID; const char *rxUUID;
const char *txUUID; const char *txUUID;
esp_gatt_perm_t permissions;
// BLE Objects // BLE Objects
BLEServer *bleServer; BLEServer *bleServer;
BLEService *bleService; BLEService *bleService;
@ -82,7 +86,8 @@ private:
BLECharacteristic *rxCharacteristic; BLECharacteristic *rxCharacteristic;
// helpers // helpers
bool deviceConnected = false; bool deviceConnected;
uint16_t deviceConnectionId;
BluetoothLeUartServerCallbacks *callbacks; BluetoothLeUartServerCallbacks *callbacks;
}; };

View file

@ -15,6 +15,8 @@ public:
// befriend for callbacks // befriend for callbacks
friend class BluetoothLeUartServer; friend class BluetoothLeUartServer;
void loop();
protected: protected:
// calbacks for BluetoothLeUartServerCallbacks // calbacks for BluetoothLeUartServerCallbacks
void onDeviceConnectedChanged(bool deviceConnected) override; void onDeviceConnectedChanged(bool deviceConnected) override;
@ -23,6 +25,8 @@ protected:
private: private:
enum OmobiDisplayCommand enum OmobiDisplayCommand
{ {
AuthorizeSessionCommand = 0,
KeepAliveCommand = 1,
GetAllTextSetsCommand = 10, GetAllTextSetsCommand = 10,
GetTextSetParameterCommand = 11, GetTextSetParameterCommand = 11,
GetDisplayBrightnessCommand = 12, GetDisplayBrightnessCommand = 12,
@ -37,6 +41,9 @@ private:
DisplayControllerError = 501 DisplayControllerError = 501
}; };
unsigned long lastKeepAlive;
const int maximumKeepAliveDelay = 10000;
LedDisplayController *ledDisplayController; LedDisplayController *ledDisplayController;
BluetoothLeUartServer *bleServer; BluetoothLeUartServer *bleServer;
}; };

View file

@ -7,6 +7,8 @@ BluetoothLeUartServer::BluetoothLeUartServer(String deviceName, const char uartS
this->txUUID = txUUID; this->txUUID = txUUID;
this->callbacks = nullptr; this->callbacks = nullptr;
this->deviceConnected = false;
this->deviceConnectionId = -1;
// Create the BLE Device // Create the BLE Device
BLEDevice::init(deviceName.c_str()); // Give it a name BLEDevice::init(deviceName.c_str()); // Give it a name
@ -54,9 +56,11 @@ void BluetoothLeUartServer::sendData(String data)
txCharacteristic->notify(); txCharacteristic->notify();
} }
void BluetoothLeUartServer::onConnect(BLEServer *pServer) void BluetoothLeUartServer::onConnect(BLEServer* pServer, esp_ble_gatts_cb_param_t *param)
{ {
this->deviceConnected = true; this->deviceConnected = true;
this->deviceConnectionId = param->connect.conn_id;
if (this->callbacks != nullptr) if (this->callbacks != nullptr)
{ {
this->callbacks->onDeviceConnectedChanged(this->deviceConnected); this->callbacks->onDeviceConnectedChanged(this->deviceConnected);
@ -66,6 +70,8 @@ void BluetoothLeUartServer::onConnect(BLEServer *pServer)
void BluetoothLeUartServer::onDisconnect(BLEServer *pServer) void BluetoothLeUartServer::onDisconnect(BLEServer *pServer)
{ {
this->deviceConnected = false; this->deviceConnected = false;
this->deviceConnectionId = -1;
if (this->callbacks != nullptr) if (this->callbacks != nullptr)
this->callbacks->onDeviceConnectedChanged(this->deviceConnected); this->callbacks->onDeviceConnectedChanged(this->deviceConnected);
} }
@ -80,3 +86,11 @@ bool BluetoothLeUartServer::getDeviceConnected()
{ {
return this->deviceConnected; return this->deviceConnected;
} }
bool BluetoothLeUartServer::disconnectCurrentDevice() {
if(!this->getDeviceConnected())
return false;
this->bleServer->disconnect(this->deviceConnectionId);
return true;
}

View file

@ -1,22 +1,34 @@
#include "OmobiLedDisplay.h" #include "OmobiLedDisplay.h"
#include "esp_gatts_api.h"
OmobiLedDisplay::OmobiLedDisplay(String deviceName, Adafruit_NeoMatrix *ledDisplayMatrix) OmobiLedDisplay::OmobiLedDisplay(String deviceName, Adafruit_NeoMatrix *ledDisplayMatrix)
{ {
this->lastKeepAlive = -1;
// init led display controller // init led display controller
this->ledDisplayController = new LedDisplayController(ledDisplayMatrix); this->ledDisplayController = new LedDisplayController(ledDisplayMatrix);
this->ledDisplayController->setTextSetParameter(0, LedDisplayController::ActiveParameter, "true"); this->ledDisplayController->setTextSetParameter(0, LedDisplayController::ActiveParameter, "true");
// init ble server // init ble server
this->bleServer = new BluetoothLeUartServer(deviceName, "6e400001-b5a3-f393-e0a9-e50e24dcca9e", "6e400002-b5a3-f393-e0a9-e50e24dcca9e", "6e400003-b5a3-f393-e0a9-e50e24dcca9e"); this->bleServer = new BluetoothLeUartServer(deviceName, "92fecb20-1406-426a-afa5-cd5c1f306462", "92fecb21-1406-426a-afa5-cd5c1f306462", "92fecb22-1406-426a-afa5-cd5c1f306462");
this->bleServer->setCallbacks(this); this->bleServer->setCallbacks(this);
} }
void OmobiLedDisplay::loop() {
if(millis() - lastKeepAlive > this->maximumKeepAliveDelay)
this->bleServer->disconnectCurrentDevice();
}
void OmobiLedDisplay::onDeviceConnectedChanged(bool deviceConnected) void OmobiLedDisplay::onDeviceConnectedChanged(bool deviceConnected)
{ {
if (deviceConnected) if (deviceConnected) {
Serial.println("Device connected"); Serial.println("Device connected");
else this->lastKeepAlive = millis();
}
else {
Serial.println("Device disconnected"); Serial.println("Device disconnected");
this->lastKeepAlive = -1;
}
} }
void OmobiLedDisplay::onDataReceived(String dataString) void OmobiLedDisplay::onDataReceived(String dataString)
@ -42,6 +54,13 @@ void OmobiLedDisplay::onDataReceived(String dataString)
switch (requestHeader) switch (requestHeader)
{ {
case KeepAliveCommand:
{
replyStatus = Success;
this->lastKeepAlive = millis();
break;
}
case GetAllTextSetsCommand: case GetAllTextSetsCommand:
{ {
// cycle through all text sets // cycle through all text sets

View file

@ -27,5 +27,6 @@ void setup()
void loop() void loop()
{ {
// nothing to do in loop // nothing to do in loop
delay(1000); display->loop();
delay(1);
} }