ESP32 bluetooth BLE serial/UART example - forward: serial ⇔ BLE

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
 
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
 
#define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
 
class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) { deviceConnected = true; Serial.println("connected"); };
    void onDisconnect(BLEServer* pServer) { deviceConnected = false; Serial.println("disconnected"); }
};
 
class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();
      for (int i = 0; i < rxValue.length(); i++) Serial.print(rxValue[i]);
    }
};
 
void setup() {
  Serial.begin(115200);
  BLEDevice::init("ESP32 UART Test"); // // Create the BLE Device Give it a name
  BLEServer *pServer = BLEDevice::createServer(); // Create the BLE Server
  pServer->setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer->createService(SERVICE_UUID);  
  pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY); // Create a BLE Characteristic
  pCharacteristic->addDescriptor(new BLE2902());
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);
  pCharacteristic->setCallbacks(new MyCallbacks());
  pService->start(); // Start the service
  pServer->getAdvertising()->start(); // Start advertising
  Serial.println("Waiting a client connection to notify...");
}
 
void loop() {
  if (deviceConnected) {
    if (Serial.available()) {
      std::string s = "";
      while (Serial.available()) s += Serial.read();
      pCharacteristic->setValue(s.c_str());
      pCharacteristic->notify(); 
    }
  }
}