Найдено устройство сканера BLE 0

Пожалуйста, помогите мне, я попробовал сканирование BLE, но когда я вызываю класс MyAdvertisedDeviceCallbacks, результат обнаруженного устройства равен 0, но когда я не вызываю класс, обнаруженное устройство показывает результат 3. Что-то не так с моим кодом? Я использую ESP32 Dev Kit V1

Вот мой код:

      /*
   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 = 5; //In seconds
BLEScan* pBLEScan;

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("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
}

void loop() {
  // put your main code here, to run repeatedly:
  BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
  Serial.print("Devices found: ");
  Serial.println(foundDevices.getCount());
  Serial.println("Scan done!");
  pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
  delay(2000);
}

И вот результат:

      Advertised Device: Name: honor Band 3-f15, Address: 34:12:f9:03:1f:15, appearance: 0, manufacturer data: 7d02010300ffcc, serviceUUID: 00001812-0000-1000-8000-00805f9b34fb, txPower: 4 
Advertised Device: Name: honor Band 3-f15, Address: 34:12:f9:03:1f:15, appearance: 0, manufacturer data: 7d02010300ffcc, serviceUUID: 00001812-0000-1000-8000-00805f9b34fb, txPower: 4 
Advertised Device: Name: Charge HR, Address: f5:02:71:f9:46:a7, serviceUUID: adabfb00-6e7d-4601-bda2-bffaa68956ba, txPower: -6 
Advertised Device: Name: honor Band 3-f15, Address: 34:12:f9:03:1f:15, appearance: 0, manufacturer data: 7d02010300ffcc, serviceUUID: 00001812-0000-1000-8000-00805f9b34fb, txPower: 4 
Advertised Device: Name: honor Band 3-f15, Address: 34:12:f9:03:1f:15, appearance: 0, manufacturer data: 7d02010300ffcc, serviceUUID: 00001812-0000-1000-8000-00805f9b34fb, txPower: 4 
Devices found: 0
Scan done!

3 ответа

Вы не сказали, какую версию кода ESP32 Arduino вы используете, но что-то не так с кодом сканирования BLE в ESP32 Arduino BLE версии 1.0.5 и недавно выпущенной версии 1.0.6. В более ранней версии 1.0.4 результаты сканирования сообщают о каждом устройстве только один раз за сканирование и правильно сообщают о количестве найденных уникальных устройств. В этих более поздних версиях одни и те же устройства неверно сообщаются несколько раз во время сканирования, а общее количество устройств равно нулю. Похоже, это ошибка в последних версиях кода сканирования BLE, а не в вашем примерном скетче.

Основываясь на полученных вами результатах, он должен был показать только два уникальных рекламируемых устройства и иметь количество устройств: 2.

В качестве продолжения, глядя на недавние изменения в файле библиотеки BLEScan.cpp на сайте github ESP32 Arduino, выясняется, что источником изменений в операции сканирования BLE были 2 изменения, внесенные поздно (октябрь/ноябрь) в 2020 г.

  1. Отображение найденных устройств BLE несколько раз: это было связано с изменением конструктора BLEScan для изменения параметра scan_duplicate на используемые параметры сканирования. При этом не учитывается тот факт, что при вызове BLEScan.setAdvertisedDeviceCallbacks(), wantDuplicatesпараметр явно игнорируется.

  2. Количество устройств всегда равно 0: это связано с изменением операции отслеживания результатов сканирования. Очевидным изменением в операции является то, что когда операция сканирования BLE имеет обратные вызовы сканирования пользователя, отслеживание сканируемых устройств отключается (поэтому счетчик всегда равен 0)! Несмотря на то, что это очевидно в исходном коде (об этом говорится в комментарии), это не очевидно для пользователя библиотеки, поскольку в примерах, использующих сканирование BLE, это не упоминается.

Таким образом, то, что вы видите, похоже на то, для чего написан код. Лично я не согласен с этими изменениями в работе и при моем использовании модифицировал библиотеку BLEScan, чтобы она работала так, как она работала до этих двух изменений.

Да, я тоже это вижу. Текущая реализация предполагает, что вы будете обрабатывать все это в своем обратном вызове. Чтобы вернуть его к старому хорошему поведению, вы должны просто открыть (вашу папку arduino) /packages/esp32/hardware/esp32/1.0.6/libraries/BLE/src/BLEScan.cpp

а затем (о строке 124) переместите строку

      m_pAdvertisedDeviceCallbacks->onResult(*advertisedDevice);

после

      if (!m_wantDuplicates && !found) {

(потом можно стереть пустой if)

Тогда у вас будет

      if (!m_wantDuplicates && !found) {
    m_pAdvertisedDeviceCallbacks->onResult(*advertisedDevice); 
    m_scanResults.m_vectorAdvertisedDevices.insert(std::pair<std::string, BLEAdvertisedDevice*>(advertisedAddress.toString(), advertisedDevice));
    shouldDelete = false;
}
Другие вопросы по тегам