123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /*
- 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
- Create a BLE server that, once we receive a connection, will send periodic notifications.
- The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
- Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
- Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY"
- 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.
- In this example rxValue is the data received (only accessible inside that function).
- And txValue is the data to be sent, in this example just a byte incremented every second.
- */
- #include <BLEDevice.h>
- #include <BLEServer.h>
- #include <BLEUtils.h>
- #include <BLE2902.h>
- #include "heltec.h"
- #define BAND 915E6 //you can set band here directly,e.g. 868E6,915E6
- String packSize = "--";
- String packet ;
- BLEServer *pServer = NULL;
- BLECharacteristic * pTxCharacteristic;
- bool deviceConnected = false;
- bool oldDeviceConnected = false;
- uint8_t txValue = 0;
- // See the following for generating UUIDs:
- // https://www.uuidgenerator.net/
- #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) {
- Serial.println("just got a connection wooo");
- deviceConnected = true;
- };
- void onDisconnect(BLEServer* pServer) {
- deviceConnected = false;
- }
- };
- 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]);
- }
-
- Serial.println();
- String loraPacket = String(rxValue.c_str());
- if (rxValue.length() > 0) {
- LoRa.beginPacket();
- LoRa.print(loraPacket);
- LoRa.endPacket();
- }
- LoRa.receive();
- }
- };
- void cbk(int packetSize) {
- packet ="";
- packSize = String(packetSize,DEC);
- Serial.println("***********");
- for (int i = 0; i < packetSize; i++) { packet += (char) LoRa.read(); }
- Serial.println(packet);
- Serial.println("***********");
- pTxCharacteristic->setValue(packet.c_str());
- pTxCharacteristic->notify();
- LoRa.receive();
- }
- void setup() {
- Heltec.begin(false /*DisplayEnable Enable*/, true /*Heltec.Heltec.Heltec.LoRa Disable*/, true /*Serial Enable*/, true /*PABOOST Enable*/, BAND /*long BAND*/);
- Serial.begin(115200);
- Serial.setRxBufferSize(1024);
- LoRa.setSignalBandwidth(250E3);
- LoRa.receive();
- // Create the BLE Device
- BLEDevice::init("UART Service");
- // Create the BLE Server
- pServer = BLEDevice::createServer();
- pServer->setCallbacks(new MyServerCallbacks());
- // Create the BLE Service
- BLEService *pService = pServer->createService(SERVICE_UUID);
- // Create a BLE Characteristic
- pTxCharacteristic = pService->createCharacteristic(
- CHARACTERISTIC_UUID_TX,
- BLECharacteristic::PROPERTY_NOTIFY
- );
-
- pTxCharacteristic->addDescriptor(new BLE2902());
- BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
- CHARACTERISTIC_UUID_RX,
- BLECharacteristic::PROPERTY_WRITE
- );
- pRxCharacteristic->setCallbacks(new MyCallbacks());
- // Start the service
- pService->start();
- // Start advertising
- pServer->getAdvertising()->start();
- Serial.println("Waiting a client connection to notify...");
- }
- void loop() {
- delay(5);
- // disconnecting
- if (!deviceConnected && oldDeviceConnected) {
- delay(500); // give the bluetooth stack the chance to get things ready
- pServer->startAdvertising(); // restart advertising
- Serial.println("start advertising");
- oldDeviceConnected = deviceConnected;
- }
- // connecting
- if (deviceConnected && !oldDeviceConnected) {
- // do stuff here on connecting
- oldDeviceConnected = deviceConnected;
- }
- int packetSize = LoRa.parsePacket();
- if (deviceConnected && packetSize) {
- cbk(packetSize);
- }
- }
|