ESPHome 2025.12.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
56 friend class BluetoothConnection; // Allow connection to update connections_free_response_
57 public:
59#ifdef USE_ESP32_BLE_DEVICE
60 bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
61#endif
62 bool parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) override;
63 void dump_config() override;
64 void setup() override;
65 void loop() override;
68
70 if (this->connection_count_ < BLUETOOTH_PROXY_MAX_CONNECTIONS) {
71 this->connections_[this->connection_count_++] = connection;
72 connection->proxy_ = this;
73 }
74 }
75
83
84 void subscribe_api_connection(api::APIConnection *api_connection, uint32_t flags);
87
88 void send_device_connection(uint64_t address, bool connected, uint16_t mtu = 0, esp_err_t error = ESP_OK);
90 void send_connections_free(api::APIConnection *api_connection);
91 void send_gatt_services_done(uint64_t address);
92 void send_gatt_error(uint64_t address, uint16_t handle, esp_err_t error);
93 void send_device_pairing(uint64_t address, bool paired, esp_err_t error = ESP_OK);
94 void send_device_unpairing(uint64_t address, bool success, esp_err_t error = ESP_OK);
95 void send_device_clear_cache(uint64_t address, bool success, esp_err_t error = ESP_OK);
96
97 void bluetooth_scanner_set_mode(bool active);
98
99 static void uint64_to_bd_addr(uint64_t address, esp_bd_addr_t bd_addr) {
100 bd_addr[0] = (address >> 40) & 0xff;
101 bd_addr[1] = (address >> 32) & 0xff;
102 bd_addr[2] = (address >> 24) & 0xff;
103 bd_addr[3] = (address >> 16) & 0xff;
104 bd_addr[4] = (address >> 8) & 0xff;
105 bd_addr[5] = (address >> 0) & 0xff;
106 }
107
108 void set_active(bool active) { this->active_ = active; }
109 bool has_active() { return this->active_; }
110
111 uint32_t get_legacy_version() const {
112 if (this->active_) {
113 return LEGACY_ACTIVE_CONNECTIONS_VERSION;
114 }
115 return LEGACY_PASSIVE_ONLY_VERSION;
116 }
117
132
134 const uint8_t *mac = esp_bt_dev_get_address();
135 char buf[18];
136 format_mac_addr_upper(mac, buf);
137 return std::string(buf);
138 }
139
140 protected:
142
143 BluetoothConnection *get_connection_(uint64_t address, bool reserve);
145 void log_connection_info_(BluetoothConnection *connection, const char *message);
146 void log_not_connected_gatt_(const char *action, const char *type);
147 void handle_gatt_not_connected_(uint64_t address, uint16_t handle, const char *action, const char *type);
148
149 // Memory optimized layout for 32-bit systems
150 // Group 1: Pointers (4 bytes each, naturally aligned)
152
153 // Group 2: Fixed-size array of connection pointers
154 std::array<BluetoothConnection *, BLUETOOTH_PROXY_MAX_CONNECTIONS> connections_{};
155
156 // BLE advertisement batching
158
159 // Group 3: 4-byte types
161
162 // Pre-allocated response message - always ready to send
164
165 // Group 4: 1-byte types grouped together
168 bool configured_scan_active_{false}; // Configured scan mode from YAML
169 // 3 bytes used, 1 byte padding
170};
171
172extern BluetoothProxy *global_bluetooth_proxy; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
173
174} // namespace esphome::bluetooth_proxy
175
176#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)
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)
Definition helpers.h:621