BLEBeaconScan / BLEBeaconScan.ino /
Yanik Cawidrone Added sources
669f3ab 5 years ago
1 contributor
80 lines | 2.835kb
/*
   Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
   Ported to Arduino ESP32 by Evandro Copercini
*/

#include <Arduino.h>
#include <sstream>

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"

#include "serial.h"

class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
{
    void onResult(BLEAdvertisedDevice advertisedDevice)
    {
      uint8_t process_entry = 0;
      if( true == gNoFilter ) {
        process_entry = 1;
      } else if( 0 == strncmp( advertisedDevice.getAddress().toString().c_str(), gFilter, strlen(gFilter) ) ) {
        process_entry = 1;
      }
      if(0 != process_entry) {
        Serial.printf("MAC Address      : %s\r\n", advertisedDevice.getAddress().toString().c_str());
        {
          uint8_t* mdp = (uint8_t*)advertisedDevice.getPayload();
          char *pHex = BLEUtils::buildHexData(nullptr, mdp, advertisedDevice.getPayloadLength());
          Serial.printf("Payload          : %s\r\n",pHex);
          free(pHex);
        }
        if (advertisedDevice.haveManufacturerData()) {
          std::string md = advertisedDevice.getManufacturerData();
          uint8_t* mdp = (uint8_t*)advertisedDevice.getManufacturerData().data();
          char *pHex = BLEUtils::buildHexData(nullptr, mdp, md.length());
          Serial.printf("ManufacturerData : %s\r\n", pHex);
          free(pHex);
        }
        if (advertisedDevice.haveServiceUUID()) {
          Serial.printf("Service UUID     : %s\r\n", advertisedDevice.getServiceUUID().toString().c_str());
        }
        Serial.printf("--------------------------------------------------\r\n");
      }
      pollSerial();
    }
};

void setup()
{
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
  Serial.begin(115200);
  Serial.println("ESP32 BLE Scanner");
  BLEDevice::init("");
}

void loop()
{
  // put your main code here, to run repeatedly:
  BLEScan *pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(gInterval);
  pBLEScan->setWindow(gWindow);
  Serial.printf("Start BLE scan for %d seconds...\r\n", gScanTime);
  Serial.printf("setInterval %d\r\n", gInterval);
  Serial.printf("setWindow %d\r\n", gWindow);
  if( 0 != strcmp(gFilter,"none")) {
    Serial.printf("Filter on [%s]...\r\n", gFilter);
  } else {
    Serial.printf("No Filter\r\n");
  }
  BLEScanResults foundDevices = pBLEScan->start(gScanTime);

  pollSerial();
}