Hello, I´m testing my new ESP32 dev board. I´m trying of to modify BLE Scan example... This sketch return a list of devices avaibles... I would like launch a action (pinout) if ESP32 detect a concret Device. I have tryed some ways but all times return errors... Someone could help me for fixing it?
This is the code:
/*
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 <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
int scanTime = 30; //In seconds
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
}
};
void setup() {
Serial.begin(115200);
Serial.println("Scanning...");
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
BLEScanResults foundDevices = pBLEScan->start(scanTime);
Serial.print("Devices found: ");
char X = (foundDevices.getCount());
Serial.println(X);
//Serial.println(foundDevices.getCount());
if (X == "Parking"){
Serial.print("we found Parking"");
}else{
Serial.print("Don´t match");
}
// put your main code here, to run repeatedly:
}
void loop() {
delay(2000);
}
You need to look at the definition of BLEScanResults to see how the results are stored. For example, BLEScanResults .getCount() returns an int, not a char, and BLEScanResults .getDevice(uint32_t i) returns a device from the list. You then have to look at the definition of BLEAdvertisedDevice to see what attribute you want to search for. For this example, I chose 'name'.
Serial.print("Devices found: ");
int deviceCount = foundDevices.getCount();
Serial.println(deviceCount);
for (uint32_t i = 0; i < deviceCount; i++)
{
BLEAdvertisedDevice device = foundDevices.getDevice(i);
if (strcmp(device.getName(), "Parking") == 0)
{
Serial.print("We found a device named \"Parking\"");
}
}
int deviceCount = foundDevices.getCount();
Serial.println(deviceCount);
for (uint32_t i = 0; i < deviceCount; i++)
{
BLEAdvertisedDevice device = foundDevices.getDevice(i);
So, there can be a negative number of devices, or 0 or some positive value up to 32767. At least, that's the range of values that fit in an int.
Then, you iterate through devices from 0 up to 4294967295. That seems useless.
Why are you using int for the number of devices and then unsigned long for the index?
johnwasser:
You need to look at the definition of BLEScanResults to see how the results are stored. For example, BLEScanResults .getCount() returns an int, not a char, and BLEScanResults .getDevice(uint32_t i) returns a device from the list. You then have to look at the definition of BLEAdvertisedDevice to see what attribute you want to search for. For this example, I chose 'name'.
Serial.print("Devices found: ");
int deviceCount = foundDevices.getCount();
Serial.println(deviceCount);
for (uint32_t i = 0; i < deviceCount; i++)
{
BLEAdvertisedDevice device = foundDevices.getDevice(i);
if (strcmp(device.getName(), "Parking") == 0)
{
Serial.print("We found a device named "Parking"");
}
}
As I said in reply #7: "Have you tried Serial.print(device.getName()); ?"
It looks like ".toString()" returns a type 'std::__cxx11::string' and not a type 'String'. Since device.getName() returns a 'char *' you should be able to print that. There are probably other methods of 'BLEAdvertisedDevice' to get other attributes of the device if you want to print more.