159 const auto &data = service_data.
data;
160 if (data.size() < 2) {
161 ESP_LOGVV(TAG,
"BTHome data too short: %zu", data.size());
165 const uint8_t adv_info = data[0];
166 const bool is_encrypted = adv_info & 0x01;
167 const bool mac_included = adv_info & 0x02;
168 const bool is_trigger_based = adv_info & 0x04;
169 const uint8_t version = (adv_info >> 5) & 0x07;
171 if (version != 0x02) {
172 ESP_LOGVV(TAG,
"Unsupported BTHome version %u", version);
176 char addr_buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
178 ESP_LOGV(TAG,
"Ignoring encrypted BTHome frame from %s", device.
address_str_to(addr_buf));
182 size_t payload_index = 1;
186 if (data.size() < 7) {
187 ESP_LOGVV(TAG,
"BTHome payload missing MAC address");
191 for (
int i = 5; i >= 0; i--) {
192 source_address = (source_address << 8) | data[1 + i];
197 if (source_address != this->
address_) {
198 ESP_LOGVV(TAG,
"BTHome frame from unexpected device %s", format_mac_address(addr_buf, source_address));
202 if (payload_index >= data.size()) {
203 ESP_LOGVV(TAG,
"BTHome payload empty after header");
207 bool reported =
false;
208 size_t offset = payload_index;
209 uint8_t last_type = 0;
211 while (offset < data.size()) {
212 const uint8_t obj_type = data[offset++];
213 size_t value_length = 0;
214 bool has_length_byte = obj_type == 0x53;
216 if (has_length_byte) {
217 if (offset >= data.size()) {
220 value_length = data[offset++];
222 if (!get_bthome_value_length(obj_type, value_length)) {
223 ESP_LOGVV(TAG,
"Unknown BTHome object 0x%02X", obj_type);
228 if (value_length == 0) {
232 if (offset + value_length > data.size()) {
233 ESP_LOGVV(TAG,
"BTHome object length exceeds payload");
237 const uint8_t *value = &data[offset];
238 offset += value_length;
240 if (obj_type < last_type) {
241 ESP_LOGVV(TAG,
"BTHome objects not in ascending order");
243 last_type = obj_type;
247 const uint8_t packet_id = value[0];
291 ESP_LOGD(TAG,
"BTHome data%sfrom %s", is_trigger_based ?
" (triggered) " :
" ", device.
address_str_to(addr_buf));