fix(mqtt): clear legacy prefs, restore status publishing, and expand web controls

Dieser Commit ist enthalten in:
Jared Dohrman
2026-04-10 22:24:58 +10:00
Ursprung 60648142a2
Commit 328a0ecf6f
10 geänderte Dateien mit 219 neuen und 98 gelöschten Zeilen
+10 -4
Datei anzeigen
@@ -44,14 +44,20 @@ bool MQTTPrefsStore::load(FILESYSTEM* fs, MQTTPrefs& prefs) {
return false;
}
size_t bytes_to_read = min(static_cast<size_t>(file.size()), sizeof(prefs));
bool ok = bytes_to_read >= sizeof(prefs.magic) &&
file.read(reinterpret_cast<uint8_t*>(&prefs), bytes_to_read) == bytes_to_read;
MQTTPrefs persisted{};
size_t bytes_to_read = min(static_cast<size_t>(file.size()), sizeof(persisted));
bool ok = bytes_to_read >= sizeof(persisted.magic) &&
file.read(reinterpret_cast<uint8_t*>(&persisted), bytes_to_read) == bytes_to_read;
file.close();
if (!ok || prefs.magic != kMagic) {
if (!ok || persisted.magic != kMagic) {
// Legacy or corrupt MQTT prefs should not survive migration. Remove the
// stale file and persist a clean current-format default copy immediately.
fs->remove(kFilename);
save(fs, prefs);
return false;
}
prefs = persisted;
if (prefs.wifi_powersave > 2) {
prefs.wifi_powersave = 0;
}
+34 -16
Datei anzeigen
@@ -164,6 +164,27 @@ void MQTTUplink::reconnectWifi() {
_last_wifi_attempt = 0;
}
bool MQTTUplink::sendStatusNow() {
if (!_running || !_have_time_sync || WiFi.status() != WL_CONNECTED) {
return false;
}
bool any_connected = false;
for (const BrokerState& broker : _brokers) {
if ((_prefs.enabled_mask & broker.spec->bit) != 0 && broker.connected && broker.client != nullptr) {
any_connected = true;
break;
}
}
if (!any_connected) {
return false;
}
publishStatus(true);
_last_status_publish = millis();
return true;
}
void MQTTUplink::makeSafeToken(const char* input, char* output, size_t output_size) {
if (output_size == 0) {
return;
@@ -334,6 +355,7 @@ void MQTTUplink::destroyBroker(BrokerState& broker) {
broker.client = nullptr;
}
broker.connected = false;
broker.connect_announced = false;
}
void MQTTUplink::queuePublish(BrokerState& broker, const char* topic, const char* payload, bool retain) {
@@ -728,10 +750,13 @@ void MQTTUplink::loop(const MQTTStatusSnapshot& snapshot) {
ensureWebServer();
for (BrokerState& broker : _brokers) {
bool was_connected = broker.connected;
ensureBroker(broker);
if (!was_connected && broker.connected) {
if (broker.connected && !broker.connect_announced) {
publishOnlineStatus(broker);
broker.connect_announced = true;
_last_status_publish = millis();
} else if (!broker.connected) {
broker.connect_announced = false;
}
}
@@ -808,10 +833,10 @@ void MQTTUplink::formatStatusReply(char* reply, size_t reply_size) const {
return "retry";
};
snprintf(reply, reply_size, "> wifi:%s ntp:%s iata:%s eastmesh-au:%s letsmesh-eu:%s letsmesh-us:%s tx:%s",
snprintf(reply, reply_size, "> wifi:%s ntp:%s iata:%s eastmesh-au:%s letsmesh-eu:%s letsmesh-us:%s status:%s tx:%s",
getWifiStateLabel(_prefs, _wifi_started), _have_time_sync ? "up" : "wait", _prefs.iata,
broker_state(_brokers[0]), broker_state(_brokers[1]), broker_state(_brokers[2]),
_prefs.tx_enabled ? "on" : "off");
_prefs.status_enabled ? "on" : "off", _prefs.tx_enabled ? "on" : "off");
}
void MQTTUplink::formatWebStatusReply(char* reply, size_t reply_size) const {
@@ -877,9 +902,7 @@ bool MQTTUplink::setWebEnabled(bool enabled) {
#if WITH_WEB_PANEL
_prefs.web_enabled = enabled ? 1 : 0;
bool ok = savePrefs();
if (_prefs.web_enabled == 0) {
stopWebServer();
} else {
if (_prefs.web_enabled != 0) {
ensureWebServer();
}
return ok;
@@ -960,9 +983,7 @@ bool MQTTUplink::setOwnerPublicKey(const char* owner_public_key) {
if (owner_public_key[0] == 0) {
_prefs.owner_public_key[0] = 0;
bool ok = savePrefs();
reconnectWifi();
return ok;
return savePrefs();
}
if (strlen(owner_public_key) != 64) {
@@ -976,9 +997,7 @@ bool MQTTUplink::setOwnerPublicKey(const char* owner_public_key) {
_prefs.owner_public_key[i] = toupper(static_cast<unsigned char>(owner_public_key[i]));
}
_prefs.owner_public_key[64] = 0;
bool ok = savePrefs();
reconnectWifi();
return ok;
return savePrefs();
}
bool MQTTUplink::setOwnerEmail(const char* owner_email) {
@@ -986,9 +1005,7 @@ bool MQTTUplink::setOwnerEmail(const char* owner_email) {
return false;
}
StrHelper::strncpy(_prefs.owner_email, owner_email, sizeof(_prefs.owner_email));
bool ok = savePrefs();
reconnectWifi();
return ok;
return savePrefs();
}
void MQTTUplink::formatWifiStatusReply(char* reply, size_t reply_size) const {
@@ -1077,6 +1094,7 @@ bool MQTTUplink::setOwnerPublicKey(const char*) { return false; }
bool MQTTUplink::setOwnerEmail(const char*) { return false; }
void MQTTUplink::formatWifiStatusReply(char* reply, size_t reply_size) const { snprintf(reply, reply_size, "> unsupported"); }
void MQTTUplink::reconnectWifi() {}
bool MQTTUplink::sendStatusNow() { return false; }
#endif
+2
Datei anzeigen
@@ -77,6 +77,7 @@ public:
const char* getOwnerEmail() const { return _prefs.owner_email; }
void formatWifiStatusReply(char* reply, size_t reply_size) const;
void reconnectWifi();
bool sendStatusNow();
private:
#if defined(ESP_PLATFORM)
@@ -92,6 +93,7 @@ private:
const BrokerSpec* spec;
esp_mqtt_client_handle_t client;
bool connected;
bool connect_announced;
unsigned long last_connect_attempt;
time_t token_expires_at;
char username[70];