From 3325775163c04dcdb1707101adbaae6e04fc778a Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Sat, 29 Jun 2024 02:21:42 +0200 Subject: [PATCH] MessagePack UDP protocol (cherry picked from commit b8f7153916ce634b1182128c3a2e3da3d0c5dae0) --- include/YaSolR.h | 2 +- include/YaSolRWebsite.h | 2 +- src/Website.cpp | 2 +- src/init/Events.cpp | 48 ++++++++++++++++++++++++++++------------- src/main.cpp | 2 +- 5 files changed, 37 insertions(+), 19 deletions(-) diff --git a/include/YaSolR.h b/include/YaSolR.h index 8c194b9..63cbe54 100644 --- a/include/YaSolR.h +++ b/include/YaSolR.h @@ -129,4 +129,4 @@ extern Mycila::Task initMqttSubscribersTask; extern Mycila::Task initRestApiTask; extern Mycila::Task initWebTask; -extern Mycila::CircularBuffer jsyRemoteUdpRate; +extern Mycila::CircularBuffer udpMessageRateBuffer; diff --git a/include/YaSolRWebsite.h b/include/YaSolRWebsite.h index e4ae2f0..6823c79 100644 --- a/include/YaSolRWebsite.h +++ b/include/YaSolRWebsite.h @@ -67,7 +67,7 @@ namespace YaSolR { Statistic _relay1SwitchCount = Statistic(&dashboard, YASOLR_LBL_032); Statistic _relay2SwitchCount = Statistic(&dashboard, YASOLR_LBL_033); - Statistic _jsyRemoteUdpRate = Statistic(&dashboard, YASOLR_LBL_157); + Statistic _udpMessageRateBuffer = Statistic(&dashboard, YASOLR_LBL_157); Statistic _time = Statistic(&dashboard, YASOLR_LBL_034); Statistic _uptime = Statistic(&dashboard, YASOLR_LBL_035); diff --git a/src/Website.cpp b/src/Website.cpp index c14dc30..dbf2c9d 100644 --- a/src/Website.cpp +++ b/src/Website.cpp @@ -551,7 +551,7 @@ void YaSolR::WebsiteClass::updateCards() { _networkWiFiSSID.set(ESPConnect.getWiFiSSID().c_str()); _relay1SwitchCount.set(String(relay1.getSwitchCount()).c_str()); _relay2SwitchCount.set(String(relay2.getSwitchCount()).c_str()); - _jsyRemoteUdpRate.set((String(jsyRemoteUdpRate.rate()) + " msg/s").c_str()); + _udpMessageRateBuffer.set((String(udpMessageRateBuffer.rate()) + " msg/s").c_str()); _time.set(Mycila::Time::getLocalStr().c_str()); _uptime.set(Mycila::Time::toDHHMMSS(Mycila::System.getUptime()).c_str()); #ifdef APP_MODEL_TRIAL diff --git a/src/init/Events.cpp b/src/init/Events.cpp index 024d563..1318581 100644 --- a/src/init/Events.cpp +++ b/src/init/Events.cpp @@ -346,33 +346,51 @@ Mycila::Task initEventsTask("Init Events", [](void* params) { }); udp.onPacket([](AsyncUDPPacket packet) { - // [0] uint8_t == message type - // [1] sizeof(Mycila::JSYData) - // [sizeOfBody] uint32_t == CRC32 - constexpr size_t sizeOfJSYData = sizeof(Mycila::JSYData); - constexpr size_t sizeOfBody = 1 + sizeOfJSYData; - constexpr size_t sizeOfCRC32 = sizeof(uint32_t); - constexpr size_t sizeOfUDP = sizeOfBody + sizeOfCRC32; + // buffer[0] == MYCILA_UDP_MSG_TYPE_JSY_DATA (1) + // buffer[1] == size_t (4) + // buffer[5] == MsgPack (?) + // buffer[5 + size] == CRC32 (4) size_t len = packet.length(); - if (len != sizeOfUDP) + uint8_t* buffer = packet.data(); + + if (len < 5 || buffer[0] != YASOLR_UDP_MSG_TYPE_JSY_DATA) return; - uint8_t* data = packet.data(); - const uint8_t type = data[0]; + uint32_t size; + memcpy(&size, buffer + 1, 4); - if (type != YASOLR_UDP_MSG_TYPE_JSY_DATA) + if (len != size + 9) return; + // crc32 FastCRC32 crc32; - crc32.add(data, sizeOfBody); + crc32.add(buffer, size + 5); uint32_t crc = crc32.calc(); - if (memcmp(&crc, data + sizeOfBody, sizeOfCRC32) != 0) + + if (memcmp(&crc, buffer + size + 5, 4) != 0) return; + JsonDocument doc; + deserializeMsgPack(doc, buffer + 5, size); + Mycila::JSYData jsyData; - memcpy(&jsyData, data + 1, sizeOfJSYData); - jsyRemoteUdpRate.add(millis() / 1000.0f); + jsyData.current1 = doc["c1"].as(); + jsyData.current2 = doc["c2"].as(); + jsyData.energy1 = doc["e1"].as(); + jsyData.energy2 = doc["e2"].as(); + jsyData.energyReturned1 = doc["er1"].as(); + jsyData.energyReturned2 = doc["er2"].as(); + jsyData.frequency = doc["f"].as(); + jsyData.power1 = doc["p1"].as(); + jsyData.power2 = doc["p2"].as(); + jsyData.powerFactor1 = doc["pf1"].as(); + jsyData.powerFactor2 = doc["pf2"].as(); + jsyData.voltage1 = doc["v1"].as(); + jsyData.voltage2 = doc["v2"].as(); + + udpMessageRateBuffer.add(millis() / 1000.0f); + if (grid.updateRemoteJSYData(jsyData)) { routingTask.resume(); } diff --git a/src/main.cpp b/src/main.cpp index d424a12..e1bfe6a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,7 +40,7 @@ Mycila::RouterOutput output2("output2", dimmerO2, bypassRelayO2, ds18O2, grid, p Mycila::RouterRelay routerRelay1(relay1); Mycila::RouterRelay routerRelay2(relay2); -Mycila::CircularBuffer jsyRemoteUdpRate; +Mycila::CircularBuffer udpMessageRateBuffer; AsyncWebServer webServer(80); AsyncUDP udp;