Как получить продолжительность сканирования менее 1 секунды с помощью Arduino BLE?

esp32 ble cpp

Я хочу непрерывно сканировать другие устройства Bluetooth с помощью моего ESP32 с использованием BLE. Метод scan принимает только целые числа больше 0, например scan->start(1, false). Однако я хочу, чтобы результаты были более «отзывчивыми». и продолжительность сканирования в 1 секунду слишком велика. Это мой пример кода:

    #include <Arduino.h>
    #include <BLEAdvertisedDevice.h>
    #include <BLEDevice.h>
    #include <BLEScan.h>
    #include <string> 
    #include <iostream>
    
    const int PIN = 2;
    const int CUTOFF = -40;
    BLEScan* scan;
    
    #define SERVICE_UUID "f5aeb701-4395-4387-b8d4-e1f542b05151"
    #define CHARACTERISTIC_UUID "b2bd617f-6f78-45e7-bfdd-3edf29a5661a"
    
    void setup() {
      pinMode(PIN, OUTPUT);
      BLEDevice::init("ESP32 GrooveBrick");
      Serial.begin(9600); 
    
      BLEServer *pServer = BLEDevice::createServer();
      BLEService *pService = pServer->createService(SERVICE_UUID);
      BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                             CHARACTERISTIC_UUID,
                                             BLECharacteristic::PROPERTY_READ |
                                             BLECharacteristic::PROPERTY_WRITE
                                           );
    
      pService->start();
      BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
      pAdvertising->addServiceUUID(SERVICE_UUID);
      pAdvertising->setScanResponse(true);
      pAdvertising->setMinPreferred(0x06);  // функции, которые помогают решить проблему с подключением iPhone
      pAdvertising->setMinPreferred(0x12);
    
      scan = BLEDevice::getScan();
      scan->setActiveScan(true);
      /*!< Scan interval. This is defined as the time interval from
      when the Controller started its last LE scan until it begins the subsequent LE scan.
      Range: 0x0004 to 0x4000 Default: 0x0010 (10 ms)
      Time = N * 0.625 msec
      Time Range: 2.5 msec to 10.24 seconds*/
      scan->setInterval(100); //интервал (как часто происходит сканирование)
      /*!< Scan window. The duration of the LE scan. LE_Scan_Window
      shall be less than or equal to LE_Scan_Interval
      Range: 0x0004 to 0x4000 Default: 0x0010 (10 ms)
      Time = N * 0.625 msec
      Time Range: 2.5 msec to 10240 msec */
      scan->setWindow(99);  // окно (длина сканирования) должно быть <= интервалом
    
      BLEDevice::startAdvertising();
    }
    
    void loop() {
    
      BLEScanResults results = scan->start(1, true);
      int best = CUTOFF;
    
      std::cout << "Scanning!" << "\n";
    
      for (int i = 0; i < results.getCount(); i++) {
        BLEAdvertisedDevice device = results.getDevice(i);
        std::cout << "Found BT-device: " << device.getName() << " RSSI: " << std::to_string(device.getRSSI()) << "\n";
        int rssi = device.getRSSI();
        if (rssi > best) {
          best = rssi;
        }
      }
      digitalWrite(PIN, best > CUTOFF ? HIGH : LOW);
      scan->clearResults();   // удаляем результаты из буфера BLEScan, чтобы освободить память
    
    }

, 👍0

Обсуждение

Вы когда-нибудь решали эту проблему?, @NobbysNutz

Привет, IIRC, я так и не решил эту проблему.. извини., @Philipp


1 ответ


2

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

добавьте это в свой код инициализации:

BLEDevice::setCustomGapHandler(custom_handler);

и это перед этим:

static void it_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
    switch (event)
    {
        case ESP_GAP_BLE_SCAN_RESULT_EVT:
            if (param->scan_rst.search_evt == ESP_GAP_SEARCH_INQ_RES_EVT)
            {
                // Это событие срабатывает каждый раз, когда обнаруживается новое устройство, и содержит объявленные данные.
                // Нам следует избегать обработки или печати чего-либо здесь, чтобы избежать перегрузки оборудования
                // log_i("ESP_GAP_BLE_SCAN_RESULT_EVT");

                if (param->scan_rst.ble_adv != NULL)
                {
                    //это гарантирует наличие данных для обработки
                }
            }
            break;
        default:
            // log_i("Событие %d необработано", event);
            break;
    }
}
,