diff --git a/include/RemoteOrdersUdp.h b/include/RemoteOrdersUdp.h new file mode 100644 index 00000000..a8c2d8e0 --- /dev/null +++ b/include/RemoteOrdersUdp.h @@ -0,0 +1,7 @@ +#pragma once +#include "ESPAsyncUDP.h" +extern AsyncUDP asyncUdp; +extern void asyncUdpInit(); +extern String uint8tToString(uint8_t* data, size_t len); +extern bool udpPacketValidation(String& data); +extern void udpPacketParse(String& data); \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index c190c5f2..c8a85a0f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,6 +20,7 @@ lib_deps_external = Adafruit BMP280 Library Adafruit BME280 Library DallasTemperature + ESP Async UDP lib_deps_internal = ESP Async WebServer GyverFilters diff --git a/src/RemoteOrdersUdp.cpp b/src/RemoteOrdersUdp.cpp new file mode 100644 index 00000000..add4a8c3 --- /dev/null +++ b/src/RemoteOrdersUdp.cpp @@ -0,0 +1,71 @@ +#include "RemoteOrdersUdp.h" + +#include + +#include "Global.h" + +AsyncUDP asyncUdp; + +void asyncUdpInit() { + //if (asyncUdp.listen(1234)) { + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 1234)) { + asyncUdp.onPacket([](AsyncUDPPacket packet) { + + //Serial.print("UDP Packet Type: "); + //Serial.print(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); + // + //Serial.print(", From: "); + //Serial.print(packet.remoteIP()); + //Serial.print(":"); + //Serial.print(packet.remotePort()); + // + //Serial.print(", To: "); + //Serial.print(packet.localIP()); + //Serial.print(":"); + //Serial.print(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()); + Serial.print("[i] [udp] Packet received: '"); + Serial.print(data); + if (udpPacketValidation(data)) { + udpPacketParse(data); + Serial.println("', Packet valid"); + } else { + Serial.println("', Packet invalid"); + } + + //reply to the client + + packet.printf("Got %u bytes of data", packet.length()); + }); + } +} + +String uint8tToString(uint8_t* data, size_t len) { + String ret; + while (len--) { + ret += (char)*data++; + } + return ret; +} + +bool udpPacketValidation(String& data) { + if (data.indexOf("iotm;") != -1 && data.indexOf(getChipId()) != -1) { + return true; + } else { + return false; + } +} + +//iotm;chipid;button-out-1_1 +void udpPacketParse(String& data) { + data = selectFromMarkerToMarker(data, ";", 2); + data.replace("_", " "); + orderBuf += data + ","; +} \ No newline at end of file diff --git a/src/Utils/statUtils.cpp b/src/Utils/statUtils.cpp index 72386d8f..069beda8 100644 --- a/src/Utils/statUtils.cpp +++ b/src/Utils/statUtils.cpp @@ -149,8 +149,8 @@ String getUptimeTotal() { static int hrs; EEPROM.begin(512); hrs = eeGetInt(0); - String hrsStr = prettySeconds(hrs * 60); - //Serial.println(hrsStr); + String hrsStr = prettySeconds(hrs * 60 * 60); + //Serial.println(hrsStr); return hrsStr; } diff --git a/src/main.cpp b/src/main.cpp index ea708675..8da5765a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ #include "Utils/Timings.h" #include "Utils\WebUtils.h" #include "items/ButtonInClass.h" +#include "RemoteOrdersUdp.h" void not_async_actions(); @@ -68,8 +69,12 @@ void setup() { pm.info("WebAdmin"); web_init(); + pm.info("InitSt"); initSt(); + pm.info("asyncUdpInit"); + asyncUdpInit(); + #ifdef UDP_ENABLED pm.info("Broadcast UDP"); udpInit();