From 6318fb4af0f0d5b44e7fcf23bfdca33789ff6a0c Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <67171972+IoTManagerProject@users.noreply.github.com> Date: Fri, 21 Jan 2022 17:34:11 +0100 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BC=D0=B0=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D1=81=D0=BE=D0=BA=D0=B5=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/config.json | 92 ++++++++++++++++++++++++++++++++++++++++ data_svelte/test.json | 74 ++++++++++++++++++++++++++++++++ include/StandWebServer.h | 7 ++- src/Main.cpp | 6 +-- src/StandWebServer.cpp | 82 ++++++++++++++++++++++++++++++++--- src/classes/SendJson.cpp | 1 + training/info.txt | 8 ++++ 7 files changed, 259 insertions(+), 11 deletions(-) create mode 100644 data_svelte/test.json create mode 100644 training/info.txt diff --git a/data_svelte/config.json b/data_svelte/config.json index 75a050b8..d3e53e0d 100644 --- a/data_svelte/config.json +++ b/data_svelte/config.json @@ -1,4 +1,96 @@ [ + { + "type": "Reading", + "subtype": "AnalogAdc", + "id": "t1", + "widget": "anydataDef", + "page": "Сенсоры", + "descr": "Температура", + "pin": 0, + "int": 10 + }, + { + "type": "Reading", + "subtype": "AnalogAdc", + "id": "t2", + "widget": "anydataTmp", + "page": "Сенсоры", + "descr": "Температура", + "pin": 0, + "int": 15 + }, + { + "type": "Variable", + "subtype": "ButtonOut", + "id": "btn1", + "widget": "toggle", + "page": "Кнопки", + "descr": "Освещение", + "gpio": 13, + "inv": false + }, + { + "type": "Variable", + "subtype": "PwmOut", + "id": "pwm1", + "widget": "range", + "page": "Регуляторы", + "descr": "Освещение", + "gpio": 14, + "inv": false + }, + { + "type": "Reading", + "subtype": "ButtonIn", + "id": "btn", + "widget": "toggle", + "page": "Кнопки", + "descr": "Освещение", + "gpio": 12, + "inv": false + }, + { + "type": "Reading", + "subtype": "OutputValue", + "id": "txt", + "widget": "anydataRed", + "page": "Предупреждения", + "descr": "Статус" + }, + { + "type": "Reading", + "subtype": "InputValue", + "id": "txt", + "widget": "inputDgt", + "page": "Лимиты", + "descr": "Порог" + }, + { + "type": "Reading", + "subtype": "Bme280", + "id": "t", + "widget": "anydataTmp", + "page": "Сенсоры", + "descr": "Температура" + }, + { + "type": "Reading", + "subtype": "Bme280", + "id": "p", + "widget": "anydataMm", + "page": "Сенсоры", + "descr": "Давление" + }, + { + "type": "Reading", + "subtype": "Bme280", + "id": "h", + "widget": "anydataHum", + "page": "Сенсоры", + "descr": "Влажность", + "int": 10, + "addr": "0x78" + }, { "type": "Reading", "subtype": "AnalogAdc", diff --git a/data_svelte/test.json b/data_svelte/test.json new file mode 100644 index 00000000..0e82979d --- /dev/null +++ b/data_svelte/test.json @@ -0,0 +1,74 @@ +[ + { + "type": "Variable", + "subtype": "ButtonOut", + "id": "btn1", + "widget": "toggle", + "page": "Кнопки", + "descr": "Освещение", + "gpio": 13, + "inv": false + }, + { + "type": "Variable", + "subtype": "PwmOut", + "id": "pwm1", + "widget": "range", + "page": "Регуляторы", + "descr": "Освещение", + "gpio": 14, + "inv": false + }, + { + "type": "Reading", + "subtype": "ButtonIn", + "id": "btn", + "widget": "toggle", + "page": "Кнопки", + "descr": "Освещение", + "gpio": 12, + "inv": false + }, + { + "type": "Reading", + "subtype": "OutputValue", + "id": "txt", + "widget": "anydataRed", + "page": "Предупреждения", + "descr": "Статус" + }, + { + "type": "Reading", + "subtype": "InputValue", + "id": "txt", + "widget": "inputDgt", + "page": "Лимиты", + "descr": "Порог" + }, + { + "type": "Reading", + "subtype": "Bme280", + "id": "t", + "widget": "anydataTmp", + "page": "Сенсоры", + "descr": "Температура" + }, + { + "type": "Reading", + "subtype": "Bme280", + "id": "p", + "widget": "anydataMm", + "page": "Сенсоры", + "descr": "Давление" + }, + { + "type": "Reading", + "subtype": "Bme280", + "id": "h", + "widget": "anydataHum", + "page": "Сенсоры", + "descr": "Влажность", + "int": 10, + "addr": "0x78" + } +] \ No newline at end of file diff --git a/include/StandWebServer.h b/include/StandWebServer.h index 1231607d..c6dae110 100644 --- a/include/StandWebServer.h +++ b/include/StandWebServer.h @@ -20,4 +20,9 @@ extern void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t #ifdef ESP32 extern void hexdump(const void* mem, uint32_t len, uint8_t cols); #endif -#endif \ No newline at end of file +#endif + +void sendFileToWs(const String& filename, uint8_t num); +void sendFileToWs2(const String& filename, uint8_t num); +void sendFileToWs3(const String& filename, uint8_t num); +void sendFileToWs4(const String& filename, uint8_t num); \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index 488719c4..bb7a70cf 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -44,11 +44,7 @@ void setup() { configure("/config.json"); - //выводим остаток оперативной памяти после старта - // 22.12.21 пустой код без wifi остаток = 50.28 kB - // 22.12.21 запустил wifi остаток = 48.59 kB - // 22.12.21 добавил асинхронный веб сервер = 38.36 kB - // 22.12.21 добавил web sockets = 37.63 kB + // readFileBin("/config.json"); //создали задачу которая будет выполняться каждые 30 секунд ts.add( diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index bfc44c6d..104dc806 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -215,12 +215,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) if (payloadStr.startsWith("/config")) { //если прилетел url страницы /config то отправим widgets.json и config.json - // не нравится мне это, нужно что бы класс строил очередь и отправлял вначале первый файл потом второй - // очередь задавалась бы так: /widgets.json,/config.json, - // хорошая идея на завтра) #ifdef QUEUE_FROM_STR - if (sendJsonFiles) sendJsonFiles->addFileToQueue("/widgets.json", num); - if (sendJsonFiles) sendJsonFiles->addFileToQueue("/config.json", num); + // sendFileToWs2("/widgets.json", num); + sendFileToWs4("/config.json", num); #endif } @@ -282,3 +279,78 @@ void hexdump(const void* mem, uint32_t len, uint8_t cols = 16) { } #endif #endif + +void sendFileToWs(const String& filename, uint8_t num) { + String path = filepath(filename); + auto file = FileFS.open(path, "r"); + if (!file) { + SerialPrint(F("E"), F("FS"), F("reed file error")); + } + + size_t fileSize = file.size(); + + uint8_t bufuint[fileSize]; + + SerialPrint(F("i"), F("WS"), "Send file '" + filename + "', file size: " + String(fileSize)); + + long st = millis(); + int i = 0; + while (file.available()) { + bufuint[i] = file.read(); + i++; + yield(); + } + long end = millis(); + SerialPrint(F("i"), F("WS"), "Time '" + String(end - st)); + + standWebSocket.sendTXT(num, bufuint, i); +} + +void sendFileToWs2(const String& filename, uint8_t num) { + String file = readFile(filename, 5000); + size_t fileSize = sizeof(file); + SerialPrint(F("i"), F("WS"), String(fileSize)); + standWebSocket.sendTXT(num, file); +} + +void sendFileToWs3(const String& filename, uint8_t num) { + String path = filepath(filename); + auto file = FileFS.open(path, "r"); + if (!file) { + SerialPrint(F("E"), F("FS"), F("reed file error")); + } + + size_t fileSize = file.size(); + + SerialPrint(F("i"), F("WS"), "Send file '" + filename + "', file size: " + String(fileSize)); + + String ret; + ret.reserve(file.size() - file.position()); + char temp[256 + 1]; + int countRead = file.readBytes(temp, sizeof(temp) - 1); + while (countRead > 0) { + temp[countRead] = 0; + ret += temp; + countRead = file.readBytes(temp, sizeof(temp) - 1); + } + + standWebSocket.sendTXT(num, ret); +} + +void sendFileToWs4(const String& filename, uint8_t num) { + size_t ws_buffer = 1024; + String path = filepath(filename); + auto file = FileFS.open(path, "r"); + if (!file) { + SerialPrint(F("E"), F("FS"), F("reed file error")); + } + size_t fileSize = file.size(); + SerialPrint(F("i"), F("WS"), "Send file '" + filename + "', file size: " + String(fileSize)); + char temp[ws_buffer + 1]; + int countRead = file.readBytes(temp, sizeof(temp) - 1); + while (countRead > 0) { + temp[countRead] = 0; + standWebSocket.sendTXT(num, temp, countRead); + countRead = file.readBytes(temp, sizeof(temp) - 1); + } +} diff --git a/src/classes/SendJson.cpp b/src/classes/SendJson.cpp index 9b84a4a0..9a7af2fb 100644 --- a/src/classes/SendJson.cpp +++ b/src/classes/SendJson.cpp @@ -13,6 +13,7 @@ void SendJson::addFileToQueue(String path, uint8_t num) { SerialPrint(F("i"), F("WS"), "file added to Queue " + path); } +//опсылает массив json по объектно в сокеты void SendJson::loop() { if (!filesQueue->empty() && !sendingInProgress) { Serial.println("Queue not empty"); diff --git a/training/info.txt b/training/info.txt new file mode 100644 index 00000000..b7cb2d9e --- /dev/null +++ b/training/info.txt @@ -0,0 +1,8 @@ +здесь пишу статистику по остатку оперативной памяти после глобальных изменений + +22.12.21 пустой код без wifi остаток = 50.28 kB +22.12.21 запустил wifi остаток = 48.59 kB +22.12.21 добавил асинхронный веб сервер = 38.36 kB +22.12.21 добавил web sockets = 37.63 kB + +20.01.22 стандартный сервер mqtt в работе = 41.00 kb \ No newline at end of file