2

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

moaz
  • 19
  • 4
  • 1
    I suggest you break down your problem into a something simpler to find the source of the problem. I suggest you eliminate the characteristic write temporarily. Try replacing your code with (a) something that just emits just iBeacon or (b) just Eddystone. Once both of these work, then (c) add code that switches from one to the other after a ten second delay. Does this work? – davidgyoung Sep 21 '22 at 14:32

0 Answers0