ESPHome 2025.8.0b1
Loading...
Searching...
No Matches
bluetooth_proxy.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_ESP32
4
5#include <array>
6#include <map>
7#include <vector>
8
16
18
19#include <esp_bt.h>
20#include <esp_bt_device.h>
21
23
24static const esp_err_t ESP_GATT_NOT_CONNECTED = -1;
25static const int DONE_SENDING_SERVICES = -2;
26static const int INIT_SENDING_SERVICES = -3;
27
28using namespace esp32_ble_client;
29
30// Legacy versions:
31// Version 1: Initial version without active connections
32// Version 2: Support for active connections
33// Version 3: New connection API
34// Version 4: Pairing support
35// Version 5: Cache clear support
36static const uint32_t LEGACY_ACTIVE_CONNECTIONS_VERSION = 5;
37static const uint32_t LEGACY_PASSIVE_ONLY_VERSION = 1;
38
48
52
54 friend class BluetoothConnection; // Allow connection to update connections_free_response_
55 public:
57#ifdef USE_ESP32_BLE_DEVICE
58 bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
59#endif
60 bool parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) override;
61 void dump_config() override;
62 void setup() override;
63 void loop() override;
66
68 if (this->connection_count_ < BLUETOOTH_PROXY_MAX_CONNECTIONS) {
69 this->connections_[this->connection_count_++] = connection;
70 connection->proxy_ = this;
71 }
72 }
73
81
82 void subscribe_api_connection(api::APIConnection *api_connection, uint32_t flags);
85
86 void send_device_connection(uint64_t address, bool connected, uint16_t mtu = 0, esp_err_t error = ESP_OK);
88 void send_connections_free(api::APIConnection *api_connection);
89 void send_gatt_services_done(uint64_t address);
90 void send_gatt_error(uint64_t address, uint16_t handle, esp_err_t error);
91 void send_device_pairing(uint64_t address, bool paired, esp_err_t error = ESP_OK);
92 void send_device_unpairing(uint64_t address, bool success, esp_err_t error = ESP_OK);
93 void send_device_clear_cache(uint64_t address, bool success, esp_err_t error = ESP_OK);
94
95 void bluetooth_scanner_set_mode(bool active);
96
97 static void uint64_to_bd_addr(uint64_t address, esp_bd_addr_t bd_addr) {
98 bd_addr[0] = (address >> 40) & 0xff;
99 bd_addr[1] = (address >> 32) & 0xff;
100 bd_addr[2] = (address >> 24) & 0xff;
101 bd_addr[3] = (address >> 16) & 0xff;
102 bd_addr[4] = (address >> 8) & 0xff;
103 bd_addr[5] = (address >> 0) & 0xff;
104 }
105
106 void set_active(bool active) { this->active_ = active; }
107 bool has_active() { return this->active_; }
108
109 uint32_t get_legacy_version() const {
110 if (this->active_) {
111 return LEGACY_ACTIVE_CONNECTIONS_VERSION;
112 }
113 return LEGACY_PASSIVE_ONLY_VERSION;
114 }
115
130
132 const uint8_t *mac = esp_bt_dev_get_address();
133 return str_snprintf("%02X:%02X:%02X:%02X:%02X:%02X", 17, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
134 }
135
136 protected:
138
139 BluetoothConnection *get_connection_(uint64_t address, bool reserve);
141 void log_connection_info_(BluetoothConnection *connection, const char *message);
142 void log_not_connected_gatt_(const char *action, const char *type);
143 void handle_gatt_not_connected_(uint64_t address, uint16_t handle, const char *action, const char *type);
144
145 // Memory optimized layout for 32-bit systems
146 // Group 1: Pointers (4 bytes each, naturally aligned)
148
149 // Group 2: Fixed-size array of connection pointers
150 std::array<BluetoothConnection *, BLUETOOTH_PROXY_MAX_CONNECTIONS> connections_{};
151
152 // BLE advertisement batching
154
155 // Group 3: 4-byte types
157
158 // Pre-allocated response message - always ready to send
160
161 // Group 4: 1-byte types grouped together
164 // 2 bytes used, 2 bytes padding
165};
166
167extern BluetoothProxy *global_bluetooth_proxy; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
168
169} // namespace esphome::bluetooth_proxy
170
171#endif // USE_ESP32
uint8_t address
Definition bl0906.h:4
void bluetooth_gatt_read(const api::BluetoothGATTReadRequest &msg)
void bluetooth_gatt_send_services(const api::BluetoothGATTGetServicesRequest &msg)
void handle_gatt_not_connected_(uint64_t address, uint16_t handle, const char *action, const char *type)
esp32_ble_tracker::AdvertisementParserType get_advertisement_parser_type() override
void send_device_connection(uint64_t address, bool connected, uint16_t mtu=0, esp_err_t error=ESP_OK)
void send_device_unpairing(uint64_t address, bool success, esp_err_t error=ESP_OK)
void send_device_pairing(uint64_t address, bool paired, esp_err_t error=ESP_OK)
bool parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) override
void log_not_connected_gatt_(const char *action, const char *type)
void bluetooth_device_request(const api::BluetoothDeviceRequest &msg)
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override
void bluetooth_gatt_write_descriptor(const api::BluetoothGATTWriteDescriptorRequest &msg)
void send_bluetooth_scanner_state_(esp32_ble_tracker::ScannerState state)
void subscribe_api_connection(api::APIConnection *api_connection, uint32_t flags)
void send_gatt_error(uint64_t address, uint16_t handle, esp_err_t error)
void unsubscribe_api_connection(api::APIConnection *api_connection)
void register_connection(BluetoothConnection *connection)
api::BluetoothLERawAdvertisementsResponse response_
void log_connection_info_(BluetoothConnection *connection, const char *message)
BluetoothConnection * get_connection_(uint64_t address, bool reserve)
void bluetooth_gatt_read_descriptor(const api::BluetoothGATTReadDescriptorRequest &msg)
void bluetooth_gatt_write(const api::BluetoothGATTWriteRequest &msg)
void bluetooth_gatt_notify(const api::BluetoothGATTNotifyRequest &msg)
static void uint64_to_bd_addr(uint64_t address, esp_bd_addr_t bd_addr)
void send_device_clear_cache(uint64_t address, bool success, esp_err_t error=ESP_OK)
std::array< BluetoothConnection *, BLUETOOTH_PROXY_MAX_CONNECTIONS > connections_
api::BluetoothConnectionsFreeResponse connections_free_response_
void log_connection_request_ignored_(BluetoothConnection *connection, espbt::ClientState state)
uint8_t type
bool state
Definition fan.h:0
BluetoothProxy * global_bluetooth_proxy
std::string str_snprintf(const char *fmt, size_t len,...)
Definition helpers.cpp:194