I want to make esp32 beacon that work both as ibeacon and eddystone URL beacon

326 views Asked by At

Here is my code in which i want to make esp32 to advertise both as ibeacon and eddystone URL. In start it will act as a Ibeacon but when i write URL text from nrf connect app after connection URL beacon function is called and advertisement data changes to URL format from setBeacon() method.

 #include "sys/time.h"
    
    #include "BLEDevice.h"
    
    #include "BLEUtils.h"
    
    #include "BLEServer.h"
    
    #include "BLEBeacon.h"
    
    #include "esp_sleep.h"
    // See the following for generating UUIDs:
    // https://www.uuidgenerator.net/
    #define GPIO_DEEP_SLEEP_DURATION 10  // sleep 4 seconds and then wake up
    RTC_DATA_ATTR static time_t last;        // remember last boot in RTC Memory
    RTC_DATA_ATTR static uint32_t bootcount; 
      uint16_t beconUUID = 0xFEAA;
      #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
    BLEAdvertising *pAdvertising;
    struct timeval now;
    
    const char turnIbeacon ='IBeacon';
    const char turnURL ='URL';
     BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
    
      BLEAdvertisementData oScanResponseData = BLEAdvertisementData();
    
    void setBeacon2() {
       Serial.println("Function2 is called");
    
    
      BLEBeacon oBeacon = BLEBeacon();
    
      oBeacon.setManufacturerId(0x4C00); // fake Apple 0x004C LSB (ENDIAN_CHANGE_U16!)
    
      oBeacon.setProximityUUID(BLEUUID(beconUUID));
    
      oBeacon.setMajor((bootcount & 0xFFFF0000) >> 16);
    
      oBeacon.setMinor(bootcount & 0xFFFF);
    
     
    
      oAdvertisementData.setFlags(0x04); // BR_EDR_NOT_SUPPORTED 0x04
    
    
      std::string strServiceData = "";
    
    
      strServiceData += (char)26;     // Len
    
      strServiceData += (char)0xFF;   // Type
    
      strServiceData += oBeacon.getData();
    
      oAdvertisementData.addData(strServiceData);
    
    
      pAdvertising->setAdvertisementData(oAdvertisementData);
    
      pAdvertising->setScanResponseData(oScanResponseData);
    
    }
    void setBeacon() {
      char beacon_data[22];
    
       Serial.println("Function is called");
      
      
    
    
        beacon_data[0] = 0x10;  // Eddystone Frame Type (Eddystone-URL)
        beacon_data[1] = 0x20;  // Beacons TX power at 0m
        beacon_data[2] = 0x03;  // URL Scheme 'https://'
        beacon_data[3] = 'y';  // URL add  1
        beacon_data[4] = 'o';  // URL add  2
        beacon_data[5] = 'u';  // URL add  3
        beacon_data[6] = 't';  // URL add  4
        beacon_data[7] = 'u';  // URL add  5
        beacon_data[8] = 'b';  // URL add  6
        beacon_data[9] = 'e';  // URL add  7
        beacon_data[10] = '.';  // URL add  8
        beacon_data[11] = 'c';  // URL add  9
        beacon_data[12] = 'o';  // URL add 10
        beacon_data[13] = 'm';  // URL add 11
        
      
      oAdvertisementData.setServiceData(BLEUUID(beconUUID), std::string(beacon_data, 14));
      
    }
    
    class MyCallbacks: public BLECharacteristicCallbacks
    {
      void onWrite(BLECharacteristic *pCharacteristic)
      {
        std::string value = pCharacteristic->getValue();
    
        if (value.length() > 0)
        {
          Serial.println("*********");
          Serial.print("New value: ");
          for (int i = 0; i < value.length(); i++)
          {
            Serial.print(value[i]);
    //              if(value[i] == turnON)
    //  {
    //setBeacon();
    //  }
    //  
      /* If received Character is 0, then turn OFF the LED */
      if(value[i] == turnIbeacon)
      {
    setBeacon();
    
      }
         
          }
      Serial.println();
          Serial.println("*********");
        }
      }
    };
    
    void setup()
    {
      Serial.begin(115200);
       gettimeofday(&now, NULL);
    
      Serial.printf("start ESP32 %d\n",bootcount++);
    
      Serial.printf("deep sleep (%lds since last reset, %lds since last boot)\n",now.tv_sec,now.tv_sec-last);
    
      last = now.tv_sec;
    
     
      BLEDevice::init("ESP32-BLE-Server");
      BLEServer *pServer = BLEDevice::createServer();
      pAdvertising = BLEDevice::getAdvertising();
      BLEDevice::startAdvertising();
      setBeacon2();
    
      BLEService *pService = pServer->createService(beconUUID);
    
      BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                             CHARACTERISTIC_UUID,
                                            BLECharacteristic::PROPERTY_WRITE
                                           );
    
      pCharacteristic->setCallbacks(new MyCallbacks());
    
      pCharacteristic->setValue("Hello World");
      pService->start();
    
      BLEAdvertising *pAdvertising = pServer->getAdvertising();
      pAdvertising->start();
    }
    
    void loop()
    {
      delay(2000);
    }

In initial run i was able to write something on esp32 using nrf connect app but now that write sign is not showing. And after connect when start i re-scan my device will disappears.

Note: Everything is running perfectly when i am uploading individual code of ibeacon and eddystone url on esp32

0

There are 0 answers