ESPHome  2023.5.5
ble_uuid.cpp
Go to the documentation of this file.
1 #include "ble_uuid.h"
2 
3 #ifdef USE_ESP32
4 
5 #include <cstring>
6 #include <cstdio>
7 #include "esphome/core/log.h"
8 
9 namespace esphome {
10 namespace esp32_ble {
11 
12 static const char *const TAG = "esp32_ble";
13 
14 ESPBTUUID::ESPBTUUID() : uuid_() {}
16  ESPBTUUID ret;
17  ret.uuid_.len = ESP_UUID_LEN_16;
18  ret.uuid_.uuid.uuid16 = uuid;
19  return ret;
20 }
22  ESPBTUUID ret;
23  ret.uuid_.len = ESP_UUID_LEN_32;
24  ret.uuid_.uuid.uuid32 = uuid;
25  return ret;
26 }
27 ESPBTUUID ESPBTUUID::from_raw(const uint8_t *data) {
28  ESPBTUUID ret;
29  ret.uuid_.len = ESP_UUID_LEN_128;
30  memcpy(ret.uuid_.uuid.uuid128, data, ESP_UUID_LEN_128);
31  return ret;
32 }
33 ESPBTUUID ESPBTUUID::from_raw(const std::string &data) {
34  ESPBTUUID ret;
35  if (data.length() == 4) {
36  ret.uuid_.len = ESP_UUID_LEN_16;
37  ret.uuid_.uuid.uuid16 = 0;
38  for (int i = 0; i < data.length();) {
39  uint8_t msb = data.c_str()[i];
40  uint8_t lsb = data.c_str()[i + 1];
41 
42  if (msb > '9')
43  msb -= 7;
44  if (lsb > '9')
45  lsb -= 7;
46  ret.uuid_.uuid.uuid16 += (((msb & 0x0F) << 4) | (lsb & 0x0F)) << (2 - i) * 4;
47  i += 2;
48  }
49  } else if (data.length() == 8) {
50  ret.uuid_.len = ESP_UUID_LEN_32;
51  ret.uuid_.uuid.uuid32 = 0;
52  for (int i = 0; i < data.length();) {
53  uint8_t msb = data.c_str()[i];
54  uint8_t lsb = data.c_str()[i + 1];
55 
56  if (msb > '9')
57  msb -= 7;
58  if (lsb > '9')
59  lsb -= 7;
60  ret.uuid_.uuid.uuid32 += (((msb & 0x0F) << 4) | (lsb & 0x0F)) << (6 - i) * 4;
61  i += 2;
62  }
63  } else if (data.length() == 16) { // how we can have 16 byte length string reprezenting 128 bit uuid??? needs to be
64  // investigated (lack of time)
65  ret.uuid_.len = ESP_UUID_LEN_128;
66  memcpy(ret.uuid_.uuid.uuid128, (uint8_t *) data.data(), 16);
67  } else if (data.length() == 36) {
68  // If the length of the string is 36 bytes then we will assume it is a long hex string in
69  // UUID format.
70  ret.uuid_.len = ESP_UUID_LEN_128;
71  int n = 0;
72  for (int i = 0; i < data.length();) {
73  if (data.c_str()[i] == '-')
74  i++;
75  uint8_t msb = data.c_str()[i];
76  uint8_t lsb = data.c_str()[i + 1];
77 
78  if (msb > '9')
79  msb -= 7;
80  if (lsb > '9')
81  lsb -= 7;
82  ret.uuid_.uuid.uuid128[15 - n++] = ((msb & 0x0F) << 4) | (lsb & 0x0F);
83  i += 2;
84  }
85  } else {
86  ESP_LOGE(TAG, "ERROR: UUID value not 2, 4, 16 or 36 bytes - %s", data.c_str());
87  }
88  return ret;
89 }
90 ESPBTUUID ESPBTUUID::from_uuid(esp_bt_uuid_t uuid) {
91  ESPBTUUID ret;
92  ret.uuid_.len = uuid.len;
93  if (uuid.len == ESP_UUID_LEN_16) {
94  ret.uuid_.uuid.uuid16 = uuid.uuid.uuid16;
95  } else if (uuid.len == ESP_UUID_LEN_32) {
96  ret.uuid_.uuid.uuid32 = uuid.uuid.uuid32;
97  } else if (uuid.len == ESP_UUID_LEN_128) {
98  memcpy(ret.uuid_.uuid.uuid128, uuid.uuid.uuid128, ESP_UUID_LEN_128);
99  }
100  return ret;
101 }
103  if (this->uuid_.len == ESP_UUID_LEN_128) {
104  return *this;
105  }
106  uint8_t data[] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
107  uint32_t uuid32;
108  if (this->uuid_.len == ESP_UUID_LEN_32) {
109  uuid32 = this->uuid_.uuid.uuid32;
110  } else {
111  uuid32 = this->uuid_.uuid.uuid16;
112  }
113  for (uint8_t i = 0; i < this->uuid_.len; i++) {
114  data[12 + i] = ((uuid32 >> i * 8) & 0xFF);
115  }
116  return ESPBTUUID::from_raw(data);
117 }
118 bool ESPBTUUID::contains(uint8_t data1, uint8_t data2) const {
119  if (this->uuid_.len == ESP_UUID_LEN_16) {
120  return (this->uuid_.uuid.uuid16 >> 8) == data2 && (this->uuid_.uuid.uuid16 & 0xFF) == data1;
121  } else if (this->uuid_.len == ESP_UUID_LEN_32) {
122  for (uint8_t i = 0; i < 3; i++) {
123  bool a = ((this->uuid_.uuid.uuid32 >> i * 8) & 0xFF) == data1;
124  bool b = ((this->uuid_.uuid.uuid32 >> (i + 1) * 8) & 0xFF) == data2;
125  if (a && b)
126  return true;
127  }
128  } else {
129  for (uint8_t i = 0; i < 15; i++) {
130  if (this->uuid_.uuid.uuid128[i] == data1 && this->uuid_.uuid.uuid128[i + 1] == data2)
131  return true;
132  }
133  }
134  return false;
135 }
136 bool ESPBTUUID::operator==(const ESPBTUUID &uuid) const {
137  if (this->uuid_.len == uuid.uuid_.len) {
138  switch (this->uuid_.len) {
139  case ESP_UUID_LEN_16:
140  if (uuid.uuid_.uuid.uuid16 == this->uuid_.uuid.uuid16) {
141  return true;
142  }
143  break;
144  case ESP_UUID_LEN_32:
145  if (uuid.uuid_.uuid.uuid32 == this->uuid_.uuid.uuid32) {
146  return true;
147  }
148  break;
149  case ESP_UUID_LEN_128:
150  for (int i = 0; i < ESP_UUID_LEN_128; i++) {
151  if (uuid.uuid_.uuid.uuid128[i] != this->uuid_.uuid.uuid128[i]) {
152  return false;
153  }
154  }
155  return true;
156  break;
157  }
158  } else {
159  return this->as_128bit() == uuid.as_128bit();
160  }
161  return false;
162 }
163 esp_bt_uuid_t ESPBTUUID::get_uuid() const { return this->uuid_; }
164 std::string ESPBTUUID::to_string() const {
165  switch (this->uuid_.len) {
166  case ESP_UUID_LEN_16:
167  return str_snprintf("0x%02X%02X", 6, this->uuid_.uuid.uuid16 >> 8, this->uuid_.uuid.uuid16 & 0xff);
168  case ESP_UUID_LEN_32:
169  return str_snprintf("0x%02X%02X%02X%02X", 10, this->uuid_.uuid.uuid32 >> 24,
170  (this->uuid_.uuid.uuid32 >> 16 & 0xff), (this->uuid_.uuid.uuid32 >> 8 & 0xff),
171  this->uuid_.uuid.uuid32 & 0xff);
172  default:
173  case ESP_UUID_LEN_128:
174  std::string buf;
175  for (int8_t i = 15; i >= 0; i--) {
176  buf += str_snprintf("%02X", 2, this->uuid_.uuid.uuid128[i]);
177  if (i == 6 || i == 8 || i == 10 || i == 12)
178  buf += "-";
179  }
180  return buf;
181  }
182  return "";
183 }
184 
185 } // namespace esp32_ble
186 } // namespace esphome
187 
188 #endif
bool operator==(const ESPBTUUID &uuid) const
Definition: ble_uuid.cpp:136
static ESPBTUUID from_uuid(esp_bt_uuid_t uuid)
Definition: ble_uuid.cpp:90
static ESPBTUUID from_uint32(uint32_t uuid)
Definition: ble_uuid.cpp:21
static ESPBTUUID from_uint16(uint16_t uuid)
Definition: ble_uuid.cpp:15
std::string to_string() const
Definition: ble_uuid.cpp:164
bool contains(uint8_t data1, uint8_t data2) const
Definition: ble_uuid.cpp:118
Definition: a4988.cpp:4
static ESPBTUUID from_raw(const uint8_t *data)
Definition: ble_uuid.cpp:27
ESPBTUUID as_128bit() const
Definition: ble_uuid.cpp:102
std::string str_snprintf(const char *fmt, size_t len,...)
Definition: helpers.cpp:200
esp_bt_uuid_t get_uuid() const
Definition: ble_uuid.cpp:163