ESPHome  2025.2.0
ble_server.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "ble_service.h"
4 #include "ble_characteristic.h"
5 
10 #include "esphome/core/helpers.h"
11 
12 #include <memory>
13 #include <vector>
14 #include <unordered_map>
15 #include <unordered_set>
16 
17 #ifdef USE_ESP32
18 
19 #include <esp_gatts_api.h>
20 
21 namespace esphome {
22 namespace esp32_ble_server {
23 
24 using namespace esp32_ble;
25 using namespace bytebuffer;
26 
27 namespace BLEServerEvt {
28 enum EmptyEvt {
31 };
32 } // namespace BLEServerEvt
33 
34 class BLEServer : public Component,
35  public GATTsEventHandler,
36  public BLEStatusEventHandler,
37  public Parented<ESP32BLE>,
38  public EventEmitter<BLEServerEvt::EmptyEvt, uint16_t> {
39  public:
40  void setup() override;
41  void loop() override;
42  void dump_config() override;
43  float get_setup_priority() const override;
44  bool can_proceed() override;
45 
46  void teardown();
47  bool is_running();
48 
49  void set_manufacturer_data(const std::vector<uint8_t> &data) {
50  this->manufacturer_data_ = data;
51  this->restart_advertising_();
52  }
53 
54  BLEService *create_service(ESPBTUUID uuid, bool advertise = false, uint16_t num_handles = 15);
55  void remove_service(ESPBTUUID uuid, uint8_t inst_id = 0);
56  BLEService *get_service(ESPBTUUID uuid, uint8_t inst_id = 0);
57  void enqueue_start_service(BLEService *service) { this->services_to_start_.push_back(service); }
58  void set_device_information_service(BLEService *service) { this->device_information_service_ = service; }
59 
60  esp_gatt_if_t get_gatts_if() { return this->gatts_if_; }
61  uint32_t get_connected_client_count() { return this->clients_.size(); }
62  const std::unordered_set<uint16_t> &get_clients() { return this->clients_; }
63 
64  void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if,
65  esp_ble_gatts_cb_param_t *param) override;
66 
67  void ble_before_disabled_event_handler() override;
68 
69  protected:
70  static std::string get_service_key(ESPBTUUID uuid, uint8_t inst_id);
71  void restart_advertising_();
72 
73  void add_client_(uint16_t conn_id) { this->clients_.insert(conn_id); }
74  void remove_client_(uint16_t conn_id) { this->clients_.erase(conn_id); }
75 
76  std::vector<uint8_t> manufacturer_data_{};
77  esp_gatt_if_t gatts_if_{0};
78  bool registered_{false};
79 
80  std::unordered_set<uint16_t> clients_;
81  std::unordered_map<std::string, BLEService *> services_{};
82  std::vector<BLEService *> services_to_start_{};
83  BLEService *device_information_service_{};
84 
85  enum State : uint8_t {
86  INIT = 0x00,
90  } state_{INIT};
91 };
92 
93 // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
95 
96 } // namespace esp32_ble_server
97 } // namespace esphome
98 
99 #endif
void setup()
void loop()
const std::unordered_set< uint16_t > & get_clients()
Definition: ble_server.h:62
void set_manufacturer_data(const std::vector< uint8_t > &data)
Definition: ble_server.h:49
void remove_client_(uint16_t conn_id)
Definition: ble_server.h:74
void add_client_(uint16_t conn_id)
Definition: ble_server.h:73
std::unordered_set< uint16_t > clients_
Definition: ble_server.h:80
void enqueue_start_service(BLEService *service)
Definition: ble_server.h:57
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
void set_device_information_service(BLEService *service)
Definition: ble_server.h:58
Helper class to easily give an object a parent of type T.
Definition: helpers.h:538