JXCT Soil Sensor 7-in-1 v3.4.9 (June 2025)
Professional IoT soil monitoring system with ESP32, Modbus RTU, MQTT, and advanced compensation algorithms
Загрузка...
Поиск...
Не найдено
routes_main.cpp
См. документацию.
5#include "../wifi_manager.h"
6
8{
9 // Главная страница — настройки Wi-Fi (и MQTT/ThingSpeak/HASS в STA)
10 webServer.on("/", HTTP_GET, handleRoot);
11 webServer.on("/", HTTP_POST, handleRoot); // Добавляем обработку POST для авторизации
12
13 // Сохранение настроек
14 webServer.on(
15 "/save", HTTP_POST,
16 []()
17 {
18 logWebRequest("POST", "/save", webServer.client().remoteIP().toString());
19
20 // Валидация входных данных
21 if (!validateConfigInput(true))
22 {
23 String errorMsg = "Заполните все обязательные поля";
24
25 // В режиме AP проверяем только SSID
27 (!webServer.hasArg("ssid") || webServer.arg("ssid").length() == 0))
28 {
29 errorMsg = "Ошибка: заполните поле SSID";
30 }
31
32 String html = generateValidationErrorResponse(errorMsg);
33 webServer.send(400, "text/html; charset=utf-8", html);
34 return;
35 }
36
37 // Сохранение настроек в конфигурацию
38 strlcpy(config.ssid, webServer.arg("ssid").c_str(), sizeof(config.ssid));
39 strlcpy(config.password, webServer.arg("password").c_str(), sizeof(config.password));
40
41 // Сохраняем остальные настройки только в режиме STA
43 {
44 // ✅ Явное приведение bool для битовых полей
45 config.flags.mqttEnabled = (uint8_t)webServer.hasArg("mqtt_enabled");
46 strlcpy(config.mqttServer, webServer.arg("mqtt_server").c_str(), sizeof(config.mqttServer));
47 config.mqttPort = webServer.arg("mqtt_port").toInt();
48 strlcpy(config.mqttUser, webServer.arg("mqtt_user").c_str(), sizeof(config.mqttUser));
49 strlcpy(config.mqttPassword, webServer.arg("mqtt_password").c_str(), sizeof(config.mqttPassword));
50 config.flags.hassEnabled = (uint8_t)webServer.hasArg("hass_enabled");
51 config.flags.thingSpeakEnabled = (uint8_t)webServer.hasArg("ts_enabled");
52 strlcpy(config.thingSpeakApiKey, webServer.arg("ts_api_key").c_str(), sizeof(config.thingSpeakApiKey));
53 config.mqttQos = webServer.arg("mqtt_qos").toInt();
54 strlcpy(config.thingSpeakChannelId, webServer.arg("ts_channel_id").c_str(),
55 sizeof(config.thingSpeakChannelId));
56 config.flags.useRealSensor = (uint8_t)webServer.hasArg("real_sensor");
57 config.flags.calibrationEnabled = (uint8_t)webServer.hasArg("cal_enabled");
58 // Тип среды выращивания v2.6.1
59 if (webServer.hasArg("env_type"))
60 config.environmentType = webServer.arg("env_type").toInt();
61 else
62 config.environmentType = 0;
63 // Сезонная поправка
64 config.flags.seasonalAdjustEnabled = (uint8_t)webServer.hasArg("season_adj");
65
66 // Обратная совместимость
67 config.flags.isGreenhouse = (config.environmentType == 1);
68
69 if (webServer.hasArg("latitude"))
70 config.latitude = webServer.arg("latitude").toFloat();
71 if (webServer.hasArg("longitude"))
72 config.longitude = webServer.arg("longitude").toFloat();
73
74 if (webServer.hasArg("crop"))
75 strlcpy(config.cropId, webServer.arg("crop").c_str(), sizeof(config.cropId));
76
77 if (webServer.hasArg("soil_profile_sel"))
78 {
79 config.soilProfile = webServer.arg("soil_profile_sel").toInt();
80 }
81 strlcpy(config.ntpServer, webServer.arg("ntp_server").c_str(), sizeof(config.ntpServer));
82 config.ntpUpdateInterval = webServer.arg("ntp_interval").toInt();
83 // Сохраняем пароль веб-интерфейса
84 strlcpy(config.webPassword, webServer.arg("web_password").c_str(), sizeof(config.webPassword));
85
86 if (webServer.hasArg("irrig_th"))
87 config.irrigationSpikeThreshold = webServer.arg("irrig_th").toFloat();
88 if (webServer.hasArg("irrig_hold"))
89 config.irrigationHoldMinutes = webServer.arg("irrig_hold").toInt();
90
91 logInfo("Конфигурация обновлена: MQTT=%s, ThingSpeak=%s, HASS=%s",
92 config.flags.mqttEnabled ? "ON" : "OFF", config.flags.thingSpeakEnabled ? "ON" : "OFF",
93 config.flags.hassEnabled ? "ON" : "OFF");
94 }
95
96 // Сохранение в NVS
97 saveConfig();
98
99 // Отправка страницы успеха
100 String html = generateSuccessPage("Настройки сохранены",
101 "Настройки сохранены успешно. Устройство перезагружается...", "/", 1);
102
103 webServer.send(200, "text/html; charset=utf-8", html);
104
105 logSuccess("Настройки сохранены успешно");
106 delay(1000);
107 ESP.restart();
108 });
109
110 // Статус (уже реализован в wifi_manager.cpp)
111 webServer.on("/status", HTTP_GET, handleStatus);
112
113 logDebug("Основные маршруты настроены: /, /save, /status");
114}
Config config
Определения config.cpp:34
void saveConfig()
Определения config.cpp:128
bool validateConfigInput(bool checkRequired)
Валидация входных данных конфигурации
Определения error_handlers.cpp:30
void logWebRequest(const String &method, const String &uri, const String &clientIP)
Логирование веб-запросов
Определения error_handlers.cpp:152
String generateValidationErrorResponse(const String &errorMsg)
Генерация HTML ответа с ошибкой валидации
Определения error_handlers.cpp:172
void logDebug(const char *format,...)
Определения logger.cpp:112
void logSuccess(const char *format,...)
Определения logger.cpp:129
void logInfo(const char *format,...)
Определения logger.cpp:95
Система логгирования с красивым форматированием
WebServer webServer
WiFiMode currentWiFiMode
Определения wifi_manager.cpp:26
void setupMainRoutes()
Настройка основных маршрутов (/, /save, /status)
Определения routes_main.cpp:7
String generateSuccessPage(const String &title, const String &message, const String &redirectUrl, int redirectDelay)
Генерация страницы успеха
Определения web_templates.cpp:42
void handleStatus()
Обработчик статуса (уже существует в wifi_manager.cpp)
Определения wifi_manager.cpp:343
void handleRoot()
Обработчик главной страницы (уже существует в wifi_manager.cpp)
Определения wifi_manager.cpp:394
@ AP
Определения wifi_manager.h:13
@ STA
Определения wifi_manager.h:14