15#include <esp_bt_defs.h>
16#include <esp_gap_ble_api.h>
17#include <esp_gattc_api.h>
19#include <freertos/FreeRTOS.h>
20#include <freertos/semphr.h>
26#ifdef USE_OTA_STATE_LISTENER
32using namespace esp32_ble;
41#ifdef USE_ESP32_BLE_UUID
48#ifdef USE_ESP32_BLE_DEVICE
78 const char *
address_str_to(std::span<char, MAC_ADDRESS_PRETTY_BUFFER_SIZE> buf)
const {
134class ESP32BLETracker;
139#ifdef USE_ESP32_BLE_DEVICE
142 virtual bool parse_devices(
const BLEScanResult *scan_results,
size_t count) {
return false; };
235 esp_ble_gattc_cb_param_t *param) = 0;
236 virtual void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) = 0;
267 if (this->tracker_state_version_ !=
nullptr) {
268 (*this->tracker_state_version_)++;
283 uint8_t *tracker_state_version_{
nullptr};
291#ifdef USE_OTA_STATE_LISTENER
304 void setup()
override;
308 void loop()
override;
314#ifdef USE_ESP32_BLE_DEVICE
322 esp_ble_gattc_cb_param_t *param)
override;
323 void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
override;
327#ifdef USE_OTA_STATE_LISTENER
363#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
370#ifdef ESPHOME_ESP32_BLE_TRACKER_CLIENT_COUNT
371 for (
auto *client : this->
clients_) {
372 switch (client->state()) {
391#ifdef ESPHOME_ESP32_BLE_TRACKER_LISTENER_COUNT
394#ifdef ESPHOME_ESP32_BLE_TRACKER_CLIENT_COUNT
398#ifdef USE_ESP32_BLE_DEVICE
435#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
Helper class to easily give an object a parent of type T.
Minimal static vector - saves memory by avoiding std::vector overhead.
static ESPBTUUID from_raw_reversed(const uint8_t *data)
Listener interface for BLE scanner state changes.
virtual void on_scanner_state(ScannerState state)=0
void try_promote_discovered_clients_()
Try to promote discovered clients to ready to connect.
std::vector< uint64_t > already_discovered_
Vector of addresses that have already been printed in print_bt_device_info.
void set_scan_active(bool scan_active)
bool get_scan_active() const
uint8_t state_version_
Version counter for loop() fast-path optimization.
StaticVector< ESPBTClient *, ESPHOME_ESP32_BLE_TRACKER_CLIENT_COUNT > clients_
uint32_t scan_start_time_
uint8_t scan_start_fail_count_
void gap_scan_stop_complete_(const esp_ble_gap_cb_param_t::ble_scan_stop_cmpl_evt_param ¶m)
Called when a ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT event is received.
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) override
ClientStateCounts count_client_states_() const
Count clients in each state.
ClientStateCounts client_state_counts_
uint8_t last_processed_version_
Last state_version_ value when loop() did full processing.
float get_setup_priority() const override
void register_client(ESPBTClient *client)
bool parse_advertisements_
std::vector< BLEScannerStateListener * > scanner_state_listeners_
void dump_config() override
void recalculate_advertisement_parser_types()
ScanTimeoutState scan_timeout_state_
ScannerState get_scanner_state() const
ScannerState scanner_state_
esp_ble_scan_params_t scan_params_
A structure holding the ESP BLE scan parameters.
StaticVector< ESPBTDeviceListener *, ESPHOME_ESP32_BLE_TRACKER_LISTENER_COUNT > listeners_
void register_listener(ESPBTDeviceListener *listener)
uint32_t scan_timeout_ms_
Precomputed timeout value: scan_duration_ * 2000.
void update_coex_preference_(bool force_ble)
Update BLE coexistence preference.
const char * scanner_state_to_string_(ScannerState state) const
Convert scanner state enum to string for logging.
void gap_scan_set_param_complete_(const esp_ble_gap_cb_param_t::ble_scan_param_cmpl_evt_param ¶m)
Called when a ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT event is received.
uint32_t scan_duration_
The interval in seconds to perform scans.
void setup() override
Setup the FreeRTOS task and the Bluetooth stack.
esp_bt_status_t scan_start_failed_
void handle_scanner_failure_()
Handle scanner failure states.
esp_bt_status_t scan_set_param_failed_
void cleanup_scan_state_(bool is_stop_complete)
Common cleanup logic when transitioning scanner to IDLE state.
void ble_before_disabled_event_handler() override
void set_scanner_state_(ScannerState state)
Called to set the scanner state. Will also call callbacks to let listeners know when state is changed...
void set_scan_continuous(bool scan_continuous)
void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override
void print_bt_device_info(const ESPBTDevice &device)
void set_scan_duration(uint32_t scan_duration)
void gap_scan_event_handler(const BLEScanResult &scan_result) override
void set_scan_interval(uint32_t scan_interval)
void add_scanner_state_listener(BLEScannerStateListener *listener)
Add a listener for scanner state changes.
void process_scan_result_(const BLEScanResult &scan_result)
Process a single scan result immediately.
void gap_scan_start_complete_(const esp_ble_gap_cb_param_t::ble_scan_start_cmpl_evt_param ¶m)
Called when a ESP_GAP_BLE_SCAN_START_COMPLETE_EVT event is received.
void log_unexpected_state_(const char *operation, ScannerState expected_state) const
Log an unexpected scanner state.
void on_ota_global_state(ota::OTAState state, float progress, uint8_t error, ota::OTAComponent *comp) override
void gap_scan_result_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param ¶m)
Called when a ESP_GAP_BLE_SCAN_RESULT_EVT event is received.
void set_scan_window(uint32_t scan_window)
void start_scan_(bool first)
Start a single scan by setting up the parameters and doing some esp-idf calls.
uint8_t proximity_uuid[16]
int8_t get_signal_power()
static optional< ESPBLEiBeacon > from_manufacturer_data(const ServiceData &data)
struct esphome::esp32_ble_tracker::ESPBLEiBeacon::@83 beacon_data_
Base class for BLE GATT clients that connect to remote devices.
void cancel_pending_disconnect()
ClientState state() const
void set_tracker_state_version(uint8_t *version)
Called by ESP32BLETracker::register_client() to enable state change notifications.
virtual void disconnect()=0
virtual void set_state(ClientState st)
Set the client state with IDLE handling (clears want_disconnect_).
bool disconnect_pending() const
virtual void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)=0
virtual bool gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)=0
void set_state_internal_(ClientState st)
Set state without IDLE handling - use for direct state transitions.
const BLEScanResult & get_scan_result() const
uint64_t address_uint64() const
esp_ble_addr_type_t get_address_type() const
esp_ble_addr_type_t address_type_
const uint8_t * address() const
optional< uint16_t > appearance_
void parse_adv_(const uint8_t *payload, uint8_t len)
void parse_scan_rst(const BLEScanResult &scan_result)
optional< uint8_t > ad_flag_
std::vector< ServiceData > manufacturer_datas_
const char * address_str_to(std::span< char, MAC_ADDRESS_PRETTY_BUFFER_SIZE > buf) const
Format MAC address into provided buffer, returns pointer to buffer for convenience.
const optional< uint8_t > & get_ad_flag() const
std::vector< ESPBTUUID > service_uuids_
const std::vector< int8_t > & get_tx_powers() const
const std::vector< ServiceData > & get_service_datas() const
const std::string & get_name() const
const optional< uint16_t > & get_appearance() const
std::string address_str() const
const std::vector< ServiceData > & get_manufacturer_datas() const
bool resolve_irk(const uint8_t *irk) const
const std::vector< ESPBTUUID > & get_service_uuids() const
std::vector< int8_t > tx_powers_
const BLEScanResult * scan_result_
std::vector< ServiceData > service_datas_
optional< ESPBLEiBeacon > get_ibeacon() const
virtual void on_scan_end()
virtual AdvertisementParserType get_advertisement_parser_type()
void set_parent(ESP32BLETracker *parent)
virtual bool parse_device(const ESPBTDevice &device)=0
ESP32BLETracker * parent_
virtual bool parse_devices(const BLEScanResult *scan_results, size_t count)
Listener interface for global OTA state changes (includes OTA component pointer).
ESP32BLETracker * global_esp32_ble_tracker
std::vector< uint8_t > adv_data_t
const char * client_state_to_string(ClientState state)
char * format_mac_addr_upper(const uint8_t *mac, char *output)
Format MAC address as XX:XX:XX:XX:XX:XX (uppercase, colon separators)
bool operator==(const ClientStateCounts &other) const
bool operator!=(const ClientStateCounts &other) const