1 contributor
/*
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();
}