pre Betta WIFI array

This commit is contained in:
Mit4el
2023-09-24 07:49:48 +00:00
parent 48ccdd7e86
commit e48d13faae
8 changed files with 1069 additions and 1013 deletions

View File

@@ -3,8 +3,8 @@
"name": "IoTmanagerVer4", "name": "IoTmanagerVer4",
"apssid": "IoTmanager", "apssid": "IoTmanager",
"appass": "", "appass": "",
"routerssid": "iot", "routerssid": ["iot","wifi"],
"routerpass": "hostel3333", "routerpass": ["hostel3333","pswd"],
"timezone": 2, "timezone": 2,
"ntp": "pool.ntp.org", "ntp": "pool.ntp.org",
"weblogin": "admin", "weblogin": "admin",
@@ -32,6 +32,11 @@
"firmware": "0x00000", "firmware": "0x00000",
"littlefs": "0x300000" "littlefs": "0x300000"
}, },
{
"name": "esp8266_16mb",
"firmware": "0x00000",
"littlefs": "0x200000"
},
{ {
"name": "esp32_4mb", "name": "esp32_4mb",
"boot_app0": "0xe000", "boot_app0": "0xe000",
@@ -40,6 +45,14 @@
"partitions": "0x8000", "partitions": "0x8000",
"littlefs": "0x290000" "littlefs": "0x290000"
}, },
{
"name": "esp32_16mb",
"boot_app0": "0xe000",
"bootloader_qio_80m": "0x1000",
"firmware": "0x10000",
"partitions": "0x8000",
"littlefs": "0x910000"
},
{ {
"name": "esp8266_1mb", "name": "esp8266_1mb",
"firmware": "0x00000000", "firmware": "0x00000000",

View File

@@ -2,8 +2,14 @@
"name": "IoTmanagerVer4", "name": "IoTmanagerVer4",
"apssid": "IoTmanager", "apssid": "IoTmanager",
"appass": "", "appass": "",
"routerssid": "iot", "routerssid": [
"routerpass": "hostel3333", "iot",
"wifi"
],
"routerpass": [
"hostel3333",
"pswd"
],
"timezone": 2, "timezone": 2,
"ntp": "pool.ntp.org", "ntp": "pool.ntp.org",
"weblogin": "admin", "weblogin": "admin",

View File

@@ -1,31 +1,32 @@
#pragma once #pragma once
#include "Global.h" #include "Global.h"
extern String jsonReadStrDoc(DynamicJsonDocument& doc, String name); extern String jsonReadStrDoc(DynamicJsonDocument& doc, String name);
extern void jsonWriteStrDoc(DynamicJsonDocument& doc, String name, String value); extern void jsonWriteStrDoc(DynamicJsonDocument& doc, String name, String value);
extern String jsonWriteStr(String& json, String name, String value, bool e = true); extern String jsonWriteStr(String& json, String name, String value, bool e = true);
extern String jsonWriteInt(String& json, String name, int value, bool e = true); extern String jsonWriteInt(String& json, String name, int value, bool e = true);
extern String jsonWriteFloat(String& json, String name, float value, bool e = true); extern String jsonWriteFloat(String& json, String name, float value, bool e = true);
extern String jsonWriteBool(String& json, String name, boolean value, bool e = true); extern String jsonWriteBool(String& json, String name, boolean value, bool e = true);
extern bool jsonRead(const String& json, String key, long& value, bool e = true); extern bool jsonRead(const String& json, String key, long& value, bool e = true);
extern bool jsonRead(const String& json, String key, float& value, bool e = true); extern bool jsonRead(const String& json, String key, float& value, bool e = true);
extern bool jsonRead(const String& json, String key, String& value, bool e = true); extern bool jsonRead(const String& json, String key, String& value, bool e = true);
extern bool jsonRead(const String& json, String key, bool& value, bool e = true); extern bool jsonRead(const String& json, String key, bool& value, bool e = true);
extern bool jsonRead(const String& json, String key, int& value, bool e = true); extern bool jsonRead(const String& json, String key, int& value, bool e = true);
extern bool jsonReadArray(const String& json, String key, JsonArray& jArray, bool e = true);
extern String jsonReadStr(const String& json, String name, bool e = true);
extern int jsonReadInt(const String& json, String name, bool e = true); extern String jsonReadStr(const String& json, String name, bool e = true);
long int jsonReadLInt(const String& json, String name, bool e=true); extern int jsonReadInt(const String& json, String name, bool e = true);
extern boolean jsonReadBool(const String& json, String name, bool e = true); long int jsonReadLInt(const String& json, String name, bool e=true);
extern boolean jsonReadBool(const String& json, String name, bool e = true);
extern bool jsonWriteStr_(String& json, const String& name, const String& value, bool e = true);
extern bool jsonWriteBool_(String& json, const String& name, bool value, bool e = true); extern bool jsonWriteStr_(String& json, const String& name, const String& value, bool e = true);
extern bool jsonWriteInt_(String& json, const String& name, int value, bool e = true); extern bool jsonWriteBool_(String& json, const String& name, bool value, bool e = true);
extern bool jsonWriteFloat_(String& json, const String& name, float value, bool e = true); extern bool jsonWriteInt_(String& json, const String& name, int value, bool e = true);
void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t headerLenth, String& json); extern bool jsonWriteFloat_(String& json, const String& name, float value, bool e = true);
extern bool jsonMergeObjects(String& json1, String& json2, bool e = true); void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t headerLenth, String& json);
extern void jsonMergeDocs(JsonObject dest, JsonObjectConst src); extern bool jsonMergeObjects(String& json1, String& json2, bool e = true);
extern void jsonErrorDetected(); extern void jsonMergeDocs(JsonObject dest, JsonObjectConst src);
extern void jsonErrorDetected();

View File

@@ -1,12 +1,12 @@
#pragma once #pragma once
#include "Global.h" #include "Global.h"
#include "MqttClient.h" #include "MqttClient.h"
// boolean isNetworkActive(); // boolean isNetworkActive();
inline boolean isNetworkActive() {return WiFi.status() == WL_CONNECTED;}; inline boolean isNetworkActive() {return WiFi.status() == WL_CONNECTED;};
void routerConnect(); void routerConnect();
bool startAPMode(); bool startAPMode();
boolean RouterFind(String ssid); boolean RouterFind(JsonArray jArray);
uint8_t RSSIquality(); uint8_t RSSIquality();
extern void wifiSignalInit(); extern void wifiSignalInit();

View File

@@ -3,8 +3,8 @@
"name": "IoTmanagerVer4", "name": "IoTmanagerVer4",
"apssid": "IoTmanager", "apssid": "IoTmanager",
"appass": "", "appass": "",
"routerssid": "iot", "routerssid": ["iot","wifi"],
"routerpass": "hostel3333", "routerpass": ["hostel3333","pswd"],
"timezone": 2, "timezone": 2,
"ntp": "pool.ntp.org", "ntp": "pool.ntp.org",
"weblogin": "admin", "weblogin": "admin",

View File

@@ -1,448 +1,451 @@
#include "WsServer.h" #include "WsServer.h"
#include "classes/IoTScenario.h" #include "classes/IoTScenario.h"
extern IoTScenario iotScen; extern IoTScenario iotScen;
#ifdef STANDARD_WEB_SOCKETS #ifdef STANDARD_WEB_SOCKETS
void standWebSocketsInit() { void standWebSocketsInit() {
standWebSocket.begin(); standWebSocket.begin();
standWebSocket.onEvent(webSocketEvent); standWebSocket.onEvent(webSocketEvent);
SerialPrint("i", "WS", "WS server initialized"); SerialPrint("i", "WS", "WS server initialized");
} }
void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) { void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) {
switch (type) { switch (type) {
case WStype_ERROR: { case WStype_ERROR: {
Serial.printf("[%u] Error!\n", num); Serial.printf("[%u] Error!\n", num);
} break; } break;
case WStype_DISCONNECTED: { case WStype_DISCONNECTED: {
Serial.printf("[%u] Disconnected!\n", num); Serial.printf("[%u] Disconnected!\n", num);
} break; } break;
case WStype_CONNECTED: { case WStype_CONNECTED: {
// IPAddress ip = standWebSocket.remoteIP(num); // IPAddress ip = standWebSocket.remoteIP(num);
SerialPrint("i", "WS " + String(num), "WS client connected"); SerialPrint("i", "WS " + String(num), "WS client connected");
if (num >= 3) { if (num >= 3) {
SerialPrint("E", "WS", "Too many clients, connection closed!!!"); SerialPrint("E", "WS", "Too many clients, connection closed!!!");
jsonWriteInt(errorsHeapJson, "wse1", 1); jsonWriteInt(errorsHeapJson, "wse1", 1);
standWebSocket.close(); standWebSocket.close();
standWebSocketsInit(); standWebSocketsInit();
} }
// Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); // 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"); // standWebSocket.sendTXT(num, "Connected");
} break; } break;
case WStype_TEXT: { case WStype_TEXT: {
bool endOfHeaderFound = false; bool endOfHeaderFound = false;
size_t maxAllowedHeaderSize = 15; // максимальное количество символов заголовка size_t maxAllowedHeaderSize = 15; // максимальное количество символов заголовка
size_t headerLenth = 0; size_t headerLenth = 0;
String headerStr; String headerStr;
for (size_t i = 0; i <= maxAllowedHeaderSize; i++) { for (size_t i = 0; i <= maxAllowedHeaderSize; i++) {
headerLenth++; headerLenth++;
char s = (char)payload[i]; char s = (char)payload[i];
headerStr += s; headerStr += s;
if (s == '|') { if (s == '|') {
endOfHeaderFound = true; endOfHeaderFound = true;
break; break;
} }
} }
if (!endOfHeaderFound) { if (!endOfHeaderFound) {
SerialPrint("E", "WS " + String(num), "Package without header"); SerialPrint("E", "WS " + String(num), "Package without header");
} }
//----------------------------------------------------------------------// //----------------------------------------------------------------------//
// Страница веб интерфейса dashboard // Страница веб интерфейса dashboard
//----------------------------------------------------------------------// //----------------------------------------------------------------------//
// публикация всех виджетов // публикация всех виджетов
if (headerStr == "/|") { if (headerStr == "/|") {
sendFileToWsByFrames("/layout.json", "layout", "", num, WEB_SOCKETS_FRAME_SIZE); sendFileToWsByFrames("/layout.json", "layout", "", num, WEB_SOCKETS_FRAME_SIZE);
} }
if (headerStr == "/params|") { if (headerStr == "/params|") {
// публикация всех статус сообщений при подключении svelte приложения // публикация всех статус сообщений при подключении svelte приложения
String params = "{}"; String params = "{}";
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
if ((*it)->getSubtype() != "Loging") { if ((*it)->getSubtype() != "Loging") {
if ((*it)->getSubtype() != "LogingDaily") { if ((*it)->getSubtype() != "LogingDaily") {
if ((*it)->iAmLocal) jsonWriteStr(params, (*it)->getID(), (*it)->getValue()); if ((*it)->iAmLocal) jsonWriteStr(params, (*it)->getID(), (*it)->getValue());
} }
} }
} }
sendStringToWs("params", params, num); sendStringToWs("params", params, num);
// генерация события подключения в модулях // генерация события подключения в модулях
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
if ((*it)->iAmLocal) (*it)->onMqttWsAppConnectEvent(); if ((*it)->iAmLocal) (*it)->onMqttWsAppConnectEvent();
} }
} }
// отвечаем на запрос графиков // отвечаем на запрос графиков
if (headerStr == "/charts|") { if (headerStr == "/charts|") {
// обращение к логированию из ядра // обращение к логированию из ядра
// отправка данных графиков только в выбранный сокет // отправка данных графиков только в выбранный сокет
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
// сбрасываем даты графиков // сбрасываем даты графиков
// if ((*it)->getID().endsWith("-date")) { // if ((*it)->getID().endsWith("-date")) {
// (*it)->setTodayDate(); // (*it)->setTodayDate();
// } // }
if ((*it)->getSubtype() == "Loging" || "LogingDaily") { if ((*it)->getSubtype() == "Loging" || "LogingDaily") {
(*it)->setPublishDestination(TO_WS, num); (*it)->setPublishDestination(TO_WS, num);
(*it)->publishValue(); (*it)->publishValue();
} }
} }
} }
//----------------------------------------------------------------------// //----------------------------------------------------------------------//
// Страница веб интерфейса configutation // Страница веб интерфейса configutation
//----------------------------------------------------------------------// //----------------------------------------------------------------------//
// отвечаем данными на запрос страницы // отвечаем данными на запрос страницы
if (headerStr == "/config|") { if (headerStr == "/config|") {
sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE); sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE);
sendFileToWsByFrames("/widgets.json", "widget", "", num, WEB_SOCKETS_FRAME_SIZE); sendFileToWsByFrames("/widgets.json", "widget", "", num, WEB_SOCKETS_FRAME_SIZE);
sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE);
sendFileToWsByFrames("/scenario.txt", "scenar", "", num, WEB_SOCKETS_FRAME_SIZE); sendFileToWsByFrames("/scenario.txt", "scenar", "", num, WEB_SOCKETS_FRAME_SIZE);
sendStringToWs("settin", settingsFlashJson, num); sendStringToWs("settin", settingsFlashJson, num);
} }
// обработка кнопки сохранить // обработка кнопки сохранить
if (headerStr == "/gifnoc|") { if (headerStr == "/gifnoc|") {
writeFileUint8tByFrames("config.json", payload, length, headerLenth, 256); writeFileUint8tByFrames("config.json", payload, length, headerLenth, 256);
} }
if (headerStr == "/tuoyal|") { if (headerStr == "/tuoyal|") {
writeFileUint8tByFrames("layout.json", payload, length, headerLenth, 256); writeFileUint8tByFrames("layout.json", payload, length, headerLenth, 256);
} }
if (headerStr == "/oiranecs|") { if (headerStr == "/oiranecs|") {
writeFileUint8tByFrames("scenario.txt", payload, length, headerLenth, 256); writeFileUint8tByFrames("scenario.txt", payload, length, headerLenth, 256);
clearConfigure(); clearConfigure();
configure("/config.json"); configure("/config.json");
iotScen.loadScenario("/scenario.txt"); iotScen.loadScenario("/scenario.txt");
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
createItemFromNet("onStart", "1", 1); createItemFromNet("onStart", "1", 1);
} }
//----------------------------------------------------------------------// //----------------------------------------------------------------------//
// Страница веб интерфейса connection // Страница веб интерфейса connection
//----------------------------------------------------------------------// //----------------------------------------------------------------------//
// отвечаем данными на запрос страницы // отвечаем данными на запрос страницы
if (headerStr == "/connection|") { if (headerStr == "/connection|") {
sendStringToWs("settin", settingsFlashJson, num); sendStringToWs("settin", settingsFlashJson, num);
sendStringToWs("ssidli", ssidListHeapJson, num); sendStringToWs("ssidli", ssidListHeapJson, num);
sendStringToWs("errors", errorsHeapJson, num); sendStringToWs("errors", errorsHeapJson, num);
// запуск асинхронного сканирования wifi сетей при переходе на страницу соединений // запуск асинхронного сканирования wifi сетей при переходе на страницу соединений
// RouterFind(jsonReadStr(settingsFlashJson, F("routerssid"))); // RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
} }
// обработка кнопки сохранить settings.json // обработка кнопки сохранить settings.json
if (headerStr == "/sgnittes|") { if (headerStr == "/sgnittes|") {
writeUint8tToString(payload, length, headerLenth, settingsFlashJson); writeUint8tToString(payload, length, headerLenth, settingsFlashJson);
writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256); writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256);
sendStringToWs("errors", errorsHeapJson, num); sendStringToWs("errors", errorsHeapJson, num);
// если не было создано приема данных по udp - то создадим его // если не было создано приема данных по udp - то создадим его
addThisDeviceToList(); addThisDeviceToList();
} }
// обработка кнопки сохранить настройки mqtt // обработка кнопки сохранить настройки mqtt
if (headerStr == "/mqtt|") { if (headerStr == "/mqtt|") {
sendStringToWs("settin", settingsFlashJson, num); // отправляем в ответ новые полученные настройки sendStringToWs("settin", settingsFlashJson, num); // отправляем в ответ новые полученные настройки
handleMqttStatus(false, 8); // меняем статус на неопределенный handleMqttStatus(false, 8); // меняем статус на неопределенный
mqttReconnect(); // начинаем переподключение mqttReconnect(); // начинаем переподключение
sendStringToWs("errors", errorsHeapJson, num); // отправляем что статус неопределен sendStringToWs("errors", errorsHeapJson, num); // отправляем что статус неопределен
sendStringToWs("ssidli", ssidListHeapJson, num); sendStringToWs("ssidli", ssidListHeapJson, num);
} }
// запуск асинхронного сканирования wifi сетей при нажатии выпадающего списка // запуск асинхронного сканирования wifi сетей при нажатии выпадающего списка
if (headerStr == "/scan|") { if (headerStr == "/scan|")
RouterFind(jsonReadStr(settingsFlashJson, F("routerssid"))); {
sendStringToWs("ssidli", ssidListHeapJson, num); JsonArray jArray;
} jsonReadArray(settingsFlashJson, "routerssid", jArray);
RouterFind(jArray);
//----------------------------------------------------------------------// sendStringToWs("ssidli", ssidListHeapJson, num);
// Страница веб интерфейса list }
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
// отвечаем данными на запрос страницы list // Страница веб интерфейса list
if (headerStr == "/list|") { //----------------------------------------------------------------------//
sendStringToWs("settin", settingsFlashJson, num);
// отправим список устройств в зависимости от того что выбрал user // отвечаем данными на запрос страницы list
// sendDeviceList(num); if (headerStr == "/list|") {
} sendStringToWs("settin", settingsFlashJson, num);
// отправим список устройств в зависимости от того что выбрал user
// отвечаем на запрос списка устройств (это отдельный запрос который делает приложение при подключении) // sendDeviceList(num);
if (headerStr == "/devlist|") { }
// отправим список устройств в зависимости от того что выбрал user
sendDeviceList(num); // отвечаем на запрос списка устройств (это отдельный запрос который делает приложение при подключении)
} if (headerStr == "/devlist|") {
// отправим список устройств в зависимости от того что выбрал user
// сохраняем данные листа sendDeviceList(num);
if (headerStr == "/tsil|") { }
writeFileUint8tByFrames("devlist.json", payload, length, headerLenth, 256);
} // сохраняем данные листа
if (headerStr == "/tsil|") {
//----------------------------------------------------------------------// writeFileUint8tByFrames("devlist.json", payload, length, headerLenth, 256);
// Страница веб интерфейса system }
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
// отвечаем данными на запрос страницы // Страница веб интерфейса system
if (headerStr == "/system|") { //----------------------------------------------------------------------//
sendStringToWs("errors", errorsHeapJson, num);
sendStringToWs("settin", settingsFlashJson, num); // отвечаем данными на запрос страницы
} if (headerStr == "/system|") {
sendStringToWs("errors", errorsHeapJson, num);
//----------------------------------------------------------------------// sendStringToWs("settin", settingsFlashJson, num);
// Страница веб интерфейса dev }
//----------------------------------------------------------------------//
if (headerStr == "/dev|") { //----------------------------------------------------------------------//
sendStringToWs("errors", errorsHeapJson, num); // Страница веб интерфейса dev
sendStringToWs("settin", settingsFlashJson, num); //----------------------------------------------------------------------//
sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); if (headerStr == "/dev|") {
sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE); sendStringToWs("errors", errorsHeapJson, num);
// sendFileToWsByFrames("/layout.json", "layout", "", num, WEB_SOCKETS_FRAME_SIZE); sendStringToWs("settin", settingsFlashJson, num);
} sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE);
sendFileToWsByFrames("/items.json", "itemsj", "", num, WEB_SOCKETS_FRAME_SIZE);
if (headerStr == "/test|") { // sendFileToWsByFrames("/layout.json", "layout", "", num, WEB_SOCKETS_FRAME_SIZE);
} }
//----------------------------------------------------------------------// if (headerStr == "/test|") {
// отдельные команды веб интерфейса }
//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
// переписать любое поле в errors json // отдельные команды веб интерфейса
if (headerStr == "/rorre|") { //----------------------------------------------------------------------//
writeUint8tValueToJsonString(payload, length, headerLenth, errorsHeapJson);
} // переписать любое поле в errors json
if (headerStr == "/rorre|") {
// команда перезагрузки esp writeUint8tValueToJsonString(payload, length, headerLenth, errorsHeapJson);
if (headerStr == "/reboot|") { }
ESP.restart();
} // команда перезагрузки esp
if (headerStr == "/reboot|") {
// команда очистки всех логов esp ESP.restart();
if (headerStr == "/clean|") { }
cleanLogs();
} // команда очистки всех логов esp
if (headerStr == "/clean|") {
// команда обновления прошивки esp cleanLogs();
if (headerStr == "/update|") { }
upgrade_firmware(3);
} // команда обновления прошивки esp
if (headerStr == "/update|") {
// Прием команд control c dashboard upgrade_firmware(3);
if (headerStr == "/control|") { }
String msg;
writeUint8tToString(payload, length, headerLenth, msg); // Прием команд control c dashboard
String key = selectFromMarkerToMarker(msg, "/", 0); if (headerStr == "/control|") {
String value = selectFromMarkerToMarker(msg, "/", 1); String msg;
generateOrder(key, value); writeUint8tToString(payload, length, headerLenth, msg);
SerialPrint("i", F("=>WS"), "Msg from svelte web, WS No: " + String(num) + ", msg: " + msg); String key = selectFromMarkerToMarker(msg, "/", 0);
} String value = selectFromMarkerToMarker(msg, "/", 1);
generateOrder(key, value);
if (headerStr == "/tst|") { SerialPrint("i", F("=>WS"), "Msg from svelte web, WS No: " + String(num) + ", msg: " + msg);
standWebSocket.sendTXT(num, "/tstr|"); }
}
if (headerStr == "/tst|") {
// получаем команду посланную из модуля standWebSocket.sendTXT(num, "/tstr|");
if (headerStr == "/order|") { }
String json;
writeUint8tToString(payload, length, headerLenth, json); // получаем команду посланную из модуля
if (headerStr == "/order|") {
String id, key, value; String json;
jsonRead(json, "id", id); writeUint8tToString(payload, length, headerLenth, json);
jsonRead(json, "key", key);
jsonRead(json, "value", value); String id, key, value;
jsonRead(json, "id", id);
SerialPrint("i", F("=>WS"), "Msg from module, id: " + id); jsonRead(json, "key", key);
jsonRead(json, "value", value);
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
if ((*it)->getID() == id) { SerialPrint("i", F("=>WS"), "Msg from module, id: " + id);
(*it)->onModuleOrder(key, value);
} for (std::list<IoTItem*>::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); } break;
// hexdump(payload, length);
// standWebSocket.sendBIN(num, payload, length); case WStype_BIN: {
} break; Serial.printf("[%u] get binary length: %u\n", num, length);
// hexdump(payload, length);
case WStype_FRAGMENT_TEXT_START: { // standWebSocket.sendBIN(num, payload, length);
Serial.printf("[%u] fragment test start: %u\n", num, length); } break;
} break;
case WStype_FRAGMENT_TEXT_START: {
case WStype_FRAGMENT_BIN_START: { Serial.printf("[%u] fragment test start: %u\n", num, length);
Serial.printf("[%u] fragment bin start: %u\n", num, length); } break;
} break;
case WStype_FRAGMENT_BIN_START: {
case WStype_FRAGMENT: { Serial.printf("[%u] fragment bin start: %u\n", num, length);
Serial.printf("[%u] fragment: %u\n", num, length); } break;
} break;
case WStype_FRAGMENT: {
case WStype_FRAGMENT_FIN: { Serial.printf("[%u] fragment: %u\n", num, length);
Serial.printf("[%u] fragment finish: %u\n", num, length); } break;
} break;
case WStype_FRAGMENT_FIN: {
case WStype_PING: { Serial.printf("[%u] fragment finish: %u\n", num, length);
Serial.printf("[%u] ping: %u\n", num, length); } break;
} break;
case WStype_PING: {
case WStype_PONG: { Serial.printf("[%u] ping: %u\n", num, length);
Serial.printf("[%u] pong: %u\n", num, length); } break;
} break;
case WStype_PONG: {
default: { Serial.printf("[%u] pong: %u\n", num, length);
Serial.printf("[%u] not recognized: %u\n", num, length); } break;
} break;
} default: {
} Serial.printf("[%u] not recognized: %u\n", num, length);
} break;
// публикация статус сообщений в ws (недостаток в том что делаем бродкаст всем клиентам поднятым в свелте!!!) }
void publishStatusWs(const String& topic, const String& data) { }
String path = mqttRootDevice + "/" + topic;
String json = "{}"; // публикация статус сообщений в ws (недостаток в том что делаем бродкаст всем клиентам поднятым в свелте!!!)
jsonWriteStr(json, "status", data); void publishStatusWs(const String& topic, const String& data) {
jsonWriteStr(json, "topic", path); String path = mqttRootDevice + "/" + topic;
sendStringToWs("status", json, -1); String json = "{}";
} jsonWriteStr(json, "status", data);
jsonWriteStr(json, "topic", path);
// публикация дополнительных json сообщений в ws sendStringToWs("status", json, -1);
void publishJsonWs(const String& topic, String& json) { }
String path = mqttRootDevice + "/" + topic;
jsonWriteStr(json, "topic", path); // публикация дополнительных json сообщений в ws
// TO DO отправка полей в веб void publishJsonWs(const String& topic, String& json) {
// sendStringToWs("status", json, -1); String path = mqttRootDevice + "/" + topic;
} jsonWriteStr(json, "topic", path);
// TO DO отправка полей в веб
// данные которые мы отправляем в сокеты переодически // sendStringToWs("status", json, -1);
void periodicWsSend() { }
sendStringToWs("ssidli", ssidListHeapJson, -1);
sendStringToWs("errors", errorsHeapJson, -1); // данные которые мы отправляем в сокеты переодически
// отправляем переодичестки только в авто режиме void periodicWsSend() {
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { sendStringToWs("ssidli", ssidListHeapJson, -1);
sendStringToWs("devlis", devListHeapJson, -1); sendStringToWs("errors", errorsHeapJson, -1);
} // отправляем переодичестки только в авто режиме
} if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
sendStringToWs("devlis", devListHeapJson, -1);
#ifdef ESP32 }
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); #ifdef ESP32
for (uint32_t i = 0; i < len; i++) { void hexdump(const void* mem, uint32_t len, uint8_t cols = 16) {
if (i % cols == 0) { const uint8_t* src = (const uint8_t*)mem;
Serial.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); Serial.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len);
} for (uint32_t i = 0; i < len; i++) {
Serial.printf("%02X ", *src); if (i % cols == 0) {
src++; Serial.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i);
} }
Serial.printf("\n"); Serial.printf("%02X ", *src);
} src++;
#endif }
#endif Serial.printf("\n");
}
void sendFileToWsByFrames(const String& filename, const String& header, const String& json, int client_id, size_t frameSize) { #endif
if (header.length() != 6) { #endif
SerialPrint("E", "FS", F("wrong header size"));
return; void sendFileToWsByFrames(const String& filename, const String& header, const String& json, int client_id, size_t frameSize) {
} if (header.length() != 6) {
SerialPrint("E", "FS", F("wrong header size"));
auto path = filepath(filename); return;
auto file = FileFS.open(path, "r"); }
if (!file) {
SerialPrint("E", "FS", F("reed file error")); auto path = filepath(filename);
return; auto file = FileFS.open(path, "r");
} if (!file) {
SerialPrint("E", "FS", F("reed file error"));
size_t totalSize = file.size(); return;
// Serial.println("Send file '" + String(filename) + "', file size: " + String(totalSize)); }
char buf[32]; size_t totalSize = file.size();
sprintf(buf, "%04d", json.length() + 12); // Serial.println("Send file '" + String(filename) + "', file size: " + String(totalSize));
String data = header + "|" + String(buf) + "|" + json;
char buf[32];
size_t headerSize = data.length(); sprintf(buf, "%04d", json.length() + 12);
auto frameBuf = new uint8_t[frameSize]; String data = header + "|" + String(buf) + "|" + json;
size_t maxPayloadSize = frameSize - headerSize;
uint8_t* payloadBuf = nullptr; size_t headerSize = data.length();
auto frameBuf = new uint8_t[frameSize];
int i = 0; size_t maxPayloadSize = frameSize - headerSize;
while (file.available()) { uint8_t* payloadBuf = nullptr;
if (i == 0) {
data.toCharArray((char*)frameBuf, frameSize); int i = 0;
payloadBuf = &frameBuf[headerSize]; while (file.available()) {
} else { if (i == 0) {
maxPayloadSize = frameSize; data.toCharArray((char*)frameBuf, frameSize);
headerSize = 0; payloadBuf = &frameBuf[headerSize];
payloadBuf = &frameBuf[0]; } else {
} maxPayloadSize = frameSize;
headerSize = 0;
size_t payloadSize = file.read(payloadBuf, maxPayloadSize); payloadBuf = &frameBuf[0];
if (payloadSize) { }
size_t size = headerSize + payloadSize;
size_t payloadSize = file.read(payloadBuf, maxPayloadSize);
bool fin = false; if (payloadSize) {
if (size == frameSize) { size_t size = headerSize + payloadSize;
fin = false;
} else { bool fin = false;
fin = true; if (size == frameSize) {
} fin = false;
} else {
bool continuation = false; fin = true;
if (i == 0) { }
continuation = false;
} else { bool continuation = false;
continuation = true; if (i == 0) {
} continuation = false;
} else {
// Serial.println(String(i) + ") " + "ws: " + String(client_id) + " fr sz: " + String(size) + " fin: " + String(fin) + " cnt: " + String(continuation)); continuation = true;
}
if (client_id == -1) {
standWebSocket.broadcastBIN(frameBuf, size, fin, continuation); // Serial.println(String(i) + ") " + "ws: " + String(client_id) + " fr sz: " + String(size) + " fin: " + String(fin) + " cnt: " + String(continuation));
} else { if (client_id == -1) {
standWebSocket.sendBIN(client_id, frameBuf, size, fin, continuation); standWebSocket.broadcastBIN(frameBuf, size, fin, continuation);
}
} } else {
i++; standWebSocket.sendBIN(client_id, frameBuf, size, fin, continuation);
} }
payloadBuf = &frameBuf[0]; }
delete[] payloadBuf; i++;
file.close(); }
} payloadBuf = &frameBuf[0];
delete[] payloadBuf;
void sendStringToWs(const String& header, String& payload, int client_id) { file.close();
if (!(WiFi.softAPgetStationNum() || isNetworkActive())) { }
return;
} void sendStringToWs(const String& header, String& payload, int client_id) {
if (!(WiFi.softAPgetStationNum() || isNetworkActive())) {
if (header.length() != 6) { return;
SerialPrint("E", "FS", F("wrong header size")); }
return;
} if (header.length() != 6) {
SerialPrint("E", "FS", F("wrong header size"));
String msg = header + "|0012|" + payload; return;
size_t totalSize = msg.length(); }
char dataArray[totalSize]; String msg = header + "|0012|" + payload;
msg.toCharArray(dataArray, totalSize + 1); size_t totalSize = msg.length();
if (client_id == -1) {
standWebSocket.broadcastBIN((uint8_t*)dataArray, totalSize); char dataArray[totalSize];
} else { msg.toCharArray(dataArray, totalSize + 1);
standWebSocket.sendBIN(client_id, (uint8_t*)dataArray, totalSize); if (client_id == -1) {
} standWebSocket.broadcastBIN((uint8_t*)dataArray, totalSize);
} } else {
standWebSocket.sendBIN(client_id, (uint8_t*)dataArray, totalSize);
void sendDeviceList(uint8_t num) { }
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { }
// если включен автопоиск то отдаем список из оперативной памяти
SerialPrint("i", "FS", "heap list"); void sendDeviceList(uint8_t num) {
sendStringToWs("devlis", devListHeapJson, num); if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
} else { // если включен автопоиск то отдаем список из оперативной памяти
// если выключен автопоиск то отдаем список из флешь памяти SerialPrint("i", "FS", "heap list");
sendFileToWsByFrames("/devlist.json", "devlis", "", num, WEB_SOCKETS_FRAME_SIZE); sendStringToWs("devlis", devListHeapJson, num);
SerialPrint("i", "FS", "flash list"); } else {
} // если выключен автопоиск то отдаем список из флешь памяти
} sendFileToWsByFrames("/devlist.json", "devlis", "", num, WEB_SOCKETS_FRAME_SIZE);
SerialPrint("i", "FS", "flash list");
}
}

View File

@@ -1,320 +1,340 @@
#include "utils/JsonUtils.h" #include "utils/JsonUtils.h"
#include "utils/FileUtils.h" #include "utils/FileUtils.h"
// new================================================================================ // new================================================================================
String jsonReadStrDoc(DynamicJsonDocument& doc, String name) { String jsonReadStrDoc(DynamicJsonDocument& doc, String name) {
return doc[name].as<String>(); return doc[name].as<String>();
} }
void jsonWriteStrDoc(DynamicJsonDocument& doc, String name, String value) { void jsonWriteStrDoc(DynamicJsonDocument& doc, String name, String value) {
doc[name] = value; doc[name] = value;
} }
// new============================================================================== // new==============================================================================
bool jsonRead(const String& json, String key, long& value, bool e) { bool jsonRead(const String& json, String key, long& value, bool e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
DeserializationError error = deserializeJson(doc, json); DeserializationError error = deserializeJson(doc, json);
if (error) { if (error) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), error.f_str()); SerialPrint("E", F("jsonRead"), error.f_str());
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} else if (!doc.containsKey(key)) { } else if (!doc.containsKey(key)) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), key + " missing in " + json); SerialPrint("E", F("jsonRead"), key + " missing in " + json);
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} }
value = doc[key].as<long>(); value = doc[key].as<long>();
return true; return true;
} }
bool jsonRead(const String& json, String key, float& value, bool e) { bool jsonRead(const String& json, String key, float& value, bool e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
DeserializationError error = deserializeJson(doc, json); DeserializationError error = deserializeJson(doc, json);
if (error) { if (error) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), error.f_str()); SerialPrint("E", F("jsonRead"), error.f_str());
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} else if (!doc.containsKey(key)) { } else if (!doc.containsKey(key)) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), key + " missing in " + json); SerialPrint("E", F("jsonRead"), key + " missing in " + json);
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} }
value = doc[key].as<float>(); value = doc[key].as<float>();
return true; return true;
} }
bool jsonRead(const String& json, String key, String& value, bool e) { bool jsonRead(const String& json, String key, String& value, bool e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
DeserializationError error = deserializeJson(doc, json); DeserializationError error = deserializeJson(doc, json);
if (error) { if (error) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), error.f_str()); SerialPrint("E", F("jsonRead"), error.f_str());
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} else if (!doc.containsKey(key)) { } else if (!doc.containsKey(key)) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), key + " missing in " + json); SerialPrint("E", F("jsonRead"), key + " missing in " + json);
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} }
value = doc[key].as<String>(); value = doc[key].as<String>();
return true; return true;
} }
bool jsonRead(const String& json, String key, bool& value, bool e) { bool jsonRead(const String& json, String key, bool& value, bool e) {
int lvalue = value; int lvalue = value;
bool ret = jsonRead(json, key, lvalue, e); bool ret = jsonRead(json, key, lvalue, e);
value = lvalue; value = lvalue;
return ret; return ret;
} }
bool jsonRead(const String& json, String key, int& value, bool e) { bool jsonRead(const String& json, String key, int& value, bool e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
DeserializationError error = deserializeJson(doc, json); DeserializationError error = deserializeJson(doc, json);
if (error) { if (error) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), error.f_str()); SerialPrint("E", F("jsonRead"), error.f_str());
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} else if (!doc.containsKey(key)) { } else if (!doc.containsKey(key)) {
if (e) { if (e) {
SerialPrint("E", F("jsonRead"), key + " missing in " + json); SerialPrint("E", F("jsonRead"), key + " missing in " + json);
jsonErrorDetected(); jsonErrorDetected();
} }
return false; return false;
} }
value = doc[key].as<int>(); value = doc[key].as<int>();
return true; return true;
} }
// new============================================================================== bool jsonReadArray(const String& json, String key, JsonArray& jArray, bool e) {
bool jsonWriteStr_(String& json, const String& key, const String& value, bool e) { DynamicJsonDocument doc(JSON_BUFFER_SIZE);
bool ret = true; DeserializationError error = deserializeJson(doc, json);
DynamicJsonDocument doc(JSON_BUFFER_SIZE); if (error) {
DeserializationError error = deserializeJson(doc, json); if (e) {
if (error) { SerialPrint("E", F("jsonReadArray"), error.f_str());
if (e) { jsonErrorDetected();
SerialPrint("E", F("jsonWrite"), error.f_str()); }
jsonErrorDetected(); return false;
} } else if (!doc.containsKey(key)) {
ret = false; if (e) {
} SerialPrint("E", F("jsonReadArray"), key + " missing in " + json);
doc[key] = value; jsonErrorDetected();
json = ""; }
serializeJson(doc, json); return false;
return ret; }
} jArray = doc[key];
return true;
bool jsonWriteBool_(String& json, const String& key, bool value, bool e) { }
bool ret = true;
DynamicJsonDocument doc(JSON_BUFFER_SIZE); // new==============================================================================
DeserializationError error = deserializeJson(doc, json); bool jsonWriteStr_(String& json, const String& key, const String& value, bool e) {
if (error) { bool ret = true;
if (e) { DynamicJsonDocument doc(JSON_BUFFER_SIZE);
SerialPrint("E", F("jsonWrite"), error.f_str()); DeserializationError error = deserializeJson(doc, json);
jsonErrorDetected(); if (error) {
} if (e) {
ret = false; SerialPrint("E", F("jsonWrite"), error.f_str());
} jsonErrorDetected();
doc[key] = value; }
json = ""; ret = false;
serializeJson(doc, json); }
return ret; doc[key] = value;
} json = "";
serializeJson(doc, json);
bool jsonWriteInt_(String& json, const String& key, int value, bool e) { return ret;
bool ret = true; }
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
DeserializationError error = deserializeJson(doc, json); bool jsonWriteBool_(String& json, const String& key, bool value, bool e) {
if (error) { bool ret = true;
if (e) { DynamicJsonDocument doc(JSON_BUFFER_SIZE);
SerialPrint("E", F("jsonWrite"), error.f_str()); DeserializationError error = deserializeJson(doc, json);
jsonErrorDetected(); if (error) {
} if (e) {
ret = false; SerialPrint("E", F("jsonWrite"), error.f_str());
} jsonErrorDetected();
doc[key] = value; }
json = ""; ret = false;
serializeJson(doc, json); }
return ret; doc[key] = value;
} json = "";
serializeJson(doc, json);
bool jsonWriteFloat_(String& json, const String &key, float value, bool e) { return ret;
bool ret = true; }
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
DeserializationError error = deserializeJson(doc, json); bool jsonWriteInt_(String& json, const String& key, int value, bool e) {
if (error) { bool ret = true;
if (e) { DynamicJsonDocument doc(JSON_BUFFER_SIZE);
SerialPrint("E", F("jsonWrite"), error.f_str()); DeserializationError error = deserializeJson(doc, json);
jsonErrorDetected(); if (error) {
} if (e) {
ret = false; SerialPrint("E", F("jsonWrite"), error.f_str());
} jsonErrorDetected();
doc[key] = value; }
json = ""; ret = false;
serializeJson(doc, json); }
return ret; doc[key] = value;
} json = "";
serializeJson(doc, json);
void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t headerLenth, String& json) { return ret;
String payloadStr; }
payloadStr.reserve(length + 1);
for (size_t i = headerLenth; i < length; i++) { bool jsonWriteFloat_(String& json, const String &key, float value, bool e) {
payloadStr += (char)payload[i]; bool ret = true;
} DynamicJsonDocument doc(JSON_BUFFER_SIZE);
jsonMergeObjects(json, payloadStr); DeserializationError error = deserializeJson(doc, json);
} if (error) {
if (e) {
bool jsonMergeObjects(String& json1, String& json2, bool e) { SerialPrint("E", F("jsonWrite"), error.f_str());
bool ret = true; jsonErrorDetected();
DynamicJsonDocument doc1(JSON_BUFFER_SIZE); }
DeserializationError error1 = deserializeJson(doc1, json1); ret = false;
DynamicJsonDocument doc2(JSON_BUFFER_SIZE); }
DeserializationError error2 = deserializeJson(doc2, json2); doc[key] = value;
jsonMergeDocs(doc1.as<JsonObject>(), doc2.as<JsonObject>()); json = "";
if (error1 || error2) { serializeJson(doc, json);
if (e) { return ret;
SerialPrint("E", F("json"), "jsonMergeObjects error"); }
jsonErrorDetected();
} void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t headerLenth, String& json) {
ret = false; String payloadStr;
} payloadStr.reserve(length + 1);
json1 = ""; for (size_t i = headerLenth; i < length; i++) {
serializeJson(doc1, json1); payloadStr += (char)payload[i];
return ret; }
} jsonMergeObjects(json, payloadStr);
}
void jsonMergeDocs(JsonObject dest, JsonObjectConst src) {
for (auto kvp : src) { bool jsonMergeObjects(String& json1, String& json2, bool e) {
dest[kvp.key()] = kvp.value(); bool ret = true;
} DynamicJsonDocument doc1(JSON_BUFFER_SIZE);
} DeserializationError error1 = deserializeJson(doc1, json1);
DynamicJsonDocument doc2(JSON_BUFFER_SIZE);
// depricated====================================================================== DeserializationError error2 = deserializeJson(doc2, json2);
String jsonReadStr(const String& json, String name, bool e) { jsonMergeDocs(doc1.as<JsonObject>(), doc2.as<JsonObject>());
DynamicJsonDocument doc(JSON_BUFFER_SIZE); if (error1 || error2) {
DeserializationError error = deserializeJson(doc, json); if (e) {
if (error) { SerialPrint("E", F("json"), "jsonMergeObjects error");
if (e) { jsonErrorDetected();
SerialPrint("E", F("jsonRead"), error.f_str()); }
jsonErrorDetected(); ret = false;
} }
} json1 = "";
return doc[name].as<String>(); serializeJson(doc1, json1);
} return ret;
}
boolean jsonReadBool(const String& json, String name, bool e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); void jsonMergeDocs(JsonObject dest, JsonObjectConst src) {
DeserializationError error = deserializeJson(doc, json); for (auto kvp : src) {
if (error) { dest[kvp.key()] = kvp.value();
if (e) { }
SerialPrint("E", F("jsonRead"), error.f_str()); }
jsonErrorDetected();
} // depricated======================================================================
} String jsonReadStr(const String& json, String name, bool e) {
return doc[name].as<bool>(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
} DeserializationError error = deserializeJson(doc, json);
if (error) {
int jsonReadInt(const String& json, String name, bool e) { if (e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); SerialPrint("E", F("jsonRead"), error.f_str());
DeserializationError error = deserializeJson(doc, json); jsonErrorDetected();
if (error) { }
if (e) { }
SerialPrint("E", F("jsonRead"), error.f_str()); return doc[name].as<String>();
jsonErrorDetected(); }
}
} boolean jsonReadBool(const String& json, String name, bool e) {
return doc[name].as<int>(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
} DeserializationError error = deserializeJson(doc, json);
if (error) {
long int jsonReadLInt(const String& json, String name, bool e) { if (e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE); SerialPrint("E", F("jsonRead"), error.f_str());
DeserializationError error = deserializeJson(doc, json); jsonErrorDetected();
if (error) { }
if (e) { }
SerialPrint("E", F("jsonRead"), error.f_str()); return doc[name].as<bool>();
jsonErrorDetected(); }
}
} int jsonReadInt(const String& json, String name, bool e) {
return doc[name].as<long int>(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
} DeserializationError error = deserializeJson(doc, json);
if (error) {
// depricated======================================================================== if (e) {
String jsonWriteStr(String& json, String name, String value, bool e) { SerialPrint("E", F("jsonRead"), error.f_str());
DynamicJsonDocument doc(JSON_BUFFER_SIZE); jsonErrorDetected();
DeserializationError error = deserializeJson(doc, json); }
if (error) { }
if (e) { return doc[name].as<int>();
SerialPrint("E", F("jsonWrite"), error.f_str()); }
jsonErrorDetected();
} long int jsonReadLInt(const String& json, String name, bool e) {
} DynamicJsonDocument doc(JSON_BUFFER_SIZE);
doc[name] = value; DeserializationError error = deserializeJson(doc, json);
json = ""; if (error) {
serializeJson(doc, json); if (e) {
return json; SerialPrint("E", F("jsonRead"), error.f_str());
} jsonErrorDetected();
}
String jsonWriteBool(String& json, String name, boolean value, bool e) { }
DynamicJsonDocument doc(JSON_BUFFER_SIZE); return doc[name].as<long int>();
DeserializationError error = deserializeJson(doc, json); }
if (error) {
if (e) { // depricated========================================================================
SerialPrint("E", F("jsonWrite"), error.f_str()); String jsonWriteStr(String& json, String name, String value, bool e) {
jsonErrorDetected(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
} DeserializationError error = deserializeJson(doc, json);
} if (error) {
doc[name] = value; if (e) {
json = ""; SerialPrint("E", F("jsonWrite"), error.f_str());
serializeJson(doc, json); jsonErrorDetected();
return json; }
} }
doc[name] = value;
String jsonWriteInt(String& json, String name, int value, bool e) { json = "";
DynamicJsonDocument doc(JSON_BUFFER_SIZE); serializeJson(doc, json);
DeserializationError error = deserializeJson(doc, json); return json;
if (error) { }
if (e) {
SerialPrint("E", F("jsonWrite"), error.f_str()); String jsonWriteBool(String& json, String name, boolean value, bool e) {
jsonErrorDetected(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
} DeserializationError error = deserializeJson(doc, json);
} if (error) {
doc[name] = value; if (e) {
json = ""; SerialPrint("E", F("jsonWrite"), error.f_str());
serializeJson(doc, json); jsonErrorDetected();
return json; }
} }
doc[name] = value;
String jsonWriteFloat(String& json, String name, float value, bool e) { json = "";
DynamicJsonDocument doc(JSON_BUFFER_SIZE); serializeJson(doc, json);
DeserializationError error = deserializeJson(doc, json); return json;
if (error) { }
if (e) {
SerialPrint("E", F("jsonWrite"), error.f_str()); String jsonWriteInt(String& json, String name, int value, bool e) {
jsonErrorDetected(); DynamicJsonDocument doc(JSON_BUFFER_SIZE);
} DeserializationError error = deserializeJson(doc, json);
} if (error) {
doc[name] = value; if (e) {
json = ""; SerialPrint("E", F("jsonWrite"), error.f_str());
serializeJson(doc, json); jsonErrorDetected();
return json; }
} }
doc[name] = value;
void jsonErrorDetected() { json = "";
// пример как отправить ошибку с количеством serializeJson(doc, json);
// jsonWriteInt(errorsHeapJson, F("jse2"), 1); return json;
// int number = jsonReadInt(errorsHeapJson, F("jse2n")); }
// number++;
// jsonWriteInt(errorsHeapJson, F("jse2n"), number); String jsonWriteFloat(String& json, String name, float value, bool e) {
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
DeserializationError error = deserializeJson(doc, json);
if (error) {
if (e) {
SerialPrint("E", F("jsonWrite"), error.f_str());
jsonErrorDetected();
}
}
doc[name] = value;
json = "";
serializeJson(doc, json);
return json;
}
void jsonErrorDetected() {
// пример как отправить ошибку с количеством
// jsonWriteInt(errorsHeapJson, F("jse2"), 1);
// int number = jsonReadInt(errorsHeapJson, F("jse2n"));
// number++;
// jsonWriteInt(errorsHeapJson, F("jse2n"), number);
} }

View File

@@ -1,197 +1,210 @@
#include "utils/WiFiUtils.h" #include "utils/WiFiUtils.h"
#include <vector> #include <vector>
#define TRIESONE 25 // количество попыток подключения к одной сети из несколких #define TRIESONE 25 // количество попыток подключения к одной сети из несколких
#define TRIES 40 // количество попыток подключения сети если она одна #define TRIES 40 // количество попыток подключения сети если она одна
void routerConnect() { void routerConnect()
WiFi.setAutoConnect(false); {
WiFi.persistent(false); WiFi.setAutoConnect(false);
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
byte triesOne = TRIESONE; WiFi.mode(WIFI_STA);
byte triesOne = TRIESONE;
String _ssid = jsonReadStr(settingsFlashJson, "routerssid");
String _password = jsonReadStr(settingsFlashJson, "routerpass"); JsonArray _ssidList;
std::vector<String> _ssidList; JsonArray _passwordList;
std::vector<String> _passwordList; jsonReadArray(settingsFlashJson, "routerssid", _ssidList);
for (size_t i = 0; i < 3; i++) jsonReadStr(settingsFlashJson, "routerpass", _passwordList);
{ if (_ssidList.size() > 1)
String _stmp = selectFromMarkerToMarker(_ssid, ",", i); triesOne = TRIES;
String _ptmp = selectFromMarkerToMarker(_password, ",", i);
if (_stmp == "not found" && _ssidList.size() == 0) if (_ssidList.size() == 0 && _ssidList[0] == "" && _passwordList[0] == "")
{ {
triesOne = TRIES; WiFi.begin();
_ssidList.push_back(_ssid); }
_passwordList.push_back(_password); else
break; {
} WiFi.begin(_ssidList[0].as<const char*>(), _passwordList[0].as<const char*>());
if (_stmp != "not found") #ifdef ESP32
{ WiFi.setTxPower(WIFI_POWER_19_5dBm);
_ssidList.push_back(_stmp); #else
_passwordList.push_back(_ptmp); WiFi.setOutputPower(20.5);
} #endif
} String _ssid;
String _password;
if (_ssid == "" && _password == "") { for (int8_t i = 0; i < _ssidList.size(); i++)
WiFi.begin(); {
} else { _ssid = _ssid + _ssidList[i].as<String>() + "; ";
WiFi.begin(_ssidList[0].c_str(), _passwordList[0].c_str()); }
#ifdef ESP32 for (int8_t i = 0; i < _passwordList.size(); i++)
WiFi.setTxPower(WIFI_POWER_19_5dBm); {
#else _password = _ssid + _passwordList[i].as<String>() + "; ";
WiFi.setOutputPower(20.5); }
#endif SerialPrint("i", "WIFI", "ssid list: " + _ssid);
SerialPrint("i", "WIFI", "pass list: " + _password);
if (_ssidList.size() > 1) }
{ for (size_t i = 0; i < _ssidList.size(); i++)
SerialPrint("i", "WIFI", "ssid list: " + _ssid); {
SerialPrint("i", "WIFI", "pass list: " + _password); triesOne = TRIESONE;
} if (WiFi.status() == WL_CONNECTED)
} break;
for (size_t i = 0; i < _ssidList.size(); i++) { WiFi.begin(_ssidList[i].as<const char*>(), _passwordList[i].as<const char*>());
triesOne = TRIESONE; SerialPrint("i", "WIFI", "ssid connect: " + _ssidList[i].as<String>());
if (WiFi.status() == WL_CONNECTED) SerialPrint("i", "WIFI", "pass connect: " + _passwordList[i].as<String>());
break; while (--triesOne && WiFi.status() != WL_CONNECTED)
WiFi.begin(_ssidList[i].c_str(), _passwordList[i].c_str()); {
SerialPrint("i", "WIFI", "ssid connect: " + _ssidList[i]); // SerialPrint("i", "WIFI", ": " + String((int)WiFi.status()));
SerialPrint("i", "WIFI", "pass connect: " + _passwordList[i]); #ifdef ESP8266
while (--triesOne && WiFi.status() != WL_CONNECTED) { if (WiFi.status() == WL_CONNECT_FAILED || WiFi.status() == WL_WRONG_PASSWORD)
// SerialPrint("i", "WIFI", ": " + String((int)WiFi.status())); #else
#ifdef ESP8266 if (WiFi.status() == WL_CONNECT_FAILED)
if (WiFi.status() == WL_CONNECT_FAILED || WiFi.status() == WL_WRONG_PASSWORD) #endif
#else {
if (WiFi.status() == WL_CONNECT_FAILED) SerialPrint("E", "WIFI", "password is not correct");
#endif triesOne = 1;
{ jsonWriteInt(errorsHeapJson, "passer", 1);
SerialPrint("E", "WIFI", "password is not correct"); break;
triesOne = 1; }
jsonWriteInt(errorsHeapJson, "passer", 1); Serial.print(".");
break; delay(1000);
} }
Serial.print("."); Serial.println("");
delay(1000); }
}
Serial.println(""); if (WiFi.status() != WL_CONNECTED)
} {
Serial.println("");
if (WiFi.status() != WL_CONNECTED) { startAPMode();
Serial.println(""); }
startAPMode(); else
} else { {
Serial.println(""); Serial.println("");
SerialPrint("i", "WIFI", "http://" + WiFi.localIP().toString()); SerialPrint("i", "WIFI", "http://" + WiFi.localIP().toString());
jsonWriteStr(settingsFlashJson, "ip", WiFi.localIP().toString()); jsonWriteStr(settingsFlashJson, "ip", WiFi.localIP().toString());
mqttInit(); mqttInit();
} }
SerialPrint("i", F("WIFI"), F("Network Init")); SerialPrint("i", F("WIFI"), F("Network Init"));
} }
bool startAPMode() { bool startAPMode()
SerialPrint("i", "WIFI", "AP Mode"); {
SerialPrint("i", "WIFI", "AP Mode");
WiFi.disconnect();
WiFi.mode(WIFI_AP); WiFi.disconnect();
WiFi.mode(WIFI_AP);
String _ssidAP = jsonReadStr(settingsFlashJson, "apssid");
String _passwordAP = jsonReadStr(settingsFlashJson, "appass"); String _ssidAP = jsonReadStr(settingsFlashJson, "apssid");
String _passwordAP = jsonReadStr(settingsFlashJson, "appass");
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
IPAddress myIP = WiFi.softAPIP(); WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
IPAddress myIP = WiFi.softAPIP();
SerialPrint("i", "WIFI", "AP IP: " + myIP.toString());
jsonWriteStr(settingsFlashJson, "ip", myIP.toString()); SerialPrint("i", "WIFI", "AP IP: " + myIP.toString());
jsonWriteStr(settingsFlashJson, "ip", myIP.toString());
if (jsonReadInt(errorsHeapJson, "passer") != 1) {
ts.add( if (jsonReadInt(errorsHeapJson, "passer") != 1)
WIFI_SCAN, 30 * 1000, [&](void*) { {
String sta_ssid = jsonReadStr(settingsFlashJson, "routerssid"); ts.add(
WIFI_SCAN, 30 * 1000,
SerialPrint("i", "WIFI", "scanning for " + sta_ssid); [&](void *)
{
if (RouterFind(sta_ssid)) { JsonArray jArray;
ts.remove(WIFI_SCAN); jsonReadArray(settingsFlashJson, "routerssid", jArray);
WiFi.scanDelete(); for (JsonVariant value : jArray)
routerConnect(); {
} SerialPrint("i", "WIFI", "scanning for " + String(value.as<const char*>()));
}, }
nullptr, true); if (RouterFind(jArray))
} {
return true; ts.remove(WIFI_SCAN);
} WiFi.scanDelete();
routerConnect();
boolean RouterFind(String ssid) { }
bool res = false; },
int n = WiFi.scanComplete(); nullptr, true);
SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); }
return true;
if (n == -2) { //Сканирование не было запущено, запускаем }
SerialPrint("i", "WIFI", "start scanning");
WiFi.scanNetworks(true, false); // async, show_hidden boolean RouterFind(JsonArray jArray)
} {
bool res = false;
else if (n == -1) { //Сканирование все еще выполняется int n = WiFi.scanComplete();
SerialPrint("i", "WIFI", "scanning in progress"); SerialPrint("i", "WIFI", "scan result: " + String(n, DEC));
}
if (n == -2)
else if (n == 0) { //ни одна сеть не найдена { // Сканирование не было запущено, запускаем
SerialPrint("i", "WIFI", "no networks found"); SerialPrint("i", "WIFI", "start scanning");
WiFi.scanNetworks(true, false); WiFi.scanNetworks(true, false); // async, show_hidden
} }
else if (n > 0)
{ else if (n == -1)
std::vector<String> _ssidList; { // Сканирование все еще выполняется
for (size_t i = 0; i < 3; i++) SerialPrint("i", "WIFI", "scanning in progress");
{ }
String _stmp = selectFromMarkerToMarker(ssid, ",", i);
if (_stmp == "not found" && _ssidList.size() == 0) else if (n == 0)
{ { // ни одна сеть не найдена
_ssidList.push_back(ssid); SerialPrint("i", "WIFI", "no networks found");
break; WiFi.scanNetworks(true, false);
} }
if (_stmp != "not found") else if (n > 0)
_ssidList.push_back(_stmp); {
} for (int8_t i = 0; i < n; i++)
{
for (int8_t i = 0; i < n; i++) for (int8_t k = 0; k < jArray.size(); k++)
{ {
if (WiFi.SSID(i) == _ssidList[0] || WiFi.SSID(i) == _ssidList[1] || if (WiFi.SSID(i) == String(jArray[k]))
WiFi.SSID(i) == _ssidList[2]) {
{ res = true;
res = true; }
} }
// SerialPrint("i", "WIFI", (res ? "*" : "") + String(i, DEC) + ") " + WiFi.SSID(i)); // SerialPrint("i", "WIFI", (res ? "*" : "") + String(i, DEC) + ") " + WiFi.SSID(i));
jsonWriteStr_(ssidListHeapJson, String(i), WiFi.SSID(i)); jsonWriteStr_(ssidListHeapJson, String(i), WiFi.SSID(i));
// String(WiFi.RSSI(i) // String(WiFi.RSSI(i)
} }
} }
SerialPrint("i", "WIFI", ssidListHeapJson); SerialPrint("i", "WIFI", ssidListHeapJson);
WiFi.scanDelete(); WiFi.scanDelete();
return res; return res;
} }
// boolean isNetworkActive() { // boolean isNetworkActive() {
// return WiFi.status() == WL_CONNECTED; // return WiFi.status() == WL_CONNECTED;
// } // }
uint8_t RSSIquality() { uint8_t RSSIquality()
uint8_t res = 0; {
if (WiFi.status() == WL_CONNECTED) { uint8_t res = 0;
int rssi = WiFi.RSSI(); if (WiFi.status() == WL_CONNECTED)
if (rssi >= -50) { {
res = 6; //"Excellent"; int rssi = WiFi.RSSI();
} else if (rssi < -50 && rssi >= -60) { if (rssi >= -50)
res = 5; //"Very good"; {
} else if (rssi < -60 && rssi >= -70) { res = 6; //"Excellent";
res = 4; //"Good"; }
} else if (rssi < -70 && rssi >= -80) { else if (rssi < -50 && rssi >= -60)
res = 3; //"Low"; {
} else if (rssi < -80 && rssi > -100) { res = 5; //"Very good";
res = 2; //"Very low"; }
} else if (rssi <= -100) { else if (rssi < -60 && rssi >= -70)
res = 1; //"No signal"; {
} res = 4; //"Good";
} }
return res; else if (rssi < -70 && rssi >= -80)
} {
res = 3; //"Low";
}
else if (rssi < -80 && rssi > -100)
{
res = 2; //"Very low";
}
else if (rssi <= -100)
{
res = 1; //"No signal";
}
}
return res;
}