From 9eb6122fe1af173d7ba133eff01db618fc5da1bf Mon Sep 17 00:00:00 2001 From: IoT Manager <67171972+IoTManagerProject@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:01:15 +0200 Subject: [PATCH] =?UTF-8?q?452=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B2=D0=B8=D0=B4?= =?UTF-8?q?=D0=B6=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B2=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/build/bundle.css.gz | Bin 5778 -> 5778 bytes data_svelte/build/bundle.js.gz | Bin 54516 -> 54534 bytes data_svelte/index.html | 6 +- include/Const.h | 38 +- src/EspFileSystem.cpp | 58 +-- src/WsServer.cpp | 616 ++++++++++++++++---------------- 6 files changed, 367 insertions(+), 351 deletions(-) diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index 3fe38c312f9a197dd86e40185a5a2be3b3e16fb1..1cf84b119b1c440f4bf9791d73bc960209109dd6 100644 GIT binary patch delta 16 XcmbQFJ4u&azMF%?Z@$7t_HHo%C^!VB delta 16 XcmbQFJ4u&azMF$%)?4|F?A>AjEE@$s diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index 1b7968a26e07c9f8b0f64136dff2193f245bc821..04dc22a59c178465754e9480929d92058033d0ed 100644 GIT binary patch delta 47996 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 UHz3&+$!VVX9Ra=PUWFqA0D?K#2mk;8 delta 48000 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 Yn8za|-jGC1BvyIucNg@i_B0~{0Pp-Sr2qf` diff --git a/data_svelte/index.html b/data_svelte/index.html index a8152c52..8b97c0b8 100644 --- a/data_svelte/index.html +++ b/data_svelte/index.html @@ -4,12 +4,12 @@ - IoT Manager 4.5.1 + IoT Manager 4.5.2 - + - + diff --git a/include/Const.h b/include/Const.h index 754121aa..fb496220 100644 --- a/include/Const.h +++ b/include/Const.h @@ -2,7 +2,7 @@ #include "BuildTime.h" // Версия прошивки -#define FIRMWARE_VERSION 451 +#define FIRMWARE_VERSION 452 #ifdef esp8266_1mb_ota #define FIRMWARE_NAME "esp8266_1mb_ota" @@ -41,7 +41,7 @@ #endif // Размер буфера json -#define JSON_BUFFER_SIZE 4096 // держим 2 кб не меняем +#define JSON_BUFFER_SIZE 4096 // держим 2 кб не меняем /* WEB_SOCKETS_FRAME_SIZE создан для того что бы не загружать оперативку. @@ -70,22 +70,22 @@ WEB_SOCKETS_FRAME_SIZE создан для того что бы не загру #define USE_LITTLEFS true -#define START_DATETIME 1661990400 // 01.09.2022 00:00:00 константа для сокращения unix time +#define START_DATETIME 1661990400 // 01.09.2022 00:00:00 константа для сокращения unix time #define MIN_DATETIME 1575158400 #define LEAP_YEAR(Y) (((1970 + Y) > 0) && !((1970 + Y) % 4) && (((1970 + Y) % 100) || !((1970 + Y) % 400))) // задачи таскера enum TimerTask_t { WIFI_SCAN, - WIFI_MQTT_CONNECTION_CHECK, - TIME, - TIME_SYNC, - UPTIME, - UDP, // UDPP - TIMES, // периодические секундные проверки - PTASK, - ST, - END }; + WIFI_MQTT_CONNECTION_CHECK, + TIME, + TIME_SYNC, + UPTIME, + UDP, // UDPP + TIMES, // периодические секундные проверки + PTASK, + ST, + END }; // задачи которые надо протащить через loop enum NotAsyncActions { @@ -96,13 +96,13 @@ enum NotAsyncActions { // состояния обновления enum UpdateStates { NOT_STARTED, - UPDATE_FS_IN_PROGRESS, - UPDATE_FS_COMPLETED, - UPDATE_FS_FAILED, - UPDATE_BUILD_IN_PROGRESS, - UPDATE_BUILD_COMPLETED, - UPDATE_BUILD_FAILED, - PATH_ERROR + UPDATE_FS_IN_PROGRESS, + UPDATE_FS_COMPLETED, + UPDATE_FS_FAILED, + UPDATE_BUILD_IN_PROGRESS, + UPDATE_BUILD_COMPLETED, + UPDATE_BUILD_FAILED, + PATH_ERROR }; enum distination { diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index cac9df49..ef885187 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -1,7 +1,8 @@ #include "EspFileSystem.h" #include "Global.h" -bool fileSystemInit() { +bool fileSystemInit() +{ if (!FileFS.begin()) { SerialPrint(F("E"), F("FS"), F("Init ERROR, may be FS was not flashed")); return false; @@ -10,7 +11,8 @@ bool fileSystemInit() { return true; } -void globalVarsSync() { +void globalVarsSync() +{ settingsFlashJson = readFile(F("settings.json"), 4096); settingsFlashJson.replace("\r\n", ""); @@ -18,44 +20,42 @@ void globalVarsSync() { valuesFlashJson.replace("\r\n", ""); mqttPrefix = jsonReadStr(settingsFlashJson, F("mqttPrefix")); - mqttRootDevice = mqttPrefix + "/" + chipId; - jsonWriteStr_(settingsFlashJson, "root", mqttRootDevice); jsonWriteStr_(settingsFlashJson, "id", chipId); - // jsonWriteStr_(errorsHeapJson, "errors_", ""); //метка для парсинга удалить - // jsonWriteStr_(ssidListHeapJson, "ssids_", ""); //метка для парсинга удалить + mqttRootDevice = mqttPrefix + "/" + chipId; + + // это не используется - удалить в последствии + jsonWriteStr_(settingsFlashJson, "root", mqttRootDevice); } -// к удалению. не используется -// String getParamsJson() { -// String json; -// serializeJson(*getLocalItemsAsJSON(), json); -// jsonWriteStr_(json, "params", ""); -// return json; -// } - -void syncSettingsFlashJson() { +void syncSettingsFlashJson() +{ writeFile(F("settings.json"), settingsFlashJson); } -void syncValuesFlashJson() { +void syncValuesFlashJson() +{ writeFile(F("values.json"), valuesFlashJson); } -const String getChipId() { - return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION); +const String getChipId() +{ + return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION); } -void setChipId() { +void setChipId() +{ chipId = getChipId(); SerialPrint("i", "System", "id: " + chipId); } -const String getUniqueId(const char* name) { +const String getUniqueId(const char* name) +{ return String(name) + getMacAddress(); } -const String getWebVersion() { +const String getWebVersion() +{ String text = readFile("/index.html", 2000); text = selectFromMarkerToMarker(text, "title", 1); text = selectFromMarkerToMarker(text, " ", 2); @@ -64,7 +64,8 @@ const String getWebVersion() { return text; } -uint32_t ESP_getChipId(void) { +uint32_t ESP_getChipId(void) +{ #ifdef ESP32 uint32_t id = 0; for (uint32_t i = 0; i < 17; i = i + 8) { @@ -78,7 +79,8 @@ uint32_t ESP_getChipId(void) { // устарела используем новую функцию ниже #ifndef esp32s2_4mb -uint32_t ESP_getFlashChipId(void) { +uint32_t ESP_getFlashChipId(void) +{ #ifdef ESP32 // Нет аналогичной (без доп.кода) функций в 32 // надо использовать другой id - варианты есть @@ -92,7 +94,8 @@ uint32_t ESP_getFlashChipId(void) { // https://github.com/espressif/arduino-esp32/issues/6945#issuecomment-1199900892 // получение flash ch id из проекта esp easy -uint32_t getFlashChipIdNew() { +uint32_t getFlashChipIdNew() +{ // Cache since size does not change static uint32_t flashChipId = 0; @@ -109,14 +112,15 @@ uint32_t getFlashChipIdNew() { // esp_flash_read_id(nullptr, &flashChipId); #elif defined(ESP8266) flashChipId = ESP.getFlashChipId(); -#endif // ifdef ESP32 +#endif // ifdef ESP32 } return flashChipId; } -const String getMacAddress() { +const String getMacAddress() +{ uint8_t mac[6]; - char buf[13] = {0}; + char buf[13] = { 0 }; #if defined(ESP8266) WiFi.macAddress(mac); sprintf(buf, MACSTR, MAC2STR(mac)); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 279ac301..4030baef 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -3,334 +3,339 @@ extern IoTScenario iotScen; #ifdef STANDARD_WEB_SOCKETS -void standWebSocketsInit() { +void standWebSocketsInit() +{ standWebSocket.begin(); standWebSocket.onEvent(webSocketEvent); SerialPrint("i", "WS", "WS server initialized"); } void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, - size_t length) { + size_t length) +{ switch (type) { - case WStype_ERROR: { - Serial.printf("[%u] Error!\n", num); - } break; + case WStype_ERROR: { + Serial.printf("[%u] Error!\n", num); + } break; - case WStype_DISCONNECTED: { - Serial.printf("[%u] Disconnected!\n", num); - } break; + case WStype_DISCONNECTED: { + Serial.printf("[%u] Disconnected!\n", num); + } break; - case WStype_CONNECTED: { - // IPAddress ip = standWebSocket.remoteIP(num); - SerialPrint("i", "WS " + String(num), "WS client connected"); - if (num >= 3) { - SerialPrint("E", "WS", "Too many clients, connection closed!!!"); - jsonWriteInt(errorsHeapJson, "wse1", 1); - standWebSocket.close(); - standWebSocketsInit(); + case WStype_CONNECTED: { + // IPAddress ip = standWebSocket.remoteIP(num); + SerialPrint("i", "WS " + String(num), "WS client connected"); + if (num >= 3) { + SerialPrint("E", "WS", "Too many clients, connection closed!!!"); + jsonWriteInt(errorsHeapJson, "wse1", 1); + standWebSocket.close(); + standWebSocketsInit(); + } + // Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], + // ip[1], ip[2], ip[3], payload); standWebSocket.sendTXT(num, + // "Connected"); + } break; + + case WStype_TEXT: { + bool endOfHeaderFound = false; + size_t maxAllowedHeaderSize = 15; // максимальное количество символов заголовка + size_t headerLenth = 0; + String headerStr; + for (size_t i = 0; i <= maxAllowedHeaderSize; i++) { + headerLenth++; + char s = (char)payload[i]; + headerStr += s; + if (s == '|') { + endOfHeaderFound = true; + break; } - // Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], - // ip[1], ip[2], ip[3], payload); standWebSocket.sendTXT(num, - // "Connected"); - } break; + } + if (!endOfHeaderFound) { + SerialPrint("E", "WS " + String(num), "Package without header"); + } - case WStype_TEXT: { - bool endOfHeaderFound = false; - size_t maxAllowedHeaderSize = 15; // максимальное количество символов заголовка - size_t headerLenth = 0; - String headerStr; - for (size_t i = 0; i <= maxAllowedHeaderSize; i++) { - headerLenth++; - char s = (char)payload[i]; - headerStr += s; - if (s == '|') { - endOfHeaderFound = true; - break; - } - } - if (!endOfHeaderFound) { - SerialPrint("E", "WS " + String(num), "Package without header"); - } + //----------------------------------------------------------------------// + // Страница веб интерфейса dashboard + //----------------------------------------------------------------------// - //----------------------------------------------------------------------// - // Страница веб интерфейса dashboard - //----------------------------------------------------------------------// + // публикация всех виджетов + if (headerStr == "/|") { + sendFileToWsByFrames("/layout.json", "layout", "", num, WEB_SOCKETS_FRAME_SIZE); + } - // публикация всех виджетов - if (headerStr == "/|") { - sendFileToWsByFrames("/layout.json", "layout", "", num, WEB_SOCKETS_FRAME_SIZE); - } - - if (headerStr == "/params|") { - // публикация всех статус сообщений при подключении svelte приложения - String params = "{}"; - for (std::list::iterator it = IoTItems.begin(); - it != IoTItems.end(); ++it) { - if ((*it)->getSubtype() != "Loging") { - if ((*it)->getSubtype() != "LogingDaily") { - if ((*it)->iAmLocal) - jsonWriteStr(params, (*it)->getID(), (*it)->getValue()); - } - } - } - sendStringToWs("params", params, num); - - // генерация события подключения в модулях - for (std::list::iterator it = IoTItems.begin(); - it != IoTItems.end(); ++it) { - if ((*it)->iAmLocal) (*it)->onMqttWsAppConnectEvent(); - } - } - - // отвечаем на запрос графиков - if (headerStr == "/charts|") { - // обращение к логированию из ядра - // отправка данных графиков только в выбранный сокет - for (std::list::iterator it = IoTItems.begin(); - it != IoTItems.end(); ++it) { - // сбрасываем даты графиков - // if ((*it)->getID().endsWith("-date")) { - // (*it)->setTodayDate(); - // } - if ((*it)->getSubtype() == "Loging" || "LogingDaily") { - (*it)->setPublishDestination(TO_WS, num); - (*it)->publishValue(); + if (headerStr == "/params|") { + // публикация всех статус сообщений при подключении svelte приложения + String params = "{}"; + for (std::list::iterator it = IoTItems.begin(); + it != IoTItems.end(); ++it) { + if ((*it)->getSubtype() != "Loging") { + if ((*it)->getSubtype() != "LogingDaily") { + if ((*it)->iAmLocal) + jsonWriteStr(params, (*it)->getID(), (*it)->getValue()); } } } + sendStringToWs("params", params, num); - //----------------------------------------------------------------------// - // Страница веб интерфейса configutation - //----------------------------------------------------------------------// - - // отвечаем данными на запрос страницы - if (headerStr == "/config|") { - sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE); - sendFileToWsByFrames("/widgets.json", "widget", "", num, WEB_SOCKETS_FRAME_SIZE); - sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); - sendFileToWsByFrames("/scenario.txt", "scenar", "", num, WEB_SOCKETS_FRAME_SIZE); - sendStringToWs("settin", settingsFlashJson, num); + // генерация события подключения в модулях + for (std::list::iterator it = IoTItems.begin(); + it != IoTItems.end(); ++it) { + if ((*it)->iAmLocal) + (*it)->onMqttWsAppConnectEvent(); } + } - // обработка кнопки сохранить - if (headerStr == "/gifnoc|") { - writeFileUint8tByFrames("config.json", payload, length, headerLenth, - 256); - } - if (headerStr == "/tuoyal|") { - writeFileUint8tByFrames("layout.json", payload, length, headerLenth, - 256); - } - if (headerStr == "/oiranecs|") { - writeFileUint8tByFrames("scenario.txt", payload, length, headerLenth, - 256); - clearConfigure(); - configure("/config.json"); - iotScen.loadScenario("/scenario.txt"); - // создаем событие завершения конфигурирования для возможности - // выполнения блока кода при загрузке - createItemFromNet("onStart", "1", 1); - } - - //----------------------------------------------------------------------// - // Страница веб интерфейса connection - //----------------------------------------------------------------------// - - // отвечаем данными на запрос страницы - if (headerStr == "/connection|") { - sendStringToWs("settin", settingsFlashJson, num); - sendStringToWs("ssidli", ssidListHeapJson, num); - sendStringToWs("errors", errorsHeapJson, num); - // запуск асинхронного сканирования wifi сетей при переходе на страницу - // соединений RouterFind(jsonReadStr(settingsFlashJson, - // F("routerssid"))); - } - - // обработка кнопки сохранить settings.json - if (headerStr == "/sgnittes|") { - writeUint8tToString(payload, length, headerLenth, settingsFlashJson); - writeFileUint8tByFrames("settings.json", payload, length, headerLenth, - 256); - sendStringToWs("errors", errorsHeapJson, num); - // если не было создано приема данных по udp - то создадим его - addThisDeviceToList(); - } - - // обработка кнопки сохранить настройки mqtt - if (headerStr == "/mqtt|") { - sendStringToWs("settin", settingsFlashJson, - num); // отправляем в ответ новые полученные настройки - handleMqttStatus(false, 8); // меняем статус на неопределенный - mqttReconnect(); // начинаем переподключение - sendStringToWs("errors", errorsHeapJson, - num); // отправляем что статус неопределен - sendStringToWs("ssidli", ssidListHeapJson, num); - } - - // запуск асинхронного сканирования wifi сетей при нажатии выпадающего - // списка - if (headerStr == "/scan|") { - std::vector jArray; - jsonReadArray(settingsFlashJson, "routerssid", jArray); - RouterFind(jArray); - sendStringToWs("ssidli", ssidListHeapJson, num); - } - - //----------------------------------------------------------------------// - // Страница веб интерфейса list - //----------------------------------------------------------------------// - - // отвечаем данными на запрос страницы list - if (headerStr == "/list|") { - sendStringToWs("settin", settingsFlashJson, num); - // отправим список устройств в зависимости от того что выбрал user - // sendDeviceList(num); - } - - // отвечаем на запрос списка устройств (это отдельный запрос который - // делает приложение при подключении) - if (headerStr == "/devlist|") { - // отправим список устройств в зависимости от того что выбрал user - sendDeviceList(num); - } - - // сохраняем данные листа - if (headerStr == "/tsil|") { - writeFileUint8tByFrames("devlist.json", payload, length, headerLenth, - 256); - } - - //----------------------------------------------------------------------// - // Страница веб интерфейса system - //----------------------------------------------------------------------// - - // отвечаем данными на запрос страницы - if (headerStr == "/system|") { - sendStringToWs("errors", errorsHeapJson, num); - sendStringToWs("settin", settingsFlashJson, num); - } - - //----------------------------------------------------------------------// - // Страница веб интерфейса dev - //----------------------------------------------------------------------// - if (headerStr == "/dev|") { - sendStringToWs("errors", errorsHeapJson, num); - sendStringToWs("settin", settingsFlashJson, num); - sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); - sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE); - // sendFileToWsByFrames("/layout.json", "layout", "", num, - // WEB_SOCKETS_FRAME_SIZE); - } - - //----------------------------------------------------------------------// - // Страница веб интерфейса update - //----------------------------------------------------------------------// - if (headerStr == "/profile|") { - sendFileToWsByFrames("/myProfile.json", "prfile", "", num, - WEB_SOCKETS_FRAME_SIZE); - } - - //----------------------------------------------------------------------// - // отдельные команды веб интерфейса - //----------------------------------------------------------------------// - - // переписать любое поле в errors json - if (headerStr == "/rorre|") { - writeUint8tValueToJsonString(payload, length, headerLenth, errorsHeapJson); - } - - // команда перезагрузки esp - if (headerStr == "/reboot|") { - ESP.restart(); - } - - // команда очистки всех логов esp - if (headerStr == "/clean|") { - cleanLogs(); - } - - // команда обновления прошивки esp - if (headerStr == "/update|") { - String path; - writeUint8tToString(payload, length, headerLenth, path); - upgrade_firmware(3, path); - } - - // Прием команд control c dashboard - if (headerStr == "/control|") { - String msg; - writeUint8tToString(payload, length, headerLenth, msg); - String key = selectFromMarkerToMarker(msg, "/", 0); - String value = selectFromMarkerToMarker(msg, "/", 1); - generateOrder(key, value); - SerialPrint("i", F("=>WS"), "Msg from svelte web, WS No: " + String(num) + ", msg: " + msg); - } - - if (headerStr == "/tst|") { - standWebSocket.sendTXT(num, "/tstr|"); - } - - // получаем команду посланную из модуля - if (headerStr == "/order|") { - String json; - writeUint8tToString(payload, length, headerLenth, json); - - String id, key, value; - jsonRead(json, "id", id); - jsonRead(json, "key", key); - jsonRead(json, "value", value); - - SerialPrint("i", F("=>WS"), "Msg from module, id: " + id); - - for (std::list::iterator it = IoTItems.begin(); - it != IoTItems.end(); ++it) { - if ((*it)->getID() == id) { - (*it)->onModuleOrder(key, value); - } + // отвечаем на запрос графиков + if (headerStr == "/charts|") { + // обращение к логированию из ядра + // отправка данных графиков только в выбранный сокет + for (std::list::iterator it = IoTItems.begin(); + it != IoTItems.end(); ++it) { + // сбрасываем даты графиков + // if ((*it)->getID().endsWith("-date")) { + // (*it)->setTodayDate(); + // } + if ((*it)->getSubtype() == "Loging" || "LogingDaily") { + (*it)->setPublishDestination(TO_WS, num); + (*it)->publishValue(); } } + } - } break; + //----------------------------------------------------------------------// + // Страница веб интерфейса configutation + //----------------------------------------------------------------------// - case WStype_BIN: { - Serial.printf("[%u] get binary length: %u\n", num, length); - // hexdump(payload, length); - // standWebSocket.sendBIN(num, payload, length); - } break; + // отвечаем данными на запрос страницы + if (headerStr == "/config|") { + sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE); + sendFileToWsByFrames("/widgets.json", "widget", "", num, WEB_SOCKETS_FRAME_SIZE); + sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); + sendFileToWsByFrames("/scenario.txt", "scenar", "", num, WEB_SOCKETS_FRAME_SIZE); + sendStringToWs("settin", settingsFlashJson, num); + } - case WStype_FRAGMENT_TEXT_START: { - Serial.printf("[%u] fragment test start: %u\n", num, length); - } break; + // обработка кнопки сохранить + if (headerStr == "/gifnoc|") { + writeFileUint8tByFrames("config.json", payload, length, headerLenth, + 256); + } + if (headerStr == "/tuoyal|") { + writeFileUint8tByFrames("layout.json", payload, length, headerLenth, + 256); + } + if (headerStr == "/oiranecs|") { + writeFileUint8tByFrames("scenario.txt", payload, length, headerLenth, + 256); + clearConfigure(); + configure("/config.json"); + iotScen.loadScenario("/scenario.txt"); + // создаем событие завершения конфигурирования для возможности + // выполнения блока кода при загрузке + createItemFromNet("onStart", "1", 1); + } - case WStype_FRAGMENT_BIN_START: { - Serial.printf("[%u] fragment bin start: %u\n", num, length); - } break; + //----------------------------------------------------------------------// + // Страница веб интерфейса connection + //----------------------------------------------------------------------// - case WStype_FRAGMENT: { - Serial.printf("[%u] fragment: %u\n", num, length); - } break; + // отвечаем данными на запрос страницы + if (headerStr == "/connection|") { + sendFileToWsByFrames("/widgets.json", "widget", "", num, WEB_SOCKETS_FRAME_SIZE); + sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); + sendStringToWs("settin", settingsFlashJson, num); + sendStringToWs("ssidli", ssidListHeapJson, num); + sendStringToWs("errors", errorsHeapJson, num); + // запуск асинхронного сканирования wifi сетей при переходе на страницу + // соединений RouterFind(jsonReadStr(settingsFlashJson, + // F("routerssid"))); + } - case WStype_FRAGMENT_FIN: { - Serial.printf("[%u] fragment finish: %u\n", num, length); - } break; + // обработка кнопки сохранить settings.json + if (headerStr == "/sgnittes|") { + writeUint8tToString(payload, length, headerLenth, settingsFlashJson); + writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256); + sendStringToWs("errors", errorsHeapJson, num); + // если не было создано приема данных по udp - то создадим его + addThisDeviceToList(); + } - case WStype_PING: { - Serial.printf("[%u] ping: %u\n", num, length); - } break; + // обработка кнопки сохранить настройки mqtt + if (headerStr == "/mqtt|") { + sendStringToWs("settin", settingsFlashJson, + num); // отправляем в ответ новые полученные настройки + handleMqttStatus(false, 8); // меняем статус на неопределенный + mqttReconnect(); // начинаем переподключение + sendStringToWs("errors", errorsHeapJson, + num); // отправляем что статус неопределен + sendStringToWs("ssidli", ssidListHeapJson, num); + } - case WStype_PONG: { - Serial.printf("[%u] pong: %u\n", num, length); - } break; + // запуск асинхронного сканирования wifi сетей при нажатии выпадающего + // списка + if (headerStr == "/scan|") { + std::vector jArray; + jsonReadArray(settingsFlashJson, "routerssid", jArray); + RouterFind(jArray); + sendStringToWs("ssidli", ssidListHeapJson, num); + } - default: { - Serial.printf("[%u] not recognized: %u\n", num, length); - } break; + //----------------------------------------------------------------------// + // Страница веб интерфейса list + //----------------------------------------------------------------------// + + // отвечаем данными на запрос страницы list + if (headerStr == "/list|") { + sendStringToWs("settin", settingsFlashJson, num); + // отправим список устройств в зависимости от того что выбрал user + // sendDeviceList(num); + } + + // отвечаем на запрос списка устройств (это отдельный запрос который + // делает приложение при подключении) + if (headerStr == "/devlist|") { + // отправим список устройств в зависимости от того что выбрал user + sendDeviceList(num); + } + + // сохраняем данные листа + if (headerStr == "/tsil|") { + writeFileUint8tByFrames("devlist.json", payload, length, headerLenth, + 256); + } + + //----------------------------------------------------------------------// + // Страница веб интерфейса system + //----------------------------------------------------------------------// + + // отвечаем данными на запрос страницы + if (headerStr == "/system|") { + sendStringToWs("errors", errorsHeapJson, num); + sendStringToWs("settin", settingsFlashJson, num); + } + + //----------------------------------------------------------------------// + // Страница веб интерфейса dev + //----------------------------------------------------------------------// + if (headerStr == "/dev|") { + sendStringToWs("errors", errorsHeapJson, num); + sendStringToWs("settin", settingsFlashJson, num); + sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); + sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE); + // sendFileToWsByFrames("/layout.json", "layout", "", num, + // WEB_SOCKETS_FRAME_SIZE); + } + + //----------------------------------------------------------------------// + // Страница веб интерфейса update + //----------------------------------------------------------------------// + if (headerStr == "/profile|") { + sendFileToWsByFrames("/myProfile.json", "prfile", "", num, + WEB_SOCKETS_FRAME_SIZE); + } + + //----------------------------------------------------------------------// + // отдельные команды веб интерфейса + //----------------------------------------------------------------------// + + // переписать любое поле в errors json + if (headerStr == "/rorre|") { + writeUint8tValueToJsonString(payload, length, headerLenth, errorsHeapJson); + } + + // команда перезагрузки esp + if (headerStr == "/reboot|") { + ESP.restart(); + } + + // команда очистки всех логов esp + if (headerStr == "/clean|") { + cleanLogs(); + } + + // команда обновления прошивки esp + if (headerStr == "/update|") { + String path; + writeUint8tToString(payload, length, headerLenth, path); + upgrade_firmware(3, path); + } + + // Прием команд control c dashboard + if (headerStr == "/control|") { + String msg; + writeUint8tToString(payload, length, headerLenth, msg); + String key = selectFromMarkerToMarker(msg, "/", 0); + String value = selectFromMarkerToMarker(msg, "/", 1); + generateOrder(key, value); + SerialPrint("i", F("=>WS"), "Msg from svelte web, WS No: " + String(num) + ", msg: " + msg); + } + + if (headerStr == "/tst|") { + standWebSocket.sendTXT(num, "/tstr|"); + } + + // получаем команду посланную из модуля + if (headerStr == "/order|") { + String json; + writeUint8tToString(payload, length, headerLenth, json); + + String id, key, value; + jsonRead(json, "id", id); + jsonRead(json, "key", key); + jsonRead(json, "value", value); + + SerialPrint("i", F("=>WS"), "Msg from module, id: " + id); + + for (std::list::iterator it = IoTItems.begin(); + it != IoTItems.end(); ++it) { + if ((*it)->getID() == id) { + (*it)->onModuleOrder(key, value); + } + } + } + + } break; + + case WStype_BIN: { + Serial.printf("[%u] get binary length: %u\n", num, length); + // hexdump(payload, length); + // standWebSocket.sendBIN(num, payload, length); + } break; + + case WStype_FRAGMENT_TEXT_START: { + Serial.printf("[%u] fragment test start: %u\n", num, length); + } break; + + case WStype_FRAGMENT_BIN_START: { + Serial.printf("[%u] fragment bin start: %u\n", num, length); + } break; + + case WStype_FRAGMENT: { + Serial.printf("[%u] fragment: %u\n", num, length); + } break; + + case WStype_FRAGMENT_FIN: { + Serial.printf("[%u] fragment finish: %u\n", num, length); + } break; + + case WStype_PING: { + Serial.printf("[%u] ping: %u\n", num, length); + } break; + + case WStype_PONG: { + Serial.printf("[%u] pong: %u\n", num, length); + } break; + + default: { + Serial.printf("[%u] not recognized: %u\n", num, length); + } break; } } // публикация статус сообщений в ws (недостаток в том что делаем бродкаст всем // клиентам поднятым в свелте!!!) -void publishStatusWs(const String& topic, const String& data) { +void publishStatusWs(const String& topic, const String& data) +{ String path = mqttRootDevice + "/" + topic; String json = "{}"; jsonWriteStr(json, "status", data); @@ -339,7 +344,8 @@ void publishStatusWs(const String& topic, const String& data) { } // публикация дополнительных json сообщений в ws -void publishJsonWs(const String& topic, String& json) { +void publishJsonWs(const String& topic, String& json) +{ String path = mqttRootDevice + "/" + topic; jsonWriteStr(json, "topic", path); // TO DO отправка полей в веб @@ -347,7 +353,8 @@ void publishJsonWs(const String& topic, String& json) { } // данные которые мы отправляем в сокеты переодически -void periodicWsSend() { +void periodicWsSend() +{ sendStringToWs("ssidli", ssidListHeapJson, -1); sendStringToWs("errors", errorsHeapJson, -1); // отправляем переодичестки только в авто режиме @@ -357,10 +364,11 @@ void periodicWsSend() { } #ifdef ESP32 -void hexdump(const void* mem, uint32_t len, uint8_t cols = 16) { +void hexdump(const void* mem, uint32_t len, uint8_t cols = 16) +{ const uint8_t* src = (const uint8_t*)mem; Serial.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, - len, len); + len, len); for (uint32_t i = 0; i < len; i++) { if (i % cols == 0) { Serial.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); @@ -374,7 +382,8 @@ void hexdump(const void* mem, uint32_t len, uint8_t cols = 16) { #endif void sendFileToWsByFrames(const String& filename, const String& header, - const String& json, int client_id, size_t frameSize) { + const String& json, int client_id, size_t frameSize) +{ if (header.length() != 6) { SerialPrint("E", "FS", F("wrong header size")); return; @@ -447,7 +456,8 @@ void sendFileToWsByFrames(const String& filename, const String& header, file.close(); } -void sendStringToWs(const String& header, String& payload, int client_id) { +void sendStringToWs(const String& header, String& payload, int client_id) +{ if ((!getNumAPClients() && !isNetworkActive()) || !getNumWSClients()) { // standWebSocket.disconnect(); // это и ниже надо сделать при - // standWebSocket.close(); // - отключении AP И WiFi(STA), надо менять ядро WiFi. Сейчас не закрывается сессия клиента при пропаже AP И WiFi(STA) @@ -471,7 +481,8 @@ void sendStringToWs(const String& header, String& payload, int client_id) { } } -void sendDeviceList(uint8_t num) { +void sendDeviceList(uint8_t num) +{ if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { // если включен автопоиск то отдаем список из оперативной памяти SerialPrint("i", "FS", "heap list"); @@ -479,11 +490,12 @@ void sendDeviceList(uint8_t num) { } else { // если выключен автопоиск то отдаем список из флешь памяти sendFileToWsByFrames("/devlist.json", "devlis", "", num, - WEB_SOCKETS_FRAME_SIZE); + WEB_SOCKETS_FRAME_SIZE); SerialPrint("i", "FS", "flash list"); } } -int getNumWSClients() { +int getNumWSClients() +{ return standWebSocket.connectedClients(false); } \ No newline at end of file