aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2025-02-25 20:52:49 +0100
committerJonas Smedegaard <dr@jones.dk>2025-02-25 20:52:49 +0100
commit475a6105ece05fec5277cdbca3ea326eccfb6268 (patch)
tree533929bc670da6d43859b784b7390e46adb3d92a
parenta2b9a8c1248f086db3435342dc85bf7bcd50c05a (diff)
add iBeacon example code
-rw-r--r--_iBeacon.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/_iBeacon.c b/_iBeacon.c
new file mode 100644
index 0000000..d5db613
--- /dev/null
+++ b/_iBeacon.c
@@ -0,0 +1,133 @@
+/*
+ Based on 31337Ghost's reference code from https://github.com/nkolban/esp32-snippets/issues/385#issuecomment-362535434
+ which is based on pcbreflux's Arduino ESP32 port of Neil Kolban's example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
+*/
+
+/*
+ Create a BLE server that will send periodic iBeacon frames.
+ The design of creating the BLE server is:
+ 1. Create a BLE Server
+ 2. Create advertising data
+ 3. Start advertising.
+ 4. wait
+ 5. Stop advertising.
+*/
+#include <BLEDevice.h>
+#include <BLEServer.h>
+#include <BLEUtils.h>
+#include <BLE2902.h>
+#include <BLEBeacon.h>
+
+#define DEVICE_NAME "ESP32"
+#define SERVICE_UUID "7A0247E7-8E88-409B-A959-AB5092DDB03E"
+#define BEACON_UUID "2D7A9F0C-E0E8-4CC9-A71B-A21DB2D034A1"
+#define BEACON_UUID_REV "A134D0B2-1DA2-1BA7-C94C-E8E00C9F7A2D"
+#define CHARACTERISTIC_UUID "82258BAA-DF72-47E8-99BC-B73D7ECD08A5"
+
+BLEServer *pServer;
+BLECharacteristic *pCharacteristic;
+bool deviceConnected = false;
+uint8_t value = 0;
+
+class MyServerCallbacks : public BLEServerCallbacks {
+ void onConnect(BLEServer *pServer) {
+ deviceConnected = true;
+ Serial.println("deviceConnected = true");
+ };
+
+ void onDisconnect(BLEServer *pServer) {
+ deviceConnected = false;
+ Serial.println("deviceConnected = false");
+
+ // Restart advertising to be visible and connectable again
+ BLEAdvertising *pAdvertising;
+ pAdvertising = pServer->getAdvertising();
+ pAdvertising->start();
+ Serial.println("iBeacon advertising restarted");
+ }
+};
+
+class MyCallbacks : public BLECharacteristicCallbacks {
+ void onWrite(BLECharacteristic *pCharacteristic) {
+ String rxValue = pCharacteristic->getValue();
+
+ if (rxValue.length() > 0) {
+ Serial.println("*********");
+ Serial.print("Received Value: ");
+ for (int i = 0; i < rxValue.length(); i++) {
+ Serial.print(rxValue[i]);
+ }
+ Serial.println();
+ Serial.println("*********");
+ }
+ }
+};
+
+void init_service() {
+ BLEAdvertising *pAdvertising;
+ pAdvertising = pServer->getAdvertising();
+ pAdvertising->stop();
+
+ // Create the BLE Service
+ BLEService *pService = pServer->createService(BLEUUID(SERVICE_UUID));
+
+ // Create a BLE Characteristic
+ pCharacteristic = pService->createCharacteristic(
+ CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY
+ );
+ pCharacteristic->setCallbacks(new MyCallbacks());
+ pCharacteristic->addDescriptor(new BLE2902());
+
+ pAdvertising->addServiceUUID(BLEUUID(SERVICE_UUID));
+
+ // Start the service
+ pService->start();
+
+ pAdvertising->start();
+}
+
+void init_beacon() {
+ BLEAdvertising *pAdvertising;
+ pAdvertising = pServer->getAdvertising();
+ pAdvertising->stop();
+ // iBeacon
+ BLEBeacon myBeacon;
+ myBeacon.setManufacturerId(0x4c00);
+ myBeacon.setMajor(5);
+ myBeacon.setMinor(88);
+ myBeacon.setSignalPower(0xc5);
+ myBeacon.setProximityUUID(BLEUUID(BEACON_UUID_REV));
+
+ BLEAdvertisementData advertisementData;
+ advertisementData.setFlags(0x1A);
+ advertisementData.setManufacturerData(myBeacon.getData());
+ pAdvertising->setAdvertisementData(advertisementData);
+
+ pAdvertising->start();
+}
+
+void setup() {
+ Serial.begin(115200);
+ Serial.println();
+ Serial.println("Initializing...");
+ Serial.flush();
+
+ BLEDevice::init(DEVICE_NAME);
+ pServer = BLEDevice::createServer();
+ pServer->setCallbacks(new MyServerCallbacks());
+
+ init_service();
+ init_beacon();
+
+ Serial.println("iBeacon + service defined and advertising!");
+}
+
+void loop() {
+ if (deviceConnected) {
+ Serial.printf("*** NOTIFY: %d ***\n", value);
+ pCharacteristic->setValue(&value, 1);
+ pCharacteristic->notify();
+ value++;
+ }
+ delay(2000);
+}