ESPHome  2023.8.3
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/component.h"
11 #include "esphome/core/helpers.h"
13 
14 #include <map>
15 #include <memory>
16 #include <vector>
17 
18 #ifdef USE_ESP32
19 
20 #include <esp_gap_ble_api.h>
21 #include <esp_gatts_api.h>
22 
23 namespace esphome {
24 namespace esp32_ble_server {
25 
26 using namespace esp32_ble;
27 
29  public:
30  virtual void on_client_connect(){};
31  virtual void on_client_disconnect(){};
32  virtual void start();
33  virtual void stop();
34 };
35 
36 class BLEServer : public Component, public GATTsEventHandler, public Parented<ESP32BLE> {
37  public:
38  void setup() override;
39  void loop() override;
40  void dump_config() override;
41  float get_setup_priority() const override;
42  bool can_proceed() override { return this->can_proceed_; }
43 
44  void teardown();
45 
46  void set_manufacturer(const std::string &manufacturer) { this->manufacturer_ = manufacturer; }
47  void set_model(const std::string &model) { this->model_ = model; }
48 
49  std::shared_ptr<BLEService> create_service(const uint8_t *uuid, bool advertise = false);
50  std::shared_ptr<BLEService> create_service(uint16_t uuid, bool advertise = false);
51  std::shared_ptr<BLEService> create_service(const std::string &uuid, bool advertise = false);
52  std::shared_ptr<BLEService> create_service(ESPBTUUID uuid, bool advertise = false, uint16_t num_handles = 15,
53  uint8_t inst_id = 0);
54 
55  esp_gatt_if_t get_gatts_if() { return this->gatts_if_; }
56  uint32_t get_connected_client_count() { return this->connected_clients_; }
57  const std::map<uint16_t, void *> &get_clients() { return this->clients_; }
58 
59  void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if,
60  esp_ble_gatts_cb_param_t *param) override;
61 
62  void register_service_component(BLEServiceComponent *component) { this->service_components_.push_back(component); }
63 
64  protected:
65  bool create_device_characteristics_();
66 
67  void add_client_(uint16_t conn_id, void *client) {
68  this->clients_.insert(std::pair<uint16_t, void *>(conn_id, client));
69  }
70  bool remove_client_(uint16_t conn_id) { return this->clients_.erase(conn_id) > 0; }
71 
72  bool can_proceed_{false};
73 
74  std::string manufacturer_;
76  esp_gatt_if_t gatts_if_{0};
77  bool registered_{false};
78 
79  uint32_t connected_clients_{0};
80  std::map<uint16_t, void *> clients_;
81 
82  std::vector<std::shared_ptr<BLEService>> services_;
83  std::shared_ptr<BLEService> device_information_service_;
84 
85  std::vector<BLEServiceComponent *> service_components_;
86 
87  enum State : uint8_t {
88  INIT = 0x00,
92  } state_{INIT};
93 };
94 
95 // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
97 
98 } // namespace esp32_ble_server
99 } // namespace esphome
100 
101 #endif
const std::map< uint16_t, void * > & get_clients()
Definition: ble_server.h:57
void setup()
void loop()
bool remove_client_(uint16_t conn_id)
Definition: ble_server.h:70
std::shared_ptr< BLEService > device_information_service_
Definition: ble_server.h:83
optional< std::string > model_
Definition: ble_server.h:75
void add_client_(uint16_t conn_id, void *client)
Definition: ble_server.h:67
std::vector< BLEServiceComponent * > service_components_
Definition: ble_server.h:85
std::vector< std::shared_ptr< BLEService > > services_
Definition: ble_server.h:82
std::map< uint16_t, void * > clients_
Definition: ble_server.h:80
void register_service_component(BLEServiceComponent *component)
Definition: ble_server.h:62
void set_model(const std::string &model)
Definition: ble_server.h:47
void set_manufacturer(const std::string &manufacturer)
Definition: ble_server.h:46
Helper class to easily give an object a parent of type T.
Definition: helpers.h:512