MeshTalos-Client/managed_components/espressif__arduino-esp32/libraries/BLE/src/BLEAdvertising.h
2025-12-03 14:20:11 +08:00

258 lines
9.7 KiB
C++

/*
* BLEAdvertising.h
*
* Created on: Jun 21, 2017
* Author: kolban
*
* Modified on: Feb 18, 2025
* Author: lucasssvaz (based on kolban's and h2zero's work)
* Description: Added support for NimBLE
*/
#ifndef COMPONENTS_CPP_UTILS_BLEADVERTISING_H_
#define COMPONENTS_CPP_UTILS_BLEADVERTISING_H_
#include "soc/soc_caps.h"
#include "sdkconfig.h"
#if defined(SOC_BLE_SUPPORTED) || defined(CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE)
#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)
/***************************************************************************
* Common includes *
***************************************************************************/
#include "BLEUUID.h"
#include <vector>
#include "RTOS.h"
#include "BLEUtils.h"
/***************************************************************************
* Bluedroid includes *
***************************************************************************/
#if defined(CONFIG_BLUEDROID_ENABLED)
#include <esp_gap_ble_api.h>
#endif
/***************************************************************************
* NimBLE includes and definitions *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
#include <host/ble_gap.h>
#include <services/gap/ble_svc_gap.h>
#include <host/ble_hs_adv.h>
#define ESP_BLE_ADV_DATA_LEN_MAX BLE_HS_ADV_MAX_SZ
#define ESP_BLE_ADV_FLAG_LIMIT_DISC (0x01 << 0)
#define ESP_BLE_ADV_FLAG_GEN_DISC (0x01 << 1)
#define ESP_BLE_ADV_FLAG_BREDR_NOT_SPT (0x01 << 2)
#define ESP_BLE_ADV_FLAG_DMT_CONTROLLER_SPT (0x01 << 3)
#define ESP_BLE_ADV_FLAG_DMT_HOST_SPT (0x01 << 4)
#define ESP_BLE_ADV_FLAG_NON_LIMIT_DISC (0x00)
#endif /* CONFIG_NIMBLE_ENABLED */
/***************************************************************************
* NimBLE types *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
typedef enum {
ESP_BLE_AD_TYPE_FLAG = 0x01,
ESP_BLE_AD_TYPE_16SRV_PART = 0x02,
ESP_BLE_AD_TYPE_16SRV_CMPL = 0x03,
ESP_BLE_AD_TYPE_32SRV_PART = 0x04,
ESP_BLE_AD_TYPE_32SRV_CMPL = 0x05,
ESP_BLE_AD_TYPE_128SRV_PART = 0x06,
ESP_BLE_AD_TYPE_128SRV_CMPL = 0x07,
ESP_BLE_AD_TYPE_NAME_SHORT = 0x08,
ESP_BLE_AD_TYPE_NAME_CMPL = 0x09,
ESP_BLE_AD_TYPE_TX_PWR = 0x0A,
ESP_BLE_AD_TYPE_DEV_CLASS = 0x0D,
ESP_BLE_AD_TYPE_SM_TK = 0x10,
ESP_BLE_AD_TYPE_SM_OOB_FLAG = 0x11,
ESP_BLE_AD_TYPE_INT_RANGE = 0x12,
ESP_BLE_AD_TYPE_SOL_SRV_UUID = 0x14,
ESP_BLE_AD_TYPE_128SOL_SRV_UUID = 0x15,
ESP_BLE_AD_TYPE_SERVICE_DATA = 0x16,
ESP_BLE_AD_TYPE_PUBLIC_TARGET = 0x17,
ESP_BLE_AD_TYPE_RANDOM_TARGET = 0x18,
ESP_BLE_AD_TYPE_APPEARANCE = 0x19,
ESP_BLE_AD_TYPE_ADV_INT = 0x1A,
ESP_BLE_AD_TYPE_LE_DEV_ADDR = 0x1b,
ESP_BLE_AD_TYPE_LE_ROLE = 0x1c,
ESP_BLE_AD_TYPE_SPAIR_C256 = 0x1d,
ESP_BLE_AD_TYPE_SPAIR_R256 = 0x1e,
ESP_BLE_AD_TYPE_32SOL_SRV_UUID = 0x1f,
ESP_BLE_AD_TYPE_32SERVICE_DATA = 0x20,
ESP_BLE_AD_TYPE_128SERVICE_DATA = 0x21,
ESP_BLE_AD_TYPE_LE_SECURE_CONFIRM = 0x22,
ESP_BLE_AD_TYPE_LE_SECURE_RANDOM = 0x23,
ESP_BLE_AD_TYPE_URI = 0x24,
ESP_BLE_AD_TYPE_INDOOR_POSITION = 0x25,
ESP_BLE_AD_TYPE_TRANS_DISC_DATA = 0x26,
ESP_BLE_AD_TYPE_LE_SUPPORT_FEATURE = 0x27,
ESP_BLE_AD_TYPE_CHAN_MAP_UPDATE = 0x28,
ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE = 0xFF,
} esp_ble_adv_data_type;
#endif
/**
* @brief Advertisement data set by the programmer to be published by the %BLE server.
*/
class BLEAdvertisementData {
public:
/***************************************************************************
* Common public declarations *
***************************************************************************/
void setAppearance(uint16_t appearance);
void setCompleteServices(BLEUUID uuid);
void setFlags(uint8_t);
void setManufacturerData(String data);
void setName(String name);
void setPartialServices(BLEUUID uuid);
void setServiceData(BLEUUID uuid, String data);
void setShortName(String name);
void setPreferredParams(uint16_t min, uint16_t max);
void addTxPower();
void addData(String data);
void addData(char *data, size_t length);
String getPayload();
private:
friend class BLEAdvertising;
/***************************************************************************
* Common private declarations *
***************************************************************************/
String m_payload;
};
/**
* @brief Perform and manage %BLE advertising.
*/
class BLEAdvertising {
public:
/***************************************************************************
* Common public declarations *
***************************************************************************/
BLEAdvertising();
void addServiceUUID(BLEUUID serviceUUID);
void addServiceUUID(const char *serviceUUID);
bool removeServiceUUID(int index);
bool removeServiceUUID(BLEUUID serviceUUID);
bool removeServiceUUID(const char *serviceUUID);
bool stop();
void reset();
void setAppearance(uint16_t appearance);
void setAdvertisementType(uint8_t adv_type);
void setMaxInterval(uint16_t maxinterval);
void setMinInterval(uint16_t mininterval);
bool setAdvertisementData(BLEAdvertisementData &advertisementData);
void setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly);
bool setScanResponseData(BLEAdvertisementData &advertisementData);
void setMinPreferred(uint16_t);
void setMaxPreferred(uint16_t);
void setScanResponse(bool);
/***************************************************************************
* Bluedroid public declarations *
***************************************************************************/
#if defined(CONFIG_BLUEDROID_ENABLED)
void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
bool setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map);
void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
bool start();
#endif
/***************************************************************************
* NimBLE public declarations *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
void setName(String name);
void addTxPower();
void advCompleteCB();
bool isAdvertising();
void onHostSync();
bool start(uint32_t duration = 0, void (*advCompleteCB)(BLEAdvertising *pAdv) = nullptr);
static int handleGAPEvent(ble_gap_event *event, void *arg);
#endif
private:
/***************************************************************************
* Common private properties *
***************************************************************************/
std::vector<BLEUUID> m_serviceUUIDs;
bool m_customAdvData = false;
bool m_customScanResponseData = false;
FreeRTOS::Semaphore m_semaphoreSetAdv = FreeRTOS::Semaphore("startAdvert");
bool m_scanResp = true;
/***************************************************************************
* Bluedroid private properties *
***************************************************************************/
#if defined(CONFIG_BLUEDROID_ENABLED)
esp_ble_adv_data_t m_advData;
esp_ble_adv_data_t m_scanRespData;
esp_ble_adv_params_t m_advParams;
#endif
/***************************************************************************
* NimBLE private properties *
***************************************************************************/
#if defined(CONFIG_NIMBLE_ENABLED)
ble_hs_adv_fields m_advData;
ble_hs_adv_fields m_scanData;
ble_gap_adv_params m_advParams;
bool m_advDataSet;
void (*m_advCompCB)(BLEAdvertising *pAdv);
uint8_t m_slaveItvl[4];
uint32_t m_duration;
String m_name;
#endif
};
/***************************************************************************
* Bluedroid 5.0 specific classes *
***************************************************************************/
#if defined(SOC_BLE_50_SUPPORTED) && defined(CONFIG_BLUEDROID_ENABLED)
class BLEMultiAdvertising {
public:
BLEMultiAdvertising(uint8_t num = 1);
~BLEMultiAdvertising() {}
bool setAdvertisingData(uint8_t instance, uint16_t length, const uint8_t *data);
bool setScanRspData(uint8_t instance, uint16_t length, const uint8_t *data);
bool start();
bool start(uint8_t num, uint8_t from);
void setDuration(uint8_t instance, int duration = 0, int max_events = 0);
bool setInstanceAddress(uint8_t instance, uint8_t *rand_addr);
bool stop(uint8_t num_adv, const uint8_t *ext_adv_inst);
bool remove(uint8_t instance);
bool clear();
bool setPeriodicAdvertisingData(uint8_t instance, uint16_t length, const uint8_t *data);
bool startPeriodicAdvertising(uint8_t instance);
bool setAdvertisingParams(uint8_t instance, const esp_ble_gap_ext_adv_params_t *params);
bool setPeriodicAdvertisingParams(uint8_t instance, const esp_ble_gap_periodic_adv_params_t *params);
private:
esp_ble_gap_ext_adv_params_t *params_arrays;
esp_ble_gap_ext_adv_t *ext_adv;
uint8_t count;
};
#endif
#endif /* CONFIG_BLUEDROID_ENABLED || CONFIG_NIMBLE_ENABLED */
#endif /* SOC_BLE_SUPPORTED || CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE */
#endif /* COMPONENTS_CPP_UTILS_BLEADVERTISING_H_ */