|
@@ -0,0 +1,147 @@
|
|
|
+/*
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+}
|