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

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",
"appass": "",
"routerssid": "rise",

View File

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

View File

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

View File

@@ -10,3 +10,4 @@
#include "MqttClient.h"
#include "WsServer.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 publishStatusWs(const String& topic, const String& data);
void periodicWsSend();
void sendStringToWs(const String& msg, uint8_t num, String name);
// void sendMark(const char* filename, const char* mark, uint8_t num);

View File

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

View File

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

View File

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

View File

@@ -48,13 +48,8 @@ void setup() {
configure("/config.json");
//задачи редкого выполнения
ts.add(
MYTEST, 1000 * 30, [&](void*) {
SerialPrint(F("i"), F("HEAP"), prettyBytes(ESP.getFreeHeap()));
standWebSocket.broadcastTXT(devListJson);
},
nullptr, true);
//инициализация задач переодического выполнения
periodicTasksInit();
}
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() {
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) {
@@ -16,9 +17,16 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
} break;
case WStype_CONNECTED: {
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);
standWebSocket.sendTXT(num, "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, "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;
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++) {
headerStr += (char)payload[i];
}
//отправка данных которые нужны для всех страниц веб интерфейса
//эти данные мы отправляем в двух случаях:
// 1 пользователь перешел на новую страницу
// 2 каждые 30 секунд
// all pages===================================================================
//**отправка**//
if (headerStr == ("/all")) {
standWebSocket.sendTXT(num, ssidListHeapJson);
standWebSocket.broadcastTXT(errorsHeapJson);
}
// dashboard===================================================================
//**отправка**//
if (headerStr == "/") {
sendFileToWs("/layout.json", num, 1024);
standWebSocket.sendTXT(num, paramsHeapJson);
}
//**сохранение**//
if (headerStr == "/tuoyal") {
writeFileUint8tByFrames("layout.json", payload, length, headerLenth, 256);
}
// configutation===============================================================
//**отправка**//
if (headerStr == "/config") {
sendFileToWs("/items.json", num, 1024);
sendFileToWs("/widgets.json", num, 1024);
sendFileToWs("/config.json", num, 1024);
sendFileToWs("/settings.json", num, 1024);
// sendFileToWs("/settings.json", num, 1024);
}
//**сохранение**//
if (headerStr == "/gifnoc") {
writeFileUint8tByFrames("config.json", payload, length, headerLenth, 256);
}
// connection===================================================================
//**отправка**//
if (headerStr == "/connec") {
sendFileToWs("/settings.json", num, 1024);
//запуск асинхронного сканирования wifi сетей при переходе на страницу соединений
RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
standWebSocket.sendTXT(num, ssidListJson);
}
//**отправка**//
if (headerStr == "/scan") {
//запуск асинхронного сканирования wifi сетей при нажатии выпадающего списка
RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
standWebSocket.sendTXT(num, ssidListJson);
}
//**сохранение**//
if (headerStr == "/cennoc") {
writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256);
settingsFlashJson = readFile(F("settings.json"), 4096);
}
// list ===================================================================
//**отправка**//
if (headerStr == "/list") {
standWebSocket.sendTXT(num, devListJson);
sendFileToWs("/settings.json", num, 1024);
standWebSocket.sendTXT(num, devListHeapJson);
}
// orders ===================================================================
if (headerStr == "/reboot") {
ESP.restart();
}
} 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
void hexdump(const void* mem, uint32_t len, uint8_t cols = 16) {
const uint8_t* src = (const uint8_t*)mem;

View File

@@ -1,5 +1,13 @@
#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) {
String path = filepath(filename);

View File

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