/* 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 #include #include #include #include #include #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(); }