From caa2102eff6db8d00fb2fc1ff69f33de690c0bfd Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <67171972+IoTManagerProject@users.noreply.github.com> Date: Sun, 13 Feb 2022 16:13:51 +0100 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20=D0=BF=D0=BE?= =?UTF-8?q?=20udp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Const.h | 4 +- include/DeviceList.h | 9 ++- include/utils/JsonUtils.h | 2 +- platformio.ini | 1 + src/DeviceList.cpp | 120 ++++++++++++++++++++++++++++++++++++-- src/Main.cpp | 9 ++- src/MqttClient.cpp | 6 +- src/WsServer.cpp | 4 +- src/utils/JsonUtils.cpp | 6 +- src/utils/WiFiUtils.cpp | 30 ---------- 10 files changed, 143 insertions(+), 48 deletions(-) diff --git a/include/Const.h b/include/Const.h index 59033a65..8a243a00 100644 --- a/include/Const.h +++ b/include/Const.h @@ -12,6 +12,8 @@ #define STANDARD_WEB_SERVER #define STANDARD_WEB_SOCKETS +#define UDP_ENABLED + //#define REST_FILE_OPERATIONS #define MQTT_RECONNECT_INTERVAL 20000 @@ -31,7 +33,7 @@ enum TimerTask_t { WIFI_SCAN, TIME, TIME_SYNC, UPTIME, - SYGNAL, + UDP, TIMES, PTASK }; diff --git a/include/DeviceList.h b/include/DeviceList.h index 72843876..b51c4c9d 100644 --- a/include/DeviceList.h +++ b/include/DeviceList.h @@ -1,4 +1,11 @@ #pragma once #include "Global.h" +#include "ESPAsyncUDP.h" +extern AsyncUDP asyncUdp; -extern void addThisDeviceToList(); \ No newline at end of file +extern void addThisDeviceToList(); +extern void asyncUdpInit(); +extern String uint8tToString(uint8_t* data, size_t len); +extern bool udpPacketValidation(String& data); +extern void udpPacketParse(String& data); +extern void jsonMergeArrays(String& arr1, String& arr2); \ No newline at end of file diff --git a/include/utils/JsonUtils.h b/include/utils/JsonUtils.h index b6a44ecb..a685da46 100644 --- a/include/utils/JsonUtils.h +++ b/include/utils/JsonUtils.h @@ -25,6 +25,6 @@ extern bool jsonWriteBool_(String& json, String name, bool value); extern bool jsonWriteInt_(String& json, String name, int value); extern bool jsonWriteFloat_(String& json, String name, float value); void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t headerLenth, String& json); -extern bool jsonMerge(String& json1, String& json2); +extern bool jsonMergeObjects(String& json1, String& json2); extern void jsonMergeDocs(JsonObject dest, JsonObjectConst src); extern void jsonErrorDetected(); diff --git a/platformio.ini b/platformio.ini index 50924368..d11174e8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -16,6 +16,7 @@ data_dir = data_svelte lib_deps_external = bblanchon/ArduinoJson @6.18.0 me-no-dev/ESP Async WebServer + me-no-dev/ESPAsyncUDP Links2004/WebSockets knolleary/PubSubClient diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 08824073..e00bc02e 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -1,10 +1,10 @@ #include "DeviceList.h" void addThisDeviceToList() { - jsonWriteStr_(devListHeapJson, "devicelist", ""); //метка для парсинга - jsonWriteStr_(devListHeapJson, "ip", jsonReadStr(settingsFlashJson, "ip")); - jsonWriteStr_(devListHeapJson, "id", jsonReadStr(settingsFlashJson, "id")); - jsonWriteStr_(devListHeapJson, "name", jsonReadStr(settingsFlashJson, "name")); + jsonWriteStr_(devListHeapJson, F("devicelist"), ""); //метка для парсинга + jsonWriteStr_(devListHeapJson, F("ip"), jsonReadStr(settingsFlashJson, F("ip"))); + jsonWriteStr_(devListHeapJson, F("id"), jsonReadStr(settingsFlashJson, F("id"))); + jsonWriteStr_(devListHeapJson, F("name"), jsonReadStr(settingsFlashJson, F("name"))); // для проверки // devListHeapJson = devListHeapJson + ","; @@ -16,4 +16,114 @@ void addThisDeviceToList() { devListHeapJson = "[" + devListHeapJson + "]"; Serial.println(devListHeapJson); -} \ No newline at end of file +} + +#ifdef UDP_ENABLED +AsyncUDP asyncUdp; + +void asyncUdpInit() { + 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 = uint8tToString(packet.data(), packet.length()); + SerialPrint("i", F("UDP"), "Udp packet received, IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort())); + Serial.println(data); + + if (udpPacketValidation(data)) { + SerialPrint("i", F("UDP"), F("Device presentation received")); + jsonMergeArrays(devListHeapJson, data); + Serial.println(devListHeapJson); + } 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()); + }); + } + + //будем отправлять каждые 10 секунд презентацию данного устройства + ts.add( + UDP, 10000, [&](void*) { + SerialPrint("i", F("UDP"), F("Broadcast device presentation")); + asyncUdp.broadcastTo(devListHeapJson.c_str(), 4210); + // asyncUdp.broadcast("test"); + // asyncUdp.print("Hello Server!"); + }, + nullptr, true); + + SerialPrint("I", F("UDP"), F("Udp Init")); +} + +bool udpPacketValidation(String& data) { + if (data.indexOf("devicelist") != -1) { + return true; + } else { + return false; + } +} + +void jsonMergeArrays(String& arr1, String& arr2) { + DynamicJsonDocument doc(1024); + DeserializationError error = deserializeJson(doc, arr1); + if (error) { + SerialPrint("E", F("UDP"), error.f_str()); + } + JsonArray jarr = doc.as(); + arr2.replace("[", ""); + arr2.replace("]", ""); + String incIP = jsonReadStr(arr2, "ip"); + + Serial.println("incIP " + incIP); + bool ipExistInList = false; + for (JsonVariant value : jarr) { + String locIP = value["ip"].as(); + Serial.println("locIP " + locIP); + if (locIP == incIP) { + ipExistInList = true; + break; + } else { + ipExistInList = false; + } + } + if (!ipExistInList) { + arr1.replace("]", ""); + arr1 = arr1 + "," + arr2 + "]"; + } +} + +// void udpPacketParse(String& data) { +// if (data.indexOf("scen:") != -1) { +// data = deleteBeforeDelimiter(data, ":"); +// writeFile(String(DEVICE_SCENARIO_FILE), data); +// loadScenario(); +// } else if (data.indexOf("event:") != -1) { +// data = deleteBeforeDelimiter(data, ":"); +// eventBuf += data; +// } +// } + +String uint8tToString(uint8_t* data, size_t len) { + String ret; + while (len--) { + ret += (char)*data++; + } + return ret; +} +#endif \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index 2b54536f..2cb7b805 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -46,13 +46,18 @@ void setup() { //инициализация mqtt mqttInit(); + //настраиваем микроконтроллер configure("/config.json"); - syncSettingsFlashJson(); - //инициализация задач переодического выполнения periodicTasksInit(); + //окончательнаясинхронизация настроек + syncSettingsFlashJson(); + + //запуск работы udp + asyncUdpInit(); + // test Serial.println("-------test start--------"); Serial.println("--------test end---------"); diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index a85d84e5..761ae104 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -255,7 +255,7 @@ void publishWidgets() { return; } size_t size = file.size(); - DynamicJsonDocument doc(size * 1.5); + DynamicJsonDocument doc(size * 2); DeserializationError error = deserializeJson(doc, file); if (error) { SerialPrint("E", F("MQTT"), error.f_str()); @@ -270,8 +270,8 @@ void publishWidgets() { void publishState() { String json = "{}"; - jsonMerge(json, paramsHeapJson); - jsonMerge(json, paramsFlashJson); + jsonMergeObjects(json, paramsHeapJson); + jsonMergeObjects(json, paramsFlashJson); json.replace("{", ""); json.replace("}", ""); json.replace("\"", ""); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 7d9baf9c..4a408d94 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -52,8 +52,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) if (headerStr == "/|") { sendFileToWs("/layout.json", num, 1024); String json = "{}"; - jsonMerge(json, paramsHeapJson); - jsonMerge(json, paramsFlashJson); + jsonMergeObjects(json, paramsHeapJson); + jsonMergeObjects(json, paramsFlashJson); standWebSocket.sendTXT(num, json); } //**сохранение**// diff --git a/src/utils/JsonUtils.cpp b/src/utils/JsonUtils.cpp index 72ca9734..36f32d48 100644 --- a/src/utils/JsonUtils.cpp +++ b/src/utils/JsonUtils.cpp @@ -163,10 +163,10 @@ void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t header for (size_t i = headerLenth; i < length; i++) { payloadStr += (char)payload[i]; } - jsonMerge(json, payloadStr); + jsonMergeObjects(json, payloadStr); } -bool jsonMerge(String& json1, String& json2) { +bool jsonMergeObjects(String& json1, String& json2) { bool ret = true; DynamicJsonDocument doc1(JSON_BUFFER_SIZE); DeserializationError error1 = deserializeJson(doc1, json1); @@ -174,7 +174,7 @@ bool jsonMerge(String& json1, String& json2) { DeserializationError error2 = deserializeJson(doc2, json2); jsonMergeDocs(doc1.as(), doc2.as()); if (error1 || error2) { - SerialPrint("EE", F("json"), "jsonMerge error"); + SerialPrint("EE", F("json"), "jsonMergeObjects error"); jsonErrorDetected(); ret = false; } diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 3b4374e2..62d03221 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -138,33 +138,3 @@ uint8_t RSSIquality() { } return res; } - -// void wifiSignalInit() { -// ts.add( -// SYGNAL, 1000 * 60, [&](void*) { -// switch (RSSIquality()) { -// case 0: -// jsonWriteStr(settingsFlashJson, F("signal"), F("не подключено к роутеру")); -// break; -// case 1: -// jsonWriteStr(settingsFlashJson, F("signal"), F("нет сигнала")); -// break; -// case 2: -// jsonWriteStr(settingsFlashJson, F("signal"), F("очень низкий")); -// break; -// case 3: -// jsonWriteStr(settingsFlashJson, F("signal"), F("низкий")); -// break; -// case 4: -// jsonWriteStr(settingsFlashJson, F("signal"), F("хороший")); -// break; -// case 5: -// jsonWriteStr(settingsFlashJson, F("signal"), F("очень хороший")); -// break; -// case 6: -// jsonWriteStr(settingsFlashJson, F("signal"), F("отличный")); -// break; -// } -// }, -// nullptr, true); -// }