From 8b0255e4038eeebeeefda3b7059d007c0573ae2d Mon Sep 17 00:00:00 2001 From: Victus Date: Mon, 11 May 2026 01:40:09 +0200 Subject: [PATCH] Wdrozenie 3 etapowego flagowania z wysylaniem ACK do serwera podczas uploadu --- include/APIClient.h | 2 ++ src/APIClient.cpp | 75 ++++++++++++++++++++++++++++++++++++++++--- src/UploadManager.cpp | 7 ++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/include/APIClient.h b/include/APIClient.h index b4a89c4..b9980ee 100644 --- a/include/APIClient.h +++ b/include/APIClient.h @@ -14,7 +14,9 @@ public: APIClient(); bool uploadMeasurement(const String& filePath); + int checkDeviceFlags(); bool fetchWiFiConfig(); + bool sendWiFiAck(); }; #endif diff --git a/src/APIClient.cpp b/src/APIClient.cpp index 9ba373a..850e8f3 100644 --- a/src/APIClient.cpp +++ b/src/APIClient.cpp @@ -145,14 +145,12 @@ bool APIClient::fetchWiFiConfig() { String payload = http.getString(); ESP_LOGI(TAG_API, "Received config payload: %s", payload.c_str()); - // Proste wyciąganie danych z JSON bez ArduinoJson (oszczędność pamięci) - // Oczekiwany format: {"ssid": "MojaSiec", "password": "MojeHaslo"} int ssidStart = payload.indexOf("\"ssid\""); int passStart = payload.indexOf("\"password\""); if (ssidStart >= 0 && passStart >= 0) { - int ssidValStart = payload.indexOf("\"", ssidStart + 6); // pomiń "ssid" - ssidValStart = payload.indexOf("\"", ssidValStart + 1) + 1; // znajdź początek wartości + int ssidValStart = payload.indexOf("\"", ssidStart + 6); + ssidValStart = payload.indexOf("\"", ssidValStart + 1) + 1; int ssidValEnd = payload.indexOf("\"", ssidValStart); String newSSID = payload.substring(ssidValStart, ssidValEnd); @@ -182,11 +180,15 @@ bool APIClient::fetchWiFiConfig() { fw.println(newSSID + ";" + newPass); fw.close(); ESP_LOGI(TAG_API, "Saved new WiFi config to SD: %s", newSSID.c_str()); + sendWiFiAck(); http.end(); return true; } } else { ESP_LOGI(TAG_API, "WiFi config already exists, skipping."); + sendWiFiAck(); + http.end(); + return true; } } } else { @@ -201,3 +203,68 @@ bool APIClient::fetchWiFiConfig() { http.end(); return false; } + +int APIClient::checkDeviceFlags() { + if (WiFi.status() != WL_CONNECTED) { + return -1; + } + + HTTPClient http; + String url = String(config.restURL) + ":" + String(config.restPort) + "/config/flags?sn=" + String(config.restUser); + + ESP_LOGI(TAG_API, "Checking flags from: %s", url.c_str()); + http.begin(url); + http.setAuthorization(config.restUser, config.restPass); + + int httpCode = http.GET(); + int flagValue = -1; + + if (httpCode == HTTP_CODE_OK || httpCode == 200) { + String payload = http.getString(); + int flagStart = payload.indexOf("\"wifi_update\""); + if (flagStart >= 0) { + int valStart = payload.indexOf(":", flagStart) + 1; + int valEnd = payload.indexOf("}", valStart); + if (valEnd < 0) valEnd = payload.indexOf(",", valStart); + + String valStr = payload.substring(valStart, valEnd); + valStr.trim(); + flagValue = valStr.toInt(); + ESP_LOGI(TAG_API, "Flag wifi_update detected: %d", flagValue); + } else { + ESP_LOGE(TAG_API, "Flag wifi_update not found in JSON"); + } + } else { + ESP_LOGE(TAG_API, "Failed to check flags. HTTP code: %d", httpCode); + } + + http.end(); + return flagValue; +} + +bool APIClient::sendWiFiAck() { + if (WiFi.status() != WL_CONNECTED) { + return false; + } + + HTTPClient http; + String url = String(config.restURL) + ":" + String(config.restPort) + "/config/wifi/ack?sn=" + String(config.restUser); + + ESP_LOGI(TAG_API, "Sending ACK to: %s", url.c_str()); + http.begin(url); + http.setAuthorization(config.restUser, config.restPass); + http.addHeader("Content-Type", "application/json"); + + int httpCode = http.POST("{\"status\":\"ok\"}"); + bool success = false; + + if (httpCode == HTTP_CODE_OK || httpCode == 200 || httpCode == 201) { + ESP_LOGI(TAG_API, "ACK sent successfully"); + success = true; + } else { + ESP_LOGE(TAG_API, "Failed to send ACK. HTTP code: %d", httpCode); + } + + http.end(); + return success; +} diff --git a/src/UploadManager.cpp b/src/UploadManager.cpp index f23ee0a..095acd3 100644 --- a/src/UploadManager.cpp +++ b/src/UploadManager.cpp @@ -80,6 +80,13 @@ void UploadManager::uploadFile(const String& filePath) { void UploadManager::processPendingUploads() { if (WiFi.status() != WL_CONNECTED) return; + ESP_LOGI(TAG_UPLOAD, "Checking API flags..."); + int flags = apiClient.checkDeviceFlags(); + if (flags == 1) { + ESP_LOGI(TAG_UPLOAD, "Flag = 1. Fetching new WiFi config..."); + apiClient.fetchWiFiConfig(); + } + ESP_LOGI(TAG_UPLOAD, "Checking for pending uploads..."); ESP_LOGI(TAG_UPLOAD, "DEBUG: findHighestNumericDir()"); uint32_t highestDir = capture_.findHighestNumericDir();