добавлена кнопка перезагрузки

This commit is contained in:
Dmitry Borisenko
2022-02-08 16:47:17 +01:00
parent 57bd78ad90
commit 45c5681dc6
16 changed files with 105 additions and 42 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{ {
"name": "IoTmanager", "name": "IoTmanagerVer4",
"apssid": "IoTmanager", "apssid": "IoTmanager",
"appass": "", "appass": "",
"routerssid": "rise", "routerssid": "rise",

View File

@@ -33,7 +33,7 @@ enum TimerTask_t { WIFI_SCAN,
UPTIME, UPTIME,
SYGNAL, SYGNAL,
TIMES, TIMES,
MYTEST }; PTASK };
//задачи которые надо протащить через loop //задачи которые надо протащить через loop
enum NotAsyncActions { enum NotAsyncActions {

View File

@@ -79,6 +79,7 @@ extern WebSocketsServer standWebSocket;
***********************************************глобальные переменные************************************************** ***********************************************глобальные переменные**************************************************
**********************************************************************************************************************/ **********************************************************************************************************************/
extern String settingsFlashJson; extern String settingsFlashJson;
extern String errorsHeapJson;
extern String paramsFlashJson; extern String paramsFlashJson;
extern String paramsHeapJson; extern String paramsHeapJson;
@@ -87,9 +88,9 @@ extern String orderBuf;
extern String eventBuf; extern String eventBuf;
// wifi // wifi
extern String ssidListJson; extern String ssidListHeapJson;
extern String devListJson; extern String devListHeapJson;
// Mqtt // Mqtt
extern String mqttServer; extern String mqttServer;

View File

@@ -10,3 +10,4 @@
#include "MqttClient.h" #include "MqttClient.h"
#include "WsServer.h" #include "WsServer.h"
#include "DeviceList.h" #include "DeviceList.h"
#include "PeriodicTasks.h"

5
include/PeriodicTasks.h Normal file
View File

@@ -0,0 +1,5 @@
#pragma once
#include "Global.h"
#include "WsServer.h"
extern void periodicTasksInit();

View File

@@ -12,6 +12,7 @@ extern void hexdump(const void* mem, uint32_t len, uint8_t cols);
void sendFileToWs(const char* filename, uint8_t num, size_t frameSize); void sendFileToWs(const char* filename, uint8_t num, size_t frameSize);
void publishStatusWs(const String& topic, const String& data); void publishStatusWs(const String& topic, const String& data);
void periodicWsSend();
void sendStringToWs(const String& msg, uint8_t num, String name); void sendStringToWs(const String& msg, uint8_t num, String name);
// void sendMark(const char* filename, const char* mark, uint8_t num); // void sendMark(const char* filename, const char* mark, uint8_t num);

View File

@@ -1,19 +1,19 @@
#include "DeviceList.h" #include "DeviceList.h"
void addThisDeviceToList() { void addThisDeviceToList() {
jsonWriteStr_(devListJson, "devicelist", ""); //метка для парсинга jsonWriteStr_(devListHeapJson, "devicelist", ""); //метка для парсинга
jsonWriteStr_(devListJson, "ip", jsonReadStr(settingsFlashJson, "ip")); jsonWriteStr_(devListHeapJson, "ip", jsonReadStr(settingsFlashJson, "ip"));
jsonWriteStr_(devListJson, "id", jsonReadStr(settingsFlashJson, "id")); jsonWriteStr_(devListHeapJson, "id", jsonReadStr(settingsFlashJson, "id"));
jsonWriteStr_(devListJson, "name", jsonReadStr(settingsFlashJson, "name")); jsonWriteStr_(devListHeapJson, "name", jsonReadStr(settingsFlashJson, "name"));
// для проверки // для проверки
// devListJson = devListJson + ","; // devListHeapJson = devListHeapJson + ",";
// String test; // String test;
// jsonWriteStr_(test, "ip", "192.168.88.88"); // jsonWriteStr_(test, "ip", "192.168.88.88");
// jsonWriteStr_(test, "id", "123456789"); // jsonWriteStr_(test, "id", "123456789");
// jsonWriteStr_(test, "name", "test"); // jsonWriteStr_(test, "name", "test");
// devListJson = devListJson + test; // devListHeapJson = devListHeapJson + test;
devListJson = "[" + devListJson + "]"; devListHeapJson = "[" + devListHeapJson + "]";
Serial.println(devListJson); Serial.println(devListHeapJson);
} }

View File

@@ -17,8 +17,11 @@ void globalVarsSync() {
mqttRootDevice = mqttPrefix + "/" + chipId; mqttRootDevice = mqttPrefix + "/" + chipId;
jsonWriteStr_(settingsFlashJson, "root", mqttRootDevice); jsonWriteStr_(settingsFlashJson, "root", mqttRootDevice);
jsonWriteStr_(settingsFlashJson, "id", chipId); jsonWriteStr_(settingsFlashJson, "id", chipId);
saveSettingsFlashJson(); saveSettingsFlashJson();
jsonWriteStr_(ssidListJson, "ssid", ""); //метка для парсинга
jsonWriteStr_(errorsHeapJson, "errors", ""); //метка для парсинга
jsonWriteStr_(ssidListHeapJson, "ssid", ""); //метка для парсинга
jsonWriteStr(paramsHeapJson, "params", ""); //метка для парсинга jsonWriteStr(paramsHeapJson, "params", ""); //метка для парсинга
} }

View File

@@ -4,7 +4,7 @@
*****************************************глобальные объекты классов*************************************************** *****************************************глобальные объекты классов***************************************************
**********************************************************************************************************************/ **********************************************************************************************************************/
TickerScheduler ts(MYTEST + 1); TickerScheduler ts(PTASK + 1);
WiFiClient espClient; WiFiClient espClient;
PubSubClient mqtt(espClient); PubSubClient mqtt(espClient);
StringCommand sCmd; StringCommand sCmd;
@@ -31,6 +31,8 @@ WebSocketsServer standWebSocket = WebSocketsServer(81);
**********************************************************************************************************************/ **********************************************************************************************************************/
String settingsFlashJson = "{}"; //переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью String settingsFlashJson = "{}"; //переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью
String errorsHeapJson = "{}"; //переменная в которой хранятся все ошибки, находится в оперативной памяти только
String paramsFlashJson = "{}"; //переменная в которой хранятся все параметры, находится в оперативной памяти и синхронизированна с flash памятью String paramsFlashJson = "{}"; //переменная в которой хранятся все параметры, находится в оперативной памяти и синхронизированна с flash памятью
String paramsHeapJson = "{}"; //переменная в которой хранятся все параметры, находится в оперативной памяти только String paramsHeapJson = "{}"; //переменная в которой хранятся все параметры, находится в оперативной памяти только
@@ -39,9 +41,9 @@ String orderBuf = "";
String eventBuf = ""; String eventBuf = "";
// wifi // wifi
String ssidListJson = "{}"; String ssidListHeapJson = "{}";
String devListJson; String devListHeapJson;
// Mqtt // Mqtt
String mqttServer = ""; String mqttServer = "";

View File

@@ -48,13 +48,8 @@ void setup() {
configure("/config.json"); configure("/config.json");
//задачи редкого выполнения //инициализация задач переодического выполнения
ts.add( periodicTasksInit();
MYTEST, 1000 * 30, [&](void*) {
SerialPrint(F("i"), F("HEAP"), prettyBytes(ESP.getFreeHeap()));
standWebSocket.broadcastTXT(devListJson);
},
nullptr, true);
} }
void loop() { void loop() {

11
src/PeriodicTasks.cpp Normal file
View File

@@ -0,0 +1,11 @@
#include "PeriodicTasks.h"
void periodicTasksInit() {
//задачи редкого выполнения
ts.add(
PTASK, 1000 * 30, [&](void*) {
SerialPrint(F("i"), F("HEAP"), prettyBytes(ESP.getFreeHeap()));
periodicWsSend();
},
nullptr, true);
}

View File

@@ -3,6 +3,7 @@
void standWebSocketsInit() { void standWebSocketsInit() {
standWebSocket.begin(); standWebSocket.begin();
standWebSocket.onEvent(webSocketEvent); standWebSocket.onEvent(webSocketEvent);
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) {
@@ -16,9 +17,16 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
} break; } break;
case WStype_CONNECTED: { case WStype_CONNECTED: {
IPAddress ip = standWebSocket.remoteIP(num); // IPAddress ip = standWebSocket.remoteIP(num);
Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); SerialPrint("i", "WS " + String(num), "WS client connected");
standWebSocket.sendTXT(num, "Connected"); if (num > 3) {
SerialPrint("E", "WS", "Too many clients, connection closed!!!");
jsonWriteInt(errorsHeapJson, "wscle", 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; } break;
case WStype_TEXT: { case WStype_TEXT: {
@@ -29,42 +37,63 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
for (size_t i = 0; i < headerLenth; i++) { for (size_t i = 0; i < headerLenth; i++) {
headerStr += (char)payload[i]; headerStr += (char)payload[i];
} }
//отправка данных которые нужны для всех страниц веб интерфейса
//эти данные мы отправляем в двух случаях:
// 1 пользователь перешел на новую страницу
// 2 каждые 30 секунд
// all pages===================================================================
//**отправка**//
if (headerStr == ("/all")) {
standWebSocket.sendTXT(num, ssidListHeapJson);
standWebSocket.broadcastTXT(errorsHeapJson);
}
// dashboard=================================================================== // dashboard===================================================================
//**отправка**//
if (headerStr == "/") { if (headerStr == "/") {
sendFileToWs("/layout.json", num, 1024); sendFileToWs("/layout.json", num, 1024);
standWebSocket.sendTXT(num, paramsHeapJson); standWebSocket.sendTXT(num, paramsHeapJson);
} }
//**сохранение**//
if (headerStr == "/tuoyal") { if (headerStr == "/tuoyal") {
writeFileUint8tByFrames("layout.json", payload, length, headerLenth, 256); writeFileUint8tByFrames("layout.json", payload, length, headerLenth, 256);
} }
// configutation=============================================================== // configutation===============================================================
//**отправка**//
if (headerStr == "/config") { if (headerStr == "/config") {
sendFileToWs("/items.json", num, 1024); sendFileToWs("/items.json", num, 1024);
sendFileToWs("/widgets.json", num, 1024); sendFileToWs("/widgets.json", num, 1024);
sendFileToWs("/config.json", num, 1024); sendFileToWs("/config.json", num, 1024);
sendFileToWs("/settings.json", num, 1024); // sendFileToWs("/settings.json", num, 1024);
} }
//**сохранение**//
if (headerStr == "/gifnoc") { if (headerStr == "/gifnoc") {
writeFileUint8tByFrames("config.json", payload, length, headerLenth, 256); writeFileUint8tByFrames("config.json", payload, length, headerLenth, 256);
} }
// connection=================================================================== // connection===================================================================
//**отправка**//
if (headerStr == "/connec") { if (headerStr == "/connec") {
sendFileToWs("/settings.json", num, 1024); sendFileToWs("/settings.json", num, 1024);
//запуск асинхронного сканирования wifi сетей при переходе на страницу соединений
RouterFind(jsonReadStr(settingsFlashJson, F("routerssid"))); RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
standWebSocket.sendTXT(num, ssidListJson);
} }
//**отправка**//
if (headerStr == "/scan") { if (headerStr == "/scan") {
//запуск асинхронного сканирования wifi сетей при нажатии выпадающего списка
RouterFind(jsonReadStr(settingsFlashJson, F("routerssid"))); RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
standWebSocket.sendTXT(num, ssidListJson);
} }
//**сохранение**//
if (headerStr == "/cennoc") { if (headerStr == "/cennoc") {
writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256); writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256);
settingsFlashJson = readFile(F("settings.json"), 4096); settingsFlashJson = readFile(F("settings.json"), 4096);
} }
// list =================================================================== // list ===================================================================
//**отправка**//
if (headerStr == "/list") { if (headerStr == "/list") {
standWebSocket.sendTXT(num, devListJson); standWebSocket.sendTXT(num, devListHeapJson);
sendFileToWs("/settings.json", num, 1024); }
// orders ===================================================================
if (headerStr == "/reboot") {
ESP.restart();
} }
} break; } break;
@@ -105,6 +134,13 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
} }
} }
//данные которые мы отправляем в сокеты переодически
void periodicWsSend() {
standWebSocket.broadcastTXT(devListHeapJson);
standWebSocket.broadcastTXT(ssidListHeapJson);
standWebSocket.broadcastTXT(errorsHeapJson);
}
#ifdef ESP32 #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; const uint8_t* src = (const uint8_t*)mem;

View File

@@ -1,5 +1,13 @@
#include "Utils/FileUtils.h" #include "Utils/FileUtils.h"
void writeStrValueToJsonFile(const String& filename, String key, String value) {
String tmp = readFile(filename, 4096);
if (!jsonWriteStr_(tmp, key, value)) {
Serial.println(F("failed write json value to file"));
}
writeFile(filename, tmp);
}
//данная функция записывает файл из буфера страницами указанного размера //данная функция записывает файл из буфера страницами указанного размера
void writeFileUint8tByFrames(const String& filename, uint8_t*& big_buf, size_t length, size_t headerLenth, size_t frameSize) { void writeFileUint8tByFrames(const String& filename, uint8_t*& big_buf, size_t length, size_t headerLenth, size_t frameSize) {
String path = filepath(filename); String path = filepath(filename);

View File

@@ -27,7 +27,7 @@ void routerConnect() {
if (WiFi.status() == WL_CONNECT_FAILED) { if (WiFi.status() == WL_CONNECT_FAILED) {
SerialPrint("E", "WIFI", "password is not correct"); SerialPrint("E", "WIFI", "password is not correct");
tries = 1; tries = 1;
jsonWriteInt(settingsFlashJson, "pass_status", 1); jsonWriteInt(errorsHeapJson, "passer", 1);
} }
Serial.print("."); Serial.print(".");
delay(1000); delay(1000);
@@ -61,7 +61,7 @@ bool startAPMode() {
SerialPrint("i", "WIFI", "AP IP: " + myIP.toString()); SerialPrint("i", "WIFI", "AP IP: " + myIP.toString());
jsonWriteStr(settingsFlashJson, "ip", myIP.toString()); jsonWriteStr(settingsFlashJson, "ip", myIP.toString());
if (jsonReadInt(settingsFlashJson, "pass_status") != 1) { if (jsonReadInt(errorsHeapJson, "passer") != 1) {
ts.add( ts.add(
WIFI_SCAN, 10 * 1000, [&](void*) { WIFI_SCAN, 10 * 1000, [&](void*) {
String sta_ssid = jsonReadStr(settingsFlashJson, "routerssid"); String sta_ssid = jsonReadStr(settingsFlashJson, "routerssid");
@@ -104,12 +104,12 @@ boolean RouterFind(String ssid) {
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_(ssidListJson, String(i), WiFi.SSID(i)); jsonWriteStr_(ssidListHeapJson, String(i), WiFi.SSID(i));
// String(WiFi.RSSI(i) // String(WiFi.RSSI(i)
} }
} }
SerialPrint("i", "WIFI", ssidListJson); SerialPrint("i", "WIFI", ssidListHeapJson);
WiFi.scanDelete(); WiFi.scanDelete();
return res; return res;
} }