mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
@@ -1,9 +1,13 @@
|
||||
#include "DeviceList.h"
|
||||
|
||||
// данная функция не записывает поле status из этого следует что поле равно false и поэтому весь список устройств отдаваемый мк
|
||||
// уходит со статусом для всех устройств - offline
|
||||
// приложение svelte хранит свой список и в нем поддерживает корректные статусы, а при получении этого списка
|
||||
// лишь изменяет в своем те элементы массива которые добавились новые, не трогая остальные
|
||||
const String getThisDevice() {
|
||||
String thisDevice = "{}";
|
||||
jsonWriteStr_(thisDevice, F("devicelist_"), ""); //метка для парсинга
|
||||
jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); //рабочая группа
|
||||
// jsonWriteStr_(thisDevice, F("devicelist_"), ""); // метка для парсинга - она не нужна теперь
|
||||
jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); // рабочая группа
|
||||
jsonWriteStr_(thisDevice, F("ip"), jsonReadStr(settingsFlashJson, F("ip")));
|
||||
jsonWriteStr_(thisDevice, F("id"), jsonReadStr(settingsFlashJson, F("id")));
|
||||
jsonWriteStr_(thisDevice, F("name"), jsonReadStr(settingsFlashJson, F("name")));
|
||||
@@ -12,54 +16,80 @@ const String getThisDevice() {
|
||||
}
|
||||
|
||||
void addThisDeviceToList() {
|
||||
devListHeapJson = getThisDevice();
|
||||
SerialPrint("i", "List", "Add this dev to list");
|
||||
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||
// если включен автопоиск то записываем это устройство в оперативную память
|
||||
devListHeapJson = getThisDevice();
|
||||
} else {
|
||||
// если выключен автопоиск то записываем это устройство в флешь память
|
||||
// если файла не было никогда
|
||||
String list = readFile("/devlist.json", 2048);
|
||||
if (list == "failed") {
|
||||
writeFile("/devlist.json", getThisDevice());
|
||||
} else {
|
||||
// если файл был то перепишем в нем первое устройство - to do
|
||||
}
|
||||
}
|
||||
|
||||
SerialPrint("i", F("List"), F("This dev added to list"));
|
||||
}
|
||||
|
||||
#ifdef UDP_ENABLED
|
||||
AsyncUDP asyncUdp;
|
||||
|
||||
void asyncUdpInit() {
|
||||
void udpListningInit() {
|
||||
if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) {
|
||||
asyncUdp.onPacket([](AsyncUDPPacket packet) {
|
||||
// Serial.print("UDP Packet Type: ");
|
||||
// Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast");
|
||||
// Serial.print("From: ");
|
||||
// Serial.print(packet.remoteIP());
|
||||
// Serial.print(":");
|
||||
// Serial.println(packet.remotePort());
|
||||
// Serial.print("To: ");
|
||||
// Serial.print(packet.localIP());
|
||||
// Serial.print(":");
|
||||
// Serial.println(packet.localPort());
|
||||
// Serial.print(", Length: ");
|
||||
// Serial.print(packet.length());
|
||||
// Serial.print(", Data: ");
|
||||
// Serial.write(packet.data(), packet.length());
|
||||
|
||||
//String data = {packet.data(), packet.length()}; // для ESP32 подходит как замена uint8tToString, но 8266 не переваривает
|
||||
String data = uint8tToString(packet.data(), packet.length());
|
||||
String remoteWorkgroup = "";
|
||||
data.replace("[", "");
|
||||
data.replace("]", "");
|
||||
if (jsonRead(data, F("wg"), remoteWorkgroup)) { // проверяем чтоб полученный формат был Json и заодно вытягиваем имя группы
|
||||
String loacalWorkgroup = "";
|
||||
jsonRead(settingsFlashJson, F("wg"), loacalWorkgroup);
|
||||
if (remoteWorkgroup == loacalWorkgroup) {
|
||||
SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort()));
|
||||
jsonMergeArrays(devListHeapJson, data);
|
||||
// если был включен автоматический поиск устройств то начнем запись в оперативную память
|
||||
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||
// Serial.print("UDP Packet Type: ");
|
||||
// Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast");
|
||||
// Serial.print("From: ");
|
||||
// Serial.print(packet.remoteIP());
|
||||
// Serial.print(":");
|
||||
// Serial.println(packet.remotePort());
|
||||
// Serial.print("To: ");
|
||||
// Serial.print(packet.localIP());
|
||||
// Serial.print(":");
|
||||
// Serial.println(packet.localPort());
|
||||
// Serial.print(", Length: ");
|
||||
// Serial.print(packet.length());
|
||||
// Serial.print(", Data: ");
|
||||
// Serial.write(packet.data(), packet.length());
|
||||
// String data = {packet.data(), packet.length()}; // для ESP32 подходит как замена uint8tToString, но 8266 не переваривает
|
||||
|
||||
String data = uint8tToString(packet.data(), packet.length());
|
||||
String remoteWorkgroup = "";
|
||||
data.replace("[", "");
|
||||
data.replace("]", "");
|
||||
if (jsonRead(data, F("wg"), remoteWorkgroup)) { // проверяем чтоб полученный формат был Json и заодно вытягиваем имя группы
|
||||
String loacalWorkgroup = "";
|
||||
jsonRead(settingsFlashJson, F("wg"), loacalWorkgroup);
|
||||
if (remoteWorkgroup == loacalWorkgroup) {
|
||||
SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort()));
|
||||
jsonMergeArrays(devListHeapJson, data);
|
||||
// эксперементальный вариант отправки нового списка сразу по приходу
|
||||
// sendStringToWs("devlis", devListHeapJson, -1);
|
||||
}
|
||||
} else {
|
||||
SerialPrint("E", F("UDP"), F("Udp packet invalid"));
|
||||
}
|
||||
|
||||
// reply to the client
|
||||
// String ip = WiFi.localIP().toString();
|
||||
// asyncUdp.broadcastTo(ip.c_str(), packet.remotePort());
|
||||
// packet.printf(ip.c_str(), packet.length());
|
||||
|
||||
} else {
|
||||
SerialPrint("E", F("UDP"), F("Udp packet invalid"));
|
||||
devListHeapJson = "";
|
||||
}
|
||||
// reply to the client
|
||||
// String ip = WiFi.localIP().toString();
|
||||
// asyncUdp.broadcastTo(ip.c_str(), packet.remotePort());
|
||||
// packet.printf(ip.c_str(), packet.length());
|
||||
});
|
||||
}
|
||||
|
||||
//будем отправлять каждые 60 секунд презентацию данного устройства
|
||||
SerialPrint("i", F("UDP"), F("Udp listning inited"));
|
||||
}
|
||||
|
||||
void udpBroadcastInit() {
|
||||
// будем отправлять каждые 60 секунд презентацию данного устройства
|
||||
ts.add(
|
||||
UDP, 60000, [&](void*) { // UDPP
|
||||
if (isNetworkActive()) {
|
||||
@@ -71,11 +101,11 @@ void asyncUdpInit() {
|
||||
},
|
||||
nullptr, true);
|
||||
|
||||
SerialPrint("i", F("UDP"), F("Udp Init"));
|
||||
SerialPrint("i", F("UDP"), F("Udp broadcast inited"));
|
||||
}
|
||||
|
||||
void jsonMergeArrays(String& existJson, String& incJson) {
|
||||
DynamicJsonDocument incJsonDoc(1024);
|
||||
DynamicJsonDocument incJsonDoc(4096);
|
||||
DeserializationError incJsonError = deserializeJson(incJsonDoc, incJson);
|
||||
// if (incJsonError) { // upd: devlist заведомо верный, зачем проверять еще раз?
|
||||
// SerialPrint("E", F("UDP"), "Invailed json in incomming udp packet " + String(incJsonError.f_str()));
|
||||
@@ -83,7 +113,7 @@ void jsonMergeArrays(String& existJson, String& incJson) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
DynamicJsonDocument existJsonDoc(1024);
|
||||
DynamicJsonDocument existJsonDoc(4096);
|
||||
DeserializationError existJsonError = deserializeJson(existJsonDoc, existJson);
|
||||
// if (existJsonError) { // upd: полученный json уже проверен на целостность
|
||||
// SerialPrint("E", F("UDP"), "Invailed json in existing udp dev list " + String(incJsonError.f_str()));
|
||||
|
||||
@@ -26,13 +26,13 @@ void globalVarsSync() {
|
||||
// jsonWriteStr_(ssidListHeapJson, "ssids_", ""); //метка для парсинга удалить
|
||||
}
|
||||
|
||||
//к удалению. не используется
|
||||
// String getParamsJson() {
|
||||
// String json;
|
||||
// serializeJson(*getLocalItemsAsJSON(), json);
|
||||
// jsonWriteStr_(json, "params", "");
|
||||
// return json;
|
||||
// }
|
||||
// к удалению. не используется
|
||||
// String getParamsJson() {
|
||||
// String json;
|
||||
// serializeJson(*getLocalItemsAsJSON(), json);
|
||||
// jsonWriteStr_(json, "params", "");
|
||||
// return json;
|
||||
// }
|
||||
|
||||
void syncSettingsFlashJson() {
|
||||
writeFile(F("settings.json"), settingsFlashJson);
|
||||
@@ -43,7 +43,7 @@ void syncValuesFlashJson() {
|
||||
}
|
||||
|
||||
const String getChipId() {
|
||||
return String(ESP_getChipId()) + "-" + String(ESP_getFlashChipId());
|
||||
return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION);
|
||||
}
|
||||
|
||||
void setChipId() {
|
||||
@@ -76,6 +76,7 @@ uint32_t ESP_getChipId(void) {
|
||||
#endif
|
||||
}
|
||||
|
||||
// устарела используем новую функцию ниже
|
||||
uint32_t ESP_getFlashChipId(void) {
|
||||
#ifdef ESP32
|
||||
// Нет аналогичной (без доп.кода) функций в 32
|
||||
@@ -86,6 +87,31 @@ uint32_t ESP_getFlashChipId(void) {
|
||||
#endif
|
||||
}
|
||||
|
||||
// https://github.com/espressif/arduino-esp32/issues/6945#issuecomment-1199900892
|
||||
// получение flash ch id из проекта esp easy
|
||||
|
||||
uint32_t getFlashChipIdNew() {
|
||||
// Cache since size does not change
|
||||
static uint32_t flashChipId = 0;
|
||||
|
||||
if (flashChipId == 0) {
|
||||
#ifdef ESP32
|
||||
uint32_t tmp = g_rom_flashchip.device_id;
|
||||
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
flashChipId = flashChipId << 8;
|
||||
flashChipId |= (tmp & 0xFF);
|
||||
tmp = tmp >> 8;
|
||||
}
|
||||
|
||||
// esp_flash_read_id(nullptr, &flashChipId);
|
||||
#elif defined(ESP8266)
|
||||
flashChipId = ESP.getFlashChipId();
|
||||
#endif // ifdef ESP32
|
||||
}
|
||||
return flashChipId;
|
||||
}
|
||||
|
||||
const String getMacAddress() {
|
||||
uint8_t mac[6];
|
||||
char buf[13] = {0};
|
||||
|
||||
78
src/Main.cpp
78
src/Main.cpp
@@ -10,8 +10,6 @@ String volStrForSave = "";
|
||||
unsigned long currentMillis;
|
||||
unsigned long prevMillis;
|
||||
|
||||
|
||||
|
||||
void elementsLoop() {
|
||||
// передаем управление каждому элементу конфигурации для выполнения своих функций
|
||||
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||
@@ -29,69 +27,62 @@ void elementsLoop() {
|
||||
handleEvent();
|
||||
}
|
||||
|
||||
#define SETUPBASE_ERRORMARKER 0
|
||||
#define SETUPCONF_ERRORMARKER 1
|
||||
#define SETUPSCEN_ERRORMARKER 2
|
||||
#define SETUPINET_ERRORMARKER 3
|
||||
#define SETUPLAST_ERRORMARKER 4
|
||||
#define TICKER_ERRORMARKER 5
|
||||
#define HTTP_ERRORMARKER 6
|
||||
#define SOCKETS_ERRORMARKER 7
|
||||
#define MQTT_ERRORMARKER 8
|
||||
#define MODULES_ERRORMARKER 9
|
||||
|
||||
|
||||
|
||||
|
||||
#define SETUPBASE_ERRORMARKER 0
|
||||
#define SETUPCONF_ERRORMARKER 1
|
||||
#define SETUPSCEN_ERRORMARKER 2
|
||||
#define SETUPINET_ERRORMARKER 3
|
||||
#define SETUPLAST_ERRORMARKER 4
|
||||
#define TICKER_ERRORMARKER 5
|
||||
#define HTTP_ERRORMARKER 6
|
||||
#define SOCKETS_ERRORMARKER 7
|
||||
#define MQTT_ERRORMARKER 8
|
||||
#define MODULES_ERRORMARKER 9
|
||||
|
||||
#define COUNTER_ERRORMARKER 4 // количество шагов счетчика
|
||||
#define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс
|
||||
#define COUNTER_ERRORMARKER 4 // количество шагов счетчика
|
||||
#define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс
|
||||
|
||||
#ifdef esp32_4mb
|
||||
|
||||
static int IRAM_ATTR initErrorMarkerId = 0; // ИД маркера
|
||||
static int IRAM_ATTR initErrorMarkerId = 0; // ИД маркера
|
||||
static int IRAM_ATTR errorMarkerId = 0;
|
||||
static int IRAM_ATTR errorMarkerCounter = 0;
|
||||
|
||||
hw_timer_t *My_timer = NULL;
|
||||
void IRAM_ATTR onTimer(){
|
||||
void IRAM_ATTR onTimer() {
|
||||
if (errorMarkerCounter >= 0) {
|
||||
if (errorMarkerCounter >= COUNTER_ERRORMARKER) {
|
||||
errorMarkerId = initErrorMarkerId;
|
||||
errorMarkerCounter = -1;
|
||||
} else
|
||||
} else
|
||||
errorMarkerCounter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void initErrorMarker(int id) {
|
||||
#ifdef esp32_4mb
|
||||
#ifdef esp32_4mb
|
||||
initErrorMarkerId = id;
|
||||
errorMarkerCounter = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void stopErrorMarker(int id) {
|
||||
#ifdef esp32_4mb
|
||||
#ifdef esp32_4mb
|
||||
errorMarkerCounter = -1;
|
||||
if (errorMarkerId)
|
||||
SerialPrint("I", "WARNING!", "A lazy (freezing loop more than " + (String)(COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000) + " ms) section has been found! With ID=" + (String)errorMarkerId);
|
||||
if (errorMarkerId)
|
||||
SerialPrint("I", "WARNING!", "A lazy (freezing loop more than " + (String)(COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000) + " ms) section has been found! With ID=" + (String)errorMarkerId);
|
||||
errorMarkerId = 0;
|
||||
initErrorMarkerId = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
|
||||
#ifdef esp32_4mb
|
||||
#ifdef esp32_4mb
|
||||
My_timer = timerBegin(0, 80, true);
|
||||
timerAttachInterrupt(My_timer, &onTimer, true);
|
||||
timerAlarmWrite(My_timer, STEPPER_ERRORMARKER, true);
|
||||
timerAlarmEnable(My_timer);
|
||||
//timerAlarmDisable(My_timer);
|
||||
// timerAlarmDisable(My_timer);
|
||||
|
||||
initErrorMarker(SETUPBASE_ERRORMARKER);
|
||||
#endif
|
||||
@@ -141,23 +132,19 @@ void setup() {
|
||||
|
||||
// настраиваем микроконтроллер
|
||||
configure("/config.json");
|
||||
|
||||
|
||||
stopErrorMarker(SETUPCONF_ERRORMARKER);
|
||||
|
||||
|
||||
|
||||
initErrorMarker(SETUPSCEN_ERRORMARKER);
|
||||
|
||||
|
||||
// подготавливаем сценарии
|
||||
iotScen.loadScenario("/scenario.txt");
|
||||
// создаем событие завершения инициализации основных моментов для возможности выполнения блока кода при загрузке
|
||||
createItemFromNet("onInit", "1", 1);
|
||||
elementsLoop();
|
||||
|
||||
stopErrorMarker(SETUPSCEN_ERRORMARKER);
|
||||
|
||||
|
||||
|
||||
stopErrorMarker(SETUPSCEN_ERRORMARKER);
|
||||
|
||||
initErrorMarker(SETUPINET_ERRORMARKER);
|
||||
|
||||
// подключаемся к роутеру
|
||||
@@ -181,8 +168,6 @@ void setup() {
|
||||
|
||||
stopErrorMarker(SETUPINET_ERRORMARKER);
|
||||
|
||||
|
||||
|
||||
initErrorMarker(SETUPLAST_ERRORMARKER);
|
||||
|
||||
// NTP
|
||||
@@ -191,11 +176,10 @@ void setup() {
|
||||
// инициализация задач переодического выполнения
|
||||
periodicTasksInit();
|
||||
|
||||
// синхронизация списка устройств
|
||||
addThisDeviceToList();
|
||||
|
||||
// запуск работы udp
|
||||
asyncUdpInit();
|
||||
addThisDeviceToList();
|
||||
udpListningInit();
|
||||
udpBroadcastInit();
|
||||
|
||||
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
||||
createItemFromNet("onStart", "1", 1);
|
||||
@@ -227,8 +211,6 @@ void setup() {
|
||||
stopErrorMarker(SETUPLAST_ERRORMARKER);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void loop() {
|
||||
#ifdef LOOP_DEBUG
|
||||
unsigned long st = millis();
|
||||
@@ -253,7 +235,7 @@ void loop() {
|
||||
initErrorMarker(MQTT_ERRORMARKER);
|
||||
mqttLoop();
|
||||
stopErrorMarker(MQTT_ERRORMARKER);
|
||||
|
||||
|
||||
initErrorMarker(MODULES_ERRORMARKER);
|
||||
elementsLoop();
|
||||
stopErrorMarker(MODULES_ERRORMARKER);
|
||||
|
||||
@@ -6,7 +6,7 @@ void mqttInit() {
|
||||
WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL,
|
||||
[&](void*) {
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
SerialPrint("i", F("WIFI"), "OK: " + jsonReadStr(settingsFlashJson, F("ip")));
|
||||
SerialPrint("i", F("WIFI"), "http://" + jsonReadStr(settingsFlashJson, F("ip")));
|
||||
wifiUptimeCalc();
|
||||
if (mqtt.connected()) {
|
||||
SerialPrint("i", F("MQTT"), "OK");
|
||||
@@ -133,10 +133,10 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
||||
if (payloadStr.startsWith("HELLO")) {
|
||||
SerialPrint("i", F("MQTT"), F("Full update"));
|
||||
|
||||
//публикация всех виджетов
|
||||
// публикация всех виджетов
|
||||
publishWidgets();
|
||||
|
||||
//публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях
|
||||
// публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях
|
||||
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||
if ((*it)->iAmLocal) {
|
||||
publishStatusMqtt((*it)->getID(), (*it)->getValue());
|
||||
@@ -144,7 +144,7 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
//отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками
|
||||
// отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками
|
||||
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||
if ((*it)->getSubtype() == "Loging" || "LogingDaily") {
|
||||
(*it)->setPublishDestination(TO_MQTT);
|
||||
@@ -162,16 +162,17 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) {
|
||||
|
||||
else if (topicStr.indexOf(F("control")) != -1) {
|
||||
String key = selectFromMarkerToMarker(topicStr, "/", 3);
|
||||
|
||||
String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть
|
||||
|
||||
String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть
|
||||
if (!jsonRead(payloadStr, F("status"), valueIfJson, false))
|
||||
generateOrder(key, payloadStr);
|
||||
else generateOrder(key, valueIfJson);
|
||||
else
|
||||
generateOrder(key, valueIfJson);
|
||||
|
||||
SerialPrint("i", F("=>MQTT"), "Msg from iotmanager app: " + key + " " + payloadStr);
|
||||
}
|
||||
|
||||
//здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства
|
||||
// здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства
|
||||
else if (topicStr.indexOf("event") != -1) {
|
||||
if (!jsonReadBool(settingsFlashJson, "mqttin")) {
|
||||
return;
|
||||
@@ -251,7 +252,7 @@ void publishWidgets() {
|
||||
DeserializationError error = deserializeJson(doc, file);
|
||||
if (error) {
|
||||
SerialPrint("E", F("MQTT"), error.f_str());
|
||||
jsonWriteInt(errorsHeapJson, F("jse3"), 1); //Ошибка чтения json файла с виджетами при отправки в mqtt
|
||||
jsonWriteInt(errorsHeapJson, F("jse3"), 1); // Ошибка чтения json файла с виджетами при отправки в mqtt
|
||||
}
|
||||
JsonArray arr = doc.as<JsonArray>();
|
||||
for (JsonVariant value : arr) {
|
||||
@@ -292,43 +293,43 @@ void handleMqttStatus(bool send, int state) {
|
||||
|
||||
const String getStateStr(int e) {
|
||||
switch (e) {
|
||||
case -4: //Нет ответа от сервера
|
||||
case -4: // Нет ответа от сервера
|
||||
return F("e1");
|
||||
break;
|
||||
case -3: //Соединение было разорвано
|
||||
case -3: // Соединение было разорвано
|
||||
return F("e2");
|
||||
break;
|
||||
case -2: //Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT
|
||||
case -2: // Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT
|
||||
return F("e3");
|
||||
break;
|
||||
case -1: //Клиент был отключен
|
||||
case -1: // Клиент был отключен
|
||||
return F("e4");
|
||||
break;
|
||||
case 0: //подключено
|
||||
case 0: // подключено
|
||||
return F("e5");
|
||||
break;
|
||||
case 1: //Ошибка версии
|
||||
case 1: // Ошибка версии
|
||||
return F("e6");
|
||||
break;
|
||||
case 2: //Отклонен идентификатор
|
||||
case 2: // Отклонен идентификатор
|
||||
return F("e7");
|
||||
break;
|
||||
case 3: //Не могу установить соединение
|
||||
case 3: // Не могу установить соединение
|
||||
return F("e8");
|
||||
break;
|
||||
case 4: //Неправильное имя пользователя/пароль
|
||||
case 4: // Неправильное имя пользователя/пароль
|
||||
return F("e9");
|
||||
break;
|
||||
case 5: //Не авторизован для подключения
|
||||
case 5: // Не авторизован для подключения
|
||||
return F("e10");
|
||||
break;
|
||||
case 6: //Название сервера пустое
|
||||
case 6: // Название сервера пустое
|
||||
return F("e11");
|
||||
break;
|
||||
case 7: //Имя пользователя или пароль пустые
|
||||
case 7: // Имя пользователя или пароль пустые
|
||||
return F("e12");
|
||||
break;
|
||||
case 8: //Подключение в процессе
|
||||
case 8: // Подключение в процессе
|
||||
return F("e13");
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -135,11 +135,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
|
||||
// RouterFind(jsonReadStr(settingsFlashJson, F("routerssid")));
|
||||
}
|
||||
|
||||
// обработка кнопки сохранить настройки wifi
|
||||
// обработка кнопки сохранить settings.json
|
||||
if (headerStr == "/sgnittes|") {
|
||||
writeUint8tToString(payload, length, headerLenth, settingsFlashJson);
|
||||
writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256);
|
||||
sendStringToWs("errors", errorsHeapJson, num);
|
||||
// если не было создано приема данных по udp - то создадим его
|
||||
addThisDeviceToList();
|
||||
}
|
||||
|
||||
@@ -164,7 +165,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
|
||||
|
||||
// отвечаем данными на запрос страницы
|
||||
if (headerStr == "/list|") {
|
||||
sendStringToWs("devlis", devListHeapJson, num);
|
||||
sendStringToWs("settin", settingsFlashJson, num);
|
||||
// отправим список устройств в зависимости от того что выбрал user
|
||||
sendDeviceList(num);
|
||||
}
|
||||
|
||||
// сохраняем данные листа
|
||||
if (headerStr == "/tsil|") {
|
||||
writeFileUint8tByFrames("devlist.json", payload, length, headerLenth, 256);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------//
|
||||
@@ -307,7 +315,10 @@ void publishJsonWs(const String& topic, String& json) {
|
||||
void periodicWsSend() {
|
||||
sendStringToWs("ssidli", ssidListHeapJson, -1);
|
||||
sendStringToWs("errors", errorsHeapJson, -1);
|
||||
sendStringToWs("devlis", devListHeapJson, -1);
|
||||
// отправляем переодичестки только в авто режиме
|
||||
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||
sendStringToWs("devlis", devListHeapJson, -1);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ESP32
|
||||
@@ -413,3 +424,15 @@ void sendStringToWs(const String& header, String& payload, int client_id) {
|
||||
standWebSocket.sendBIN(client_id, (uint8_t*)dataArray, totalSize);
|
||||
}
|
||||
}
|
||||
|
||||
void sendDeviceList(uint8_t num) {
|
||||
if (jsonReadInt(settingsFlashJson, F("udps")) != 0) {
|
||||
// если включен автопоиск то отдаем список из оперативной памяти
|
||||
SerialPrint("i", "FS", "heap list");
|
||||
sendStringToWs("devlis", devListHeapJson, num);
|
||||
} else {
|
||||
// если выключен автопоиск то отдаем список из флешь памяти
|
||||
sendFileToWsByFrames("/devlist.json", "devlis", "", num, WEB_SOCKETS_FRAME_SIZE);
|
||||
SerialPrint("i", "FS", "flash list");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ void* getAPI_Timer(String subtype, String params);
|
||||
void* getAPI_Variable(String subtype, String params);
|
||||
void* getAPI_VariableColor(String subtype, String params);
|
||||
void* getAPI_VButton(String subtype, String params);
|
||||
void* getAPI_A02Distance(String subtype, String params);
|
||||
void* getAPI_Acs712(String subtype, String params);
|
||||
void* getAPI_AhtXX(String subtype, String params);
|
||||
void* getAPI_AnalogAdc(String subtype, String params);
|
||||
@@ -32,7 +31,7 @@ void* getAPI_Mcp23017(String subtype, String params);
|
||||
void* getAPI_Mp3(String subtype, String params);
|
||||
void* getAPI_Multitouch(String subtype, String params);
|
||||
void* getAPI_Pcf8574(String subtype, String params);
|
||||
void* getAPI_Pwm8266(String subtype, String params);
|
||||
void* getAPI_Pwm32(String subtype, String params);
|
||||
void* getAPI_TelegramLT(String subtype, String params);
|
||||
void* getAPI_Lcd2004(String subtype, String params);
|
||||
|
||||
@@ -45,7 +44,6 @@ if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_VariableColor(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_A02Distance(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Acs712(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_AhtXX(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI;
|
||||
@@ -70,7 +68,7 @@ if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Multitouch(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Pwm32(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI;
|
||||
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;
|
||||
return nullptr;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "Global.h"
|
||||
#include "utils/StringUtils.h"
|
||||
|
||||
static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d";
|
||||
static const char* TIME_FORMAT PROGMEM = "%02d:%02d"; //:%02d";
|
||||
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";
|
||||
|
||||
const String prettySeconds(unsigned long time_s) {
|
||||
|
||||
Reference in New Issue
Block a user