mirror of
https://github.com/esphome/esphome.git
synced 2026-05-27 11:45:36 +08:00
[wifi] Eliminate heap allocations in dump_config logging (#12664)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -899,12 +899,20 @@ void WiFiComponent::print_connect_params_() {
|
|||||||
ESP_LOGCONFIG(TAG, " Disabled");
|
ESP_LOGCONFIG(TAG, " Disabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// Use stack buffers for IP address formatting to avoid heap allocations
|
||||||
|
char ip_buf[network::IP_ADDRESS_BUFFER_SIZE];
|
||||||
for (auto &ip : wifi_sta_ip_addresses()) {
|
for (auto &ip : wifi_sta_ip_addresses()) {
|
||||||
if (ip.is_set()) {
|
if (ip.is_set()) {
|
||||||
ESP_LOGCONFIG(TAG, " IP Address: %s", ip.str().c_str());
|
ESP_LOGCONFIG(TAG, " IP Address: %s", ip.str_to(ip_buf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int8_t rssi = wifi_rssi();
|
int8_t rssi = wifi_rssi();
|
||||||
|
// Use stack buffers for SSID and all IP addresses to avoid heap allocations
|
||||||
|
char ssid_buf[SSID_BUFFER_SIZE];
|
||||||
|
char subnet_buf[network::IP_ADDRESS_BUFFER_SIZE];
|
||||||
|
char gateway_buf[network::IP_ADDRESS_BUFFER_SIZE];
|
||||||
|
char dns1_buf[network::IP_ADDRESS_BUFFER_SIZE];
|
||||||
|
char dns2_buf[network::IP_ADDRESS_BUFFER_SIZE];
|
||||||
ESP_LOGCONFIG(TAG,
|
ESP_LOGCONFIG(TAG,
|
||||||
" SSID: " LOG_SECRET("'%s'") "\n"
|
" SSID: " LOG_SECRET("'%s'") "\n"
|
||||||
" BSSID: " LOG_SECRET("%s") "\n"
|
" BSSID: " LOG_SECRET("%s") "\n"
|
||||||
@@ -915,9 +923,9 @@ void WiFiComponent::print_connect_params_() {
|
|||||||
" Gateway: %s\n"
|
" Gateway: %s\n"
|
||||||
" DNS1: %s\n"
|
" DNS1: %s\n"
|
||||||
" DNS2: %s",
|
" DNS2: %s",
|
||||||
wifi_ssid().c_str(), bssid_s, App.get_name().c_str(), rssi, LOG_STR_ARG(get_signal_bars(rssi)),
|
wifi_ssid_to(ssid_buf), bssid_s, App.get_name().c_str(), rssi, LOG_STR_ARG(get_signal_bars(rssi)),
|
||||||
get_wifi_channel(), wifi_subnet_mask_().str().c_str(), wifi_gateway_ip_().str().c_str(),
|
get_wifi_channel(), wifi_subnet_mask_().str_to(subnet_buf), wifi_gateway_ip_().str_to(gateway_buf),
|
||||||
wifi_dns_ip_(0).str().c_str(), wifi_dns_ip_(1).str().c_str());
|
wifi_dns_ip_(0).str_to(dns1_buf), wifi_dns_ip_(1).str_to(dns2_buf));
|
||||||
#ifdef ESPHOME_LOG_HAS_VERBOSE
|
#ifdef ESPHOME_LOG_HAS_VERBOSE
|
||||||
if (const WiFiAP *config = this->get_selected_sta_(); config && config->has_bssid()) {
|
if (const WiFiAP *config = this->get_selected_sta_(); config && config->has_bssid()) {
|
||||||
ESP_LOGV(TAG, " Priority: %d", this->get_sta_priority(config->get_bssid()));
|
ESP_LOGV(TAG, " Priority: %d", this->get_sta_priority(config->get_bssid()));
|
||||||
|
|||||||
@@ -61,6 +61,9 @@ namespace esphome::wifi {
|
|||||||
/// Sentinel value for RSSI when WiFi is not connected
|
/// Sentinel value for RSSI when WiFi is not connected
|
||||||
static constexpr int8_t WIFI_RSSI_DISCONNECTED = -127;
|
static constexpr int8_t WIFI_RSSI_DISCONNECTED = -127;
|
||||||
|
|
||||||
|
/// Buffer size for SSID (IEEE 802.11 max 32 bytes + null terminator)
|
||||||
|
static constexpr size_t SSID_BUFFER_SIZE = 33;
|
||||||
|
|
||||||
struct SavedWifiSettings {
|
struct SavedWifiSettings {
|
||||||
char ssid[33];
|
char ssid[33];
|
||||||
char password[65];
|
char password[65];
|
||||||
@@ -408,6 +411,9 @@ class WiFiComponent : public Component {
|
|||||||
|
|
||||||
network::IPAddresses wifi_sta_ip_addresses();
|
network::IPAddresses wifi_sta_ip_addresses();
|
||||||
std::string wifi_ssid();
|
std::string wifi_ssid();
|
||||||
|
/// Write SSID to buffer without heap allocation.
|
||||||
|
/// Returns pointer to buffer, or empty string if not connected.
|
||||||
|
const char *wifi_ssid_to(std::span<char, SSID_BUFFER_SIZE> buffer);
|
||||||
bssid_t wifi_bssid();
|
bssid_t wifi_bssid();
|
||||||
|
|
||||||
int8_t wifi_rssi();
|
int8_t wifi_rssi();
|
||||||
|
|||||||
@@ -913,6 +913,18 @@ bssid_t WiFiComponent::wifi_bssid() {
|
|||||||
return bssid;
|
return bssid;
|
||||||
}
|
}
|
||||||
std::string WiFiComponent::wifi_ssid() { return WiFi.SSID().c_str(); }
|
std::string WiFiComponent::wifi_ssid() { return WiFi.SSID().c_str(); }
|
||||||
|
const char *WiFiComponent::wifi_ssid_to(std::span<char, SSID_BUFFER_SIZE> buffer) {
|
||||||
|
struct station_config conf {};
|
||||||
|
if (!wifi_station_get_config(&conf)) {
|
||||||
|
buffer[0] = '\0';
|
||||||
|
return buffer.data();
|
||||||
|
}
|
||||||
|
// conf.ssid is uint8[32], not null-terminated if full
|
||||||
|
size_t len = strnlen(reinterpret_cast<const char *>(conf.ssid), sizeof(conf.ssid));
|
||||||
|
memcpy(buffer.data(), conf.ssid, len);
|
||||||
|
buffer[len] = '\0';
|
||||||
|
return buffer.data();
|
||||||
|
}
|
||||||
int8_t WiFiComponent::wifi_rssi() {
|
int8_t WiFiComponent::wifi_rssi() {
|
||||||
if (WiFi.status() != WL_CONNECTED)
|
if (WiFi.status() != WL_CONNECTED)
|
||||||
return WIFI_RSSI_DISCONNECTED;
|
return WIFI_RSSI_DISCONNECTED;
|
||||||
|
|||||||
@@ -1086,6 +1086,19 @@ std::string WiFiComponent::wifi_ssid() {
|
|||||||
size_t len = strnlen(ssid_s, sizeof(info.ssid));
|
size_t len = strnlen(ssid_s, sizeof(info.ssid));
|
||||||
return {ssid_s, len};
|
return {ssid_s, len};
|
||||||
}
|
}
|
||||||
|
const char *WiFiComponent::wifi_ssid_to(std::span<char, SSID_BUFFER_SIZE> buffer) {
|
||||||
|
wifi_ap_record_t info{};
|
||||||
|
esp_err_t err = esp_wifi_sta_get_ap_info(&info);
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
buffer[0] = '\0';
|
||||||
|
return buffer.data();
|
||||||
|
}
|
||||||
|
// info.ssid is uint8[33], but only 32 bytes are SSID data
|
||||||
|
size_t len = strnlen(reinterpret_cast<const char *>(info.ssid), 32);
|
||||||
|
memcpy(buffer.data(), info.ssid, len);
|
||||||
|
buffer[len] = '\0';
|
||||||
|
return buffer.data();
|
||||||
|
}
|
||||||
int8_t WiFiComponent::wifi_rssi() {
|
int8_t WiFiComponent::wifi_rssi() {
|
||||||
wifi_ap_record_t info;
|
wifi_ap_record_t info;
|
||||||
esp_err_t err = esp_wifi_sta_get_ap_info(&info);
|
esp_err_t err = esp_wifi_sta_get_ap_info(&info);
|
||||||
|
|||||||
@@ -554,6 +554,14 @@ bssid_t WiFiComponent::wifi_bssid() {
|
|||||||
return bssid;
|
return bssid;
|
||||||
}
|
}
|
||||||
std::string WiFiComponent::wifi_ssid() { return WiFi.SSID().c_str(); }
|
std::string WiFiComponent::wifi_ssid() { return WiFi.SSID().c_str(); }
|
||||||
|
const char *WiFiComponent::wifi_ssid_to(std::span<char, SSID_BUFFER_SIZE> buffer) {
|
||||||
|
// TODO: Find direct LibreTiny API to avoid Arduino String allocation
|
||||||
|
String ssid = WiFi.SSID();
|
||||||
|
size_t len = std::min(static_cast<size_t>(ssid.length()), SSID_BUFFER_SIZE - 1);
|
||||||
|
memcpy(buffer.data(), ssid.c_str(), len);
|
||||||
|
buffer[len] = '\0';
|
||||||
|
return buffer.data();
|
||||||
|
}
|
||||||
int8_t WiFiComponent::wifi_rssi() { return WiFi.status() == WL_CONNECTED ? WiFi.RSSI() : WIFI_RSSI_DISCONNECTED; }
|
int8_t WiFiComponent::wifi_rssi() { return WiFi.status() == WL_CONNECTED ? WiFi.RSSI() : WIFI_RSSI_DISCONNECTED; }
|
||||||
int32_t WiFiComponent::get_wifi_channel() { return WiFi.channel(); }
|
int32_t WiFiComponent::get_wifi_channel() { return WiFi.channel(); }
|
||||||
network::IPAddress WiFiComponent::wifi_subnet_mask_() { return {WiFi.subnetMask()}; }
|
network::IPAddress WiFiComponent::wifi_subnet_mask_() { return {WiFi.subnetMask()}; }
|
||||||
|
|||||||
@@ -214,6 +214,14 @@ bssid_t WiFiComponent::wifi_bssid() {
|
|||||||
return bssid;
|
return bssid;
|
||||||
}
|
}
|
||||||
std::string WiFiComponent::wifi_ssid() { return WiFi.SSID().c_str(); }
|
std::string WiFiComponent::wifi_ssid() { return WiFi.SSID().c_str(); }
|
||||||
|
const char *WiFiComponent::wifi_ssid_to(std::span<char, SSID_BUFFER_SIZE> buffer) {
|
||||||
|
// TODO: Find direct CYW43 API to avoid Arduino String allocation
|
||||||
|
String ssid = WiFi.SSID();
|
||||||
|
size_t len = std::min(static_cast<size_t>(ssid.length()), SSID_BUFFER_SIZE - 1);
|
||||||
|
memcpy(buffer.data(), ssid.c_str(), len);
|
||||||
|
buffer[len] = '\0';
|
||||||
|
return buffer.data();
|
||||||
|
}
|
||||||
int8_t WiFiComponent::wifi_rssi() { return WiFi.status() == WL_CONNECTED ? WiFi.RSSI() : WIFI_RSSI_DISCONNECTED; }
|
int8_t WiFiComponent::wifi_rssi() { return WiFi.status() == WL_CONNECTED ? WiFi.RSSI() : WIFI_RSSI_DISCONNECTED; }
|
||||||
int32_t WiFiComponent::get_wifi_channel() { return WiFi.channel(); }
|
int32_t WiFiComponent::get_wifi_channel() { return WiFi.channel(); }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user