mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 08:28:12 +01:00
Improve manufacturer data tracing to identify BLE devices a bit easie… (#7332)
This commit is contained in:
parent
323c641ecd
commit
78d0e0baae
5 changed files with 24 additions and 14 deletions
|
@ -41,7 +41,7 @@ CONFIG_SCHEMA = cv.All(
|
||||||
cv.Optional(CONF_SERVICE_UUID): esp32_ble_tracker.bt_uuid,
|
cv.Optional(CONF_SERVICE_UUID): esp32_ble_tracker.bt_uuid,
|
||||||
cv.Optional(CONF_IBEACON_MAJOR): cv.uint16_t,
|
cv.Optional(CONF_IBEACON_MAJOR): cv.uint16_t,
|
||||||
cv.Optional(CONF_IBEACON_MINOR): cv.uint16_t,
|
cv.Optional(CONF_IBEACON_MINOR): cv.uint16_t,
|
||||||
cv.Optional(CONF_IBEACON_UUID): cv.uuid,
|
cv.Optional(CONF_IBEACON_UUID): esp32_ble_tracker.bt_uuid,
|
||||||
cv.Optional(CONF_TIMEOUT, default="5min"): cv.positive_time_period,
|
cv.Optional(CONF_TIMEOUT, default="5min"): cv.positive_time_period,
|
||||||
cv.Optional(CONF_MIN_RSSI): cv.All(
|
cv.Optional(CONF_MIN_RSSI): cv.All(
|
||||||
cv.decibel, cv.int_range(min=-100, max=-30)
|
cv.decibel, cv.int_range(min=-100, max=-30)
|
||||||
|
@ -83,7 +83,7 @@ async def to_code(config):
|
||||||
cg.add(var.set_service_uuid128(uuid128))
|
cg.add(var.set_service_uuid128(uuid128))
|
||||||
|
|
||||||
if ibeacon_uuid := config.get(CONF_IBEACON_UUID):
|
if ibeacon_uuid := config.get(CONF_IBEACON_UUID):
|
||||||
ibeacon_uuid = esp32_ble_tracker.as_hex_array(str(ibeacon_uuid))
|
ibeacon_uuid = esp32_ble_tracker.as_reversed_hex_array(ibeacon_uuid)
|
||||||
cg.add(var.set_ibeacon_uuid(ibeacon_uuid))
|
cg.add(var.set_ibeacon_uuid(ibeacon_uuid))
|
||||||
|
|
||||||
if (ibeacon_major := config.get(CONF_IBEACON_MAJOR)) is not None:
|
if (ibeacon_major := config.get(CONF_IBEACON_MAJOR)) is not None:
|
||||||
|
|
|
@ -31,6 +31,13 @@ ESPBTUUID ESPBTUUID::from_raw(const uint8_t *data) {
|
||||||
memcpy(ret.uuid_.uuid.uuid128, data, ESP_UUID_LEN_128);
|
memcpy(ret.uuid_.uuid.uuid128, data, ESP_UUID_LEN_128);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
ESPBTUUID ESPBTUUID::from_raw_reversed(const uint8_t *data) {
|
||||||
|
ESPBTUUID ret;
|
||||||
|
ret.uuid_.len = ESP_UUID_LEN_128;
|
||||||
|
for (int i = 0; i < ESP_UUID_LEN_128; i++)
|
||||||
|
ret.uuid_.uuid.uuid128[ESP_UUID_LEN_128 - 1 - i] = data[i];
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
ESPBTUUID ESPBTUUID::from_raw(const std::string &data) {
|
ESPBTUUID ESPBTUUID::from_raw(const std::string &data) {
|
||||||
ESPBTUUID ret;
|
ESPBTUUID ret;
|
||||||
if (data.length() == 4) {
|
if (data.length() == 4) {
|
||||||
|
|
|
@ -20,6 +20,7 @@ class ESPBTUUID {
|
||||||
static ESPBTUUID from_uint32(uint32_t uuid);
|
static ESPBTUUID from_uint32(uint32_t uuid);
|
||||||
|
|
||||||
static ESPBTUUID from_raw(const uint8_t *data);
|
static ESPBTUUID from_raw(const uint8_t *data);
|
||||||
|
static ESPBTUUID from_raw_reversed(const uint8_t *data);
|
||||||
|
|
||||||
static ESPBTUUID from_raw(const std::string &data);
|
static ESPBTUUID from_raw(const std::string &data);
|
||||||
|
|
||||||
|
|
|
@ -462,14 +462,16 @@ void ESPBTDevice::parse_scan_rst(const esp_ble_gap_cb_param_t::ble_scan_result_e
|
||||||
ESP_LOGVV(TAG, " Service UUID: %s", uuid.to_string().c_str());
|
ESP_LOGVV(TAG, " Service UUID: %s", uuid.to_string().c_str());
|
||||||
}
|
}
|
||||||
for (auto &data : this->manufacturer_datas_) {
|
for (auto &data : this->manufacturer_datas_) {
|
||||||
ESP_LOGVV(TAG, " Manufacturer data: %s", format_hex_pretty(data.data).c_str());
|
auto ibeacon = ESPBLEiBeacon::from_manufacturer_data(data);
|
||||||
if (this->get_ibeacon().has_value()) {
|
if (ibeacon.has_value()) {
|
||||||
auto ibeacon = this->get_ibeacon().value();
|
ESP_LOGVV(TAG, " Manufacturer iBeacon:");
|
||||||
ESP_LOGVV(TAG, " iBeacon data:");
|
ESP_LOGVV(TAG, " UUID: %s", ibeacon.value().get_uuid().to_string().c_str());
|
||||||
ESP_LOGVV(TAG, " UUID: %s", ibeacon.get_uuid().to_string().c_str());
|
ESP_LOGVV(TAG, " Major: %u", ibeacon.value().get_major());
|
||||||
ESP_LOGVV(TAG, " Major: %u", ibeacon.get_major());
|
ESP_LOGVV(TAG, " Minor: %u", ibeacon.value().get_minor());
|
||||||
ESP_LOGVV(TAG, " Minor: %u", ibeacon.get_minor());
|
ESP_LOGVV(TAG, " TXPower: %d", ibeacon.value().get_signal_power());
|
||||||
ESP_LOGVV(TAG, " TXPower: %d", ibeacon.get_signal_power());
|
} else {
|
||||||
|
ESP_LOGVV(TAG, " Manufacturer ID: %s, data: %s", data.uuid.to_string().c_str(),
|
||||||
|
format_hex_pretty(data.data).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto &data : this->service_datas_) {
|
for (auto &data : this->service_datas_) {
|
||||||
|
|
|
@ -44,10 +44,10 @@ class ESPBLEiBeacon {
|
||||||
ESPBLEiBeacon(const uint8_t *data);
|
ESPBLEiBeacon(const uint8_t *data);
|
||||||
static optional<ESPBLEiBeacon> from_manufacturer_data(const ServiceData &data);
|
static optional<ESPBLEiBeacon> from_manufacturer_data(const ServiceData &data);
|
||||||
|
|
||||||
uint16_t get_major() { return ((this->beacon_data_.major & 0xFF) << 8) | (this->beacon_data_.major >> 8); }
|
uint16_t get_major() { return byteswap(this->beacon_data_.major); }
|
||||||
uint16_t get_minor() { return ((this->beacon_data_.minor & 0xFF) << 8) | (this->beacon_data_.minor >> 8); }
|
uint16_t get_minor() { return byteswap(this->beacon_data_.minor); }
|
||||||
int8_t get_signal_power() { return this->beacon_data_.signal_power; }
|
int8_t get_signal_power() { return this->beacon_data_.signal_power; }
|
||||||
ESPBTUUID get_uuid() { return ESPBTUUID::from_raw(this->beacon_data_.proximity_uuid); }
|
ESPBTUUID get_uuid() { return ESPBTUUID::from_raw_reversed(this->beacon_data_.proximity_uuid); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct {
|
struct {
|
||||||
|
|
Loading…
Reference in a new issue