158 const auto &data = service_data.
data;
159 if (data.size() < 2) {
160 ESP_LOGVV(TAG,
"BTHome data too short: %zu", data.size());
164 const uint8_t adv_info = data[0];
165 const bool is_encrypted = adv_info & 0x01;
166 const bool mac_included = adv_info & 0x02;
167 const bool is_trigger_based = adv_info & 0x04;
168 const uint8_t version = (adv_info >> 5) & 0x07;
170 if (version != 0x02) {
171 ESP_LOGVV(TAG,
"Unsupported BTHome version %u", version);
176 ESP_LOGV(TAG,
"Ignoring encrypted BTHome frame from %s", device.
address_str().c_str());
180 size_t payload_index = 1;
184 if (data.size() < 7) {
185 ESP_LOGVV(TAG,
"BTHome payload missing MAC address");
189 for (
int i = 5; i >= 0; i--) {
190 source_address = (source_address << 8) | data[1 + i];
195 if (source_address != this->
address_) {
196 ESP_LOGVV(TAG,
"BTHome frame from unexpected device %s", format_mac_address(source_address).c_str());
200 if (payload_index >= data.size()) {
201 ESP_LOGVV(TAG,
"BTHome payload empty after header");
205 bool reported =
false;
206 size_t offset = payload_index;
207 uint8_t last_type = 0;
209 while (offset < data.size()) {
210 const uint8_t obj_type = data[offset++];
211 size_t value_length = 0;
212 bool has_length_byte = obj_type == 0x53;
214 if (has_length_byte) {
215 if (offset >= data.size()) {
218 value_length = data[offset++];
220 if (!get_bthome_value_length(obj_type, value_length)) {
221 ESP_LOGVV(TAG,
"Unknown BTHome object 0x%02X", obj_type);
226 if (value_length == 0) {
230 if (offset + value_length > data.size()) {
231 ESP_LOGVV(TAG,
"BTHome object length exceeds payload");
235 const uint8_t *value = &data[offset];
236 offset += value_length;
238 if (obj_type < last_type) {
239 ESP_LOGVV(TAG,
"BTHome objects not in ascending order");
241 last_type = obj_type;
245 const uint8_t packet_id = value[0];
289 ESP_LOGD(TAG,
"BTHome data%sfrom %s", is_trigger_based ?
" (triggered) " :
" ", device.
address_str().c_str());