2020-03-29 17:44:20 -06:00
|
|
|
/*
|
|
|
|
* NimBLEScan.h
|
|
|
|
*
|
|
|
|
* Created: on Jan 24 2020
|
|
|
|
* Author H2zero
|
2020-05-13 22:03:56 -06:00
|
|
|
*
|
2020-03-29 17:44:20 -06:00
|
|
|
* Originally:
|
|
|
|
*
|
|
|
|
* BLEScan.h
|
|
|
|
*
|
|
|
|
* Created on: Jul 1, 2017
|
|
|
|
* Author: kolban
|
|
|
|
*/
|
|
|
|
#ifndef COMPONENTS_NIMBLE_SCAN_H_
|
|
|
|
#define COMPONENTS_NIMBLE_SCAN_H_
|
|
|
|
|
2020-05-13 22:03:56 -06:00
|
|
|
#include "nimconfig.h"
|
2021-09-06 21:14:43 -06:00
|
|
|
#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER)
|
2020-05-13 22:03:56 -06:00
|
|
|
|
2020-03-29 17:44:20 -06:00
|
|
|
#include "NimBLEAdvertisedDevice.h"
|
2020-06-21 22:07:01 -06:00
|
|
|
#include "NimBLEUtils.h"
|
2020-03-29 17:44:20 -06:00
|
|
|
|
2021-09-06 21:14:43 -06:00
|
|
|
#if defined(CONFIG_NIMBLE_CPP_IDF)
|
2020-03-29 17:44:20 -06:00
|
|
|
#include "host/ble_gap.h"
|
2021-09-06 21:14:43 -06:00
|
|
|
#else
|
|
|
|
#include "nimble/nimble/host/include/host/ble_gap.h"
|
|
|
|
#endif
|
2020-03-29 17:44:20 -06:00
|
|
|
|
2020-05-17 20:21:35 -06:00
|
|
|
#include <vector>
|
2020-03-29 17:44:20 -06:00
|
|
|
|
|
|
|
class NimBLEDevice;
|
|
|
|
class NimBLEScan;
|
|
|
|
class NimBLEAdvertisedDevice;
|
2022-08-27 13:13:27 -06:00
|
|
|
class NimBLEScanCallbacks;
|
2020-05-17 20:21:35 -06:00
|
|
|
class NimBLEAddress;
|
2020-03-29 17:44:20 -06:00
|
|
|
|
|
|
|
/**
|
2020-07-08 19:27:26 -06:00
|
|
|
* @brief A class that contains and operates on the results of a BLE scan.
|
|
|
|
* @details When a scan completes, we have a set of found devices. Each device is described
|
|
|
|
* by a NimBLEAdvertisedDevice object. The number of items in the set is given by
|
2020-03-29 17:44:20 -06:00
|
|
|
* getCount(). We can retrieve a device by calling getDevice() passing in the
|
|
|
|
* index (starting at 0) of the desired device.
|
|
|
|
*/
|
|
|
|
class NimBLEScanResults {
|
|
|
|
public:
|
Add iterators to client remote attributes.
Add iterators for NimBLEScan: NimBLEadvertisedDevice, NimBLEClient: NimBLERemoteService, NimBLERemoteService: NimBLERemoteCharacteristic and NimBLERemoteCharacteristic: NimBLERemoteDescriptor
This is handy e.g. for showing every address of the advertised devices from a scan. To do so, first get a new scan and next:
```
for(auto pAdvertisedDevice: pBLEScan->getResults()) {
Serial.printf("Address is %s\n", std::string(pAdvertisedDevice->getAddress()).c_str());
}
```
Of course any other property of the advertised device can be shown (or looked up, if that is your use case)
Also this is handy e.g. for showing every UUID in a peripheral. To do so, first connect to a peripheral and next:
```
for(auto pService: *pClient) {
Serial.printf("Service UUID is %s\n", std::string(pService->getUUID()).c_str());
for(auto pCharacteristic: *pService) {
Serial.printf("Characteristic UUID is %s\n", std::string(pCharacteristic->getUUID()).c_str());
for(auto pDescriptor: *pCharacteristic) {
Serial.printf("Descriptor UUID is %s\n", std::string(pDescriptor->getUUID()).c_str());
}
}
}
```
Again of course any other property can be shown, or looked up.
2020-05-22 20:13:52 -06:00
|
|
|
void dump();
|
|
|
|
int getCount();
|
|
|
|
NimBLEAdvertisedDevice getDevice(uint32_t i);
|
|
|
|
std::vector<NimBLEAdvertisedDevice*>::iterator begin();
|
|
|
|
std::vector<NimBLEAdvertisedDevice*>::iterator end();
|
|
|
|
NimBLEAdvertisedDevice *getDevice(const NimBLEAddress &address);
|
2020-03-29 17:44:20 -06:00
|
|
|
|
|
|
|
private:
|
|
|
|
friend NimBLEScan;
|
2020-05-17 20:21:35 -06:00
|
|
|
std::vector<NimBLEAdvertisedDevice*> m_advertisedDevicesVector;
|
2020-03-29 17:44:20 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Perform and manage %BLE scans.
|
|
|
|
*
|
|
|
|
* Scanning is associated with a %BLE client that is attempting to locate BLE servers.
|
|
|
|
*/
|
|
|
|
class NimBLEScan {
|
|
|
|
public:
|
2022-08-27 13:13:27 -06:00
|
|
|
bool start(uint32_t duration, bool is_continue = false);
|
2020-07-23 20:18:41 -06:00
|
|
|
bool isScanning();
|
2022-08-27 13:13:27 -06:00
|
|
|
void setScanCallbacks(NimBLEScanCallbacks* pScanCallbacks, bool wantDuplicates = false);
|
2020-03-29 17:44:20 -06:00
|
|
|
void setActiveScan(bool active);
|
|
|
|
void setInterval(uint16_t intervalMSecs);
|
|
|
|
void setWindow(uint16_t windowMSecs);
|
2020-07-23 20:18:41 -06:00
|
|
|
void setDuplicateFilter(bool enabled);
|
|
|
|
void setLimitedOnly(bool enabled);
|
2020-07-01 17:26:44 -06:00
|
|
|
void setFilterPolicy(uint8_t filter);
|
2021-03-31 20:24:57 -06:00
|
|
|
void clearDuplicateCache();
|
2020-06-21 22:07:01 -06:00
|
|
|
bool stop();
|
2020-03-29 17:44:20 -06:00
|
|
|
void clearResults();
|
|
|
|
NimBLEScanResults getResults();
|
2022-08-27 13:13:27 -06:00
|
|
|
NimBLEScanResults getResults(uint32_t duration, bool is_continue = false);
|
2021-01-30 18:27:06 -07:00
|
|
|
void setMaxResults(uint8_t maxResults);
|
2020-05-10 07:21:46 -06:00
|
|
|
void erase(const NimBLEAddress &address);
|
2020-05-13 22:03:56 -06:00
|
|
|
|
|
|
|
|
2020-03-29 17:44:20 -06:00
|
|
|
private:
|
|
|
|
friend class NimBLEDevice;
|
2020-07-28 20:57:33 -06:00
|
|
|
|
|
|
|
NimBLEScan();
|
|
|
|
~NimBLEScan();
|
2022-08-27 13:13:27 -06:00
|
|
|
static int handleGapEvent(ble_gap_event* event, void* arg);
|
|
|
|
void onHostReset();
|
|
|
|
void onHostSync();
|
2020-05-13 22:03:56 -06:00
|
|
|
|
2022-08-27 13:13:27 -06:00
|
|
|
NimBLEScanCallbacks* m_pScanCallbacks;
|
|
|
|
ble_gap_disc_params m_scan_params;
|
|
|
|
bool m_ignoreResults;
|
|
|
|
NimBLEScanResults m_scanResults;
|
|
|
|
uint32_t m_duration;
|
2024-11-10 13:31:37 -07:00
|
|
|
NimBLETaskData *m_pTaskData;
|
2022-08-27 13:13:27 -06:00
|
|
|
uint8_t m_maxResults;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief A callback handler for callbacks associated device scanning.
|
|
|
|
*/
|
|
|
|
class NimBLEScanCallbacks {
|
|
|
|
public:
|
|
|
|
virtual ~NimBLEScanCallbacks() {}
|
2023-04-06 15:56:53 -06:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Called when a new device is discovered, before the scan result is received (if applicable).
|
|
|
|
* @param [in] advertisedDevice The device which was discovered.
|
|
|
|
*/
|
|
|
|
virtual void onDiscovered(NimBLEAdvertisedDevice* advertisedDevice) {};
|
|
|
|
|
2022-08-27 13:13:27 -06:00
|
|
|
/**
|
2023-04-06 15:56:53 -06:00
|
|
|
* @brief Called when a new scan result is complete, including scan response data (if applicable).
|
|
|
|
* @param [in] advertisedDevice The device for which the complete result is available.
|
2022-08-27 13:13:27 -06:00
|
|
|
*/
|
|
|
|
virtual void onResult(NimBLEAdvertisedDevice* advertisedDevice) {};
|
2023-04-06 15:56:53 -06:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Called when a scan operation ends.
|
|
|
|
* @param [in] scanResults The results of the scan that ended.
|
|
|
|
*/
|
2022-08-27 13:13:27 -06:00
|
|
|
virtual void onScanEnd(NimBLEScanResults scanResults) {};
|
2020-03-29 17:44:20 -06:00
|
|
|
};
|
|
|
|
|
2021-09-06 21:14:43 -06:00
|
|
|
#endif /* CONFIG_BT_ENABLED CONFIG_BT_NIMBLE_ROLE_OBSERVER */
|
2020-03-29 17:44:20 -06:00
|
|
|
#endif /* COMPONENTS_NIMBLE_SCAN_H_ */
|