ESPHome 2026.3.0
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#ifndef CONFIG_ESP_HOSTED_ENABLE_BT_BLUEDROID
20#include <esp_bt.h>
21#endif
22#include <esp_bt_device.h>
23
25
26static constexpr esp_err_t ESP_GATT_NOT_CONNECTED = -1;
27static constexpr int DONE_SENDING_SERVICES = -2;
28static constexpr int INIT_SENDING_SERVICES = -3;
29
30using namespace esp32_ble_client;
31
32// Legacy versions:
33// Version 1: Initial version without active connections
34// Version 2: Support for active connections
35// Version 3: New connection API
36// Version 4: Pairing support
37// Version 5: Cache clear support
38static constexpr uint32_t LEGACY_ACTIVE_CONNECTIONS_VERSION = 5;
39static constexpr uint32_t LEGACY_PASSIVE_ONLY_VERSION = 1;
40
51
55
58 public Component {
59 friend class BluetoothConnection; // Allow connection to update connections_free_response_
60 public:
62#ifdef USE_ESP32_BLE_DEVICE
63 bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
64#endif
65 bool parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) override;
66 void dump_config() override;
67 void setup() override;
68 void loop() override;
71
73 if (this->connection_count_ < BLUETOOTH_PROXY_MAX_CONNECTIONS) {
74 this->connections_[this->connection_count_++] = connection;
75 connection->proxy_ = this;
76 }
77 }
78
87
91
92 void send_device_connection(uint64_t address, bool connected, uint16_t mtu = 0, esp_err_t error = ESP_OK);
94 void send_connections_free(api::APIConnection *api_connection);
95 void send_gatt_services_done(uint64_t address);
96 void send_gatt_error(uint64_t address, uint16_t handle, esp_err_t error);
97 void send_device_pairing(uint64_t address, bool paired, esp_err_t error = ESP_OK);
98 void send_device_unpairing(uint64_t address, bool success, esp_err_t error = ESP_OK);
99 void send_device_clear_cache(uint64_t address, bool success, esp_err_t error = ESP_OK);
100
101 void bluetooth_scanner_set_mode(bool active);
102
103 static void uint64_to_bd_addr(uint64_t address, esp_bd_addr_t bd_addr) {
104 bd_addr[0] = (address >> 40) & 0xff;
105 bd_addr[1] = (address >> 32) & 0xff;
106 bd_addr[2] = (address >> 24) & 0xff;
107 bd_addr[3] = (address >> 16) & 0xff;
108 bd_addr[4] = (address >> 8) & 0xff;
109 bd_addr[5] = (address >> 0) & 0xff;
110 }
111
112 void set_active(bool active) { this->active_ = active; }
113 bool has_active() { return this->active_; }
114
117
119 if (this->active_) {
120 return LEGACY_ACTIVE_CONNECTIONS_VERSION;
121 }
122 return LEGACY_PASSIVE_ONLY_VERSION;
123 }
124
140
141 void get_bluetooth_mac_address_pretty(std::span<char, 18> output) {
142 const uint8_t *mac = esp_bt_dev_get_address();
143 if (mac != nullptr) {
144 format_mac_addr_upper(mac, output.data());
145 } else {
146 output[0] = '\0';
147 }
148 }
149
150 protected:
152
153 BluetoothConnection *get_connection_(uint64_t address, bool reserve);
155 void log_connection_info_(BluetoothConnection *connection, const char *message);
156 void log_not_connected_gatt_(const char *action, const char *type);
157 void handle_gatt_not_connected_(uint64_t address, uint16_t handle, const char *action, const char *type);
158
159 // Memory optimized layout for 32-bit systems
160 // Group 1: Pointers (4 bytes each, naturally aligned)
162
163 // Group 2: Fixed-size array of connection pointers
164 std::array<BluetoothConnection *, BLUETOOTH_PROXY_MAX_CONNECTIONS> connections_{};
165
166 // BLE advertisement batching
168
169 // Group 3: 4-byte types
171
172 // Pre-allocated response message - always ready to send
174
175 // Group 4: 1-byte types grouped together
178 bool configured_scan_active_{false}; // Configured scan mode from YAML
179 // 3 bytes used, 1 byte padding
180};
181
182extern BluetoothProxy *global_bluetooth_proxy; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
183
184} // namespace esphome::bluetooth_proxy
185
186#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)
void get_bluetooth_mac_address_pretty(std::span< char, 18 > output)
BluetoothConnection * get_connection_(uint64_t address, bool reserve)
void bluetooth_set_connection_params(const api::BluetoothSetConnectionParamsRequest &msg)
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)
void on_scanner_state(esp32_ble_tracker::ScannerState state) override
BLEScannerStateListener interface.
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)
Listener interface for BLE scanner state changes.
const char * message
Definition component.cpp:38
uint16_t type
uint16_t flags
bool state
Definition fan.h:2
BluetoothProxy * global_bluetooth_proxy
char * format_mac_addr_upper(const uint8_t *mac, char *output)
Format MAC address as XX:XX:XX:XX:XX:XX (uppercase, colon separators)
Definition helpers.h:1267
static void uint32_t