ESPHome 2026.1.0-dev
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 const esp_err_t ESP_GATT_NOT_CONNECTED = -1;
27static const int DONE_SENDING_SERVICES = -2;
28static const 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 const uint32_t LEGACY_ACTIVE_CONNECTIONS_VERSION = 5;
39static const uint32_t LEGACY_PASSIVE_ONLY_VERSION = 1;
40
50
54
57 public Component {
58 friend class BluetoothConnection; // Allow connection to update connections_free_response_
59 public:
61#ifdef USE_ESP32_BLE_DEVICE
62 bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
63#endif
64 bool parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) override;
65 void dump_config() override;
66 void setup() override;
67 void loop() override;
70
72 if (this->connection_count_ < BLUETOOTH_PROXY_MAX_CONNECTIONS) {
73 this->connections_[this->connection_count_++] = connection;
74 connection->proxy_ = this;
75 }
76 }
77
85
86 void subscribe_api_connection(api::APIConnection *api_connection, uint32_t flags);
89
90 void send_device_connection(uint64_t address, bool connected, uint16_t mtu = 0, esp_err_t error = ESP_OK);
92 void send_connections_free(api::APIConnection *api_connection);
93 void send_gatt_services_done(uint64_t address);
94 void send_gatt_error(uint64_t address, uint16_t handle, esp_err_t error);
95 void send_device_pairing(uint64_t address, bool paired, esp_err_t error = ESP_OK);
96 void send_device_unpairing(uint64_t address, bool success, esp_err_t error = ESP_OK);
97 void send_device_clear_cache(uint64_t address, bool success, esp_err_t error = ESP_OK);
98
99 void bluetooth_scanner_set_mode(bool active);
100
101 static void uint64_to_bd_addr(uint64_t address, esp_bd_addr_t bd_addr) {
102 bd_addr[0] = (address >> 40) & 0xff;
103 bd_addr[1] = (address >> 32) & 0xff;
104 bd_addr[2] = (address >> 24) & 0xff;
105 bd_addr[3] = (address >> 16) & 0xff;
106 bd_addr[4] = (address >> 8) & 0xff;
107 bd_addr[5] = (address >> 0) & 0xff;
108 }
109
110 void set_active(bool active) { this->active_ = active; }
111 bool has_active() { return this->active_; }
112
115
116 uint32_t get_legacy_version() const {
117 if (this->active_) {
118 return LEGACY_ACTIVE_CONNECTIONS_VERSION;
119 }
120 return LEGACY_PASSIVE_ONLY_VERSION;
121 }
122
137
138 void get_bluetooth_mac_address_pretty(std::span<char, 18> output) {
139 const uint8_t *mac = esp_bt_dev_get_address();
140 if (mac != nullptr) {
141 format_mac_addr_upper(mac, output.data());
142 } else {
143 output[0] = '\0';
144 }
145 }
146
147 protected:
149
150 BluetoothConnection *get_connection_(uint64_t address, bool reserve);
152 void log_connection_info_(BluetoothConnection *connection, const char *message);
153 void log_not_connected_gatt_(const char *action, const char *type);
154 void handle_gatt_not_connected_(uint64_t address, uint16_t handle, const char *action, const char *type);
155
156 // Memory optimized layout for 32-bit systems
157 // Group 1: Pointers (4 bytes each, naturally aligned)
159
160 // Group 2: Fixed-size array of connection pointers
161 std::array<BluetoothConnection *, BLUETOOTH_PROXY_MAX_CONNECTIONS> connections_{};
162
163 // BLE advertisement batching
165
166 // Group 3: 4-byte types
168
169 // Pre-allocated response message - always ready to send
171
172 // Group 4: 1-byte types grouped together
175 bool configured_scan_active_{false}; // Configured scan mode from YAML
176 // 3 bytes used, 1 byte padding
177};
178
179extern BluetoothProxy *global_bluetooth_proxy; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
180
181} // namespace esphome::bluetooth_proxy
182
183#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_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:0
BluetoothProxy * global_bluetooth_proxy
void 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:765