From a3875d8727ae79e438ee4adfc2104387b47d89e4 Mon Sep 17 00:00:00 2001 From: agessaman Date: Thu, 13 Nov 2025 15:46:49 -0800 Subject: [PATCH] Refactor client version string generation in MQTTBridge --- src/helpers/bridges/MQTTBridge.cpp | 20 ++++++++++++++------ src/helpers/bridges/MQTTBridge.h | 9 +++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/helpers/bridges/MQTTBridge.cpp b/src/helpers/bridges/MQTTBridge.cpp index cb4deb588..0fe2fa56c 100644 --- a/src/helpers/bridges/MQTTBridge.cpp +++ b/src/helpers/bridges/MQTTBridge.cpp @@ -684,7 +684,7 @@ bool MQTTBridge::publishStatus() { // Build client version string char client_version[64]; - snprintf(client_version, sizeof(client_version), "meshcore/%s", _firmware_version); + getClientVersion(client_version, sizeof(client_version)); // Collect stats on-demand if sources are available int battery_mv = -1; @@ -1110,7 +1110,7 @@ bool MQTTBridge::createAuthToken() { // Build client version string (same format as used in status messages) char client_version[64]; - snprintf(client_version, sizeof(client_version), "meshcore/%s", _firmware_version); + getClientVersion(client_version, sizeof(client_version)); // Get email from preferences (if set) const char* email = nullptr; @@ -1374,7 +1374,7 @@ void MQTTBridge::publishStatusToAnalyzerClient(PsychicMqttClient* client, const // Build client version string char client_version[64]; - snprintf(client_version, sizeof(client_version), "meshcore/%s", _firmware_version); + getClientVersion(client_version, sizeof(client_version)); // Collect stats on-demand if sources are available int battery_mv = -1; @@ -1488,7 +1488,7 @@ void MQTTBridge::maintainAnalyzerConnections() { // Build client version string (same format as used in status messages) char client_version[64]; - snprintf(client_version, sizeof(client_version), "meshcore/%s", _firmware_version); + getClientVersion(client_version, sizeof(client_version)); // Get email from preferences (if set) const char* email = nullptr; @@ -1577,9 +1577,9 @@ void MQTTBridge::maintainAnalyzerConnections() { owner_key = owner_key_uppercase; } - // Build client version string (same format as used in status messages) + // Build client version string char client_version[64]; - snprintf(client_version, sizeof(client_version), "meshcore/%s", _firmware_version); + getClientVersion(client_version, sizeof(client_version)); // Get email from preferences (if set) const char* email = nullptr; @@ -1878,6 +1878,14 @@ Timezone* MQTTBridge::createTimezoneFromString(const char* tz_string) { } } +void MQTTBridge::getClientVersion(char* buffer, size_t buffer_size) const { + if (!buffer || buffer_size == 0) { + return; + } + // Generate client version string in format "meshcore/{firmware_version}" + snprintf(buffer, buffer_size, "meshcore/%s", _firmware_version); +} + void MQTTBridge::logMemoryStatus() { MQTT_DEBUG_PRINTLN("=== Memory Status ==="); MQTT_DEBUG_PRINTLN("Free heap: %d bytes", ESP.getFreeHeap()); diff --git a/src/helpers/bridges/MQTTBridge.h b/src/helpers/bridges/MQTTBridge.h index 27b44b458..3c044e637 100644 --- a/src/helpers/bridges/MQTTBridge.h +++ b/src/helpers/bridges/MQTTBridge.h @@ -362,6 +362,15 @@ public: mesh::MainBoard* board, mesh::MillisecondClock* ms); private: + /** + * Generate client version string in format "meshcore/{firmware_version}" + * Memory-efficient: writes to provided buffer, no dynamic allocation + * + * @param buffer Buffer to write the client version string to + * @param buffer_size Size of the buffer (must be at least 64 bytes) + */ + void getClientVersion(char* buffer, size_t buffer_size) const; + /** * Log memory status for debugging */