mirror of
https://github.com/esphome/esphome.git
synced 2026-09-14 08:38:39 +00:00
[ble_scanner] Escape special characters in JSON output (#14664)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
470d9160a5
commit
308e8e78cd
@@ -16,12 +16,27 @@ namespace ble_scanner {
|
||||
class BLEScanner : public text_sensor::TextSensor, public esp32_ble_tracker::ESPBTDeviceListener, public Component {
|
||||
public:
|
||||
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override {
|
||||
// Format JSON using stack buffer to avoid heap allocations from string concatenation
|
||||
char buf[128];
|
||||
char addr_buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
|
||||
// Escape special characters in the device name for valid JSON
|
||||
const char *name = device.get_name().c_str();
|
||||
char escaped_name[128];
|
||||
size_t pos = 0;
|
||||
for (; *name != '\0' && pos < sizeof(escaped_name) - 7; name++) {
|
||||
uint8_t c = static_cast<uint8_t>(*name);
|
||||
if (c == '"' || c == '\\') {
|
||||
escaped_name[pos++] = '\\';
|
||||
escaped_name[pos++] = c;
|
||||
} else if (c < 0x20) {
|
||||
pos += snprintf(escaped_name + pos, sizeof(escaped_name) - pos, "\\u%04x", c);
|
||||
} else {
|
||||
escaped_name[pos++] = c;
|
||||
}
|
||||
}
|
||||
escaped_name[pos] = '\0';
|
||||
|
||||
char buf[256];
|
||||
snprintf(buf, sizeof(buf), "{\"timestamp\":%" PRId64 ",\"address\":\"%s\",\"rssi\":%d,\"name\":\"%s\"}",
|
||||
static_cast<int64_t>(::time(nullptr)), device.address_str_to(addr_buf), device.get_rssi(),
|
||||
device.get_name().c_str());
|
||||
static_cast<int64_t>(::time(nullptr)), device.address_str_to(addr_buf), device.get_rssi(), escaped_name);
|
||||
this->publish_state(buf);
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user