From fbe608d6c000ad4bceb3ab4e0fd3abdfdd57b160 Mon Sep 17 00:00:00 2001 From: agessaman Date: Tue, 21 Jul 2026 11:03:04 -0700 Subject: [PATCH] feat(mqtt): add SNMP support for radio diagnostics and stats Implement SNMP functionality in MyMesh to provide radio diagnostics and statistics updates. This includes a new method for formatting radio diagnostic replies and periodic updates to the SNMP agent with radio stats, enhancing monitoring capabilities for users with SNMP enabled. --- examples/simple_room_server/MyMesh.cpp | 23 +++++++++++++++++++++++ examples/simple_room_server/MyMesh.h | 15 +++++++++++++++ variants/heltec_v3/platformio.ini | 6 ++++++ variants/heltec_v4/platformio.ini | 6 ++++++ variants/rak3112/platformio.ini | 3 +++ variants/station_g2/platformio.ini | 3 +++ 6 files changed, 56 insertions(+) diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index ada2e2e1..b4bff9b7 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -1176,6 +1176,10 @@ void MyMesh::formatRadioStatsReply(char *reply) { StatsFormatHelper::formatRadioStats(reply, _radio, radio_driver, getTotalAirTime(), getReceiveAirTime()); } +void MyMesh::formatRadioDiagReply(char *reply) { + StatsFormatHelper::formatRadioDiag(reply, _radio, radio_driver, *_ms, _err_flags, hasOutbound()); +} + void MyMesh::formatPacketStatsReply(char *reply) { StatsFormatHelper::formatPacketStats(reply, radio_driver, getNumSentFlood(), getNumSentDirect(), getNumRecvFlood(), getNumRecvDirect()); @@ -1587,6 +1591,25 @@ void MyMesh::loop() { } } #endif + +#ifdef WITH_SNMP + // Push radio stats to SNMP agent every 2 seconds + if (_snmp_agent.isRunning()) { + static unsigned long last_snmp_stats = 0; + if (now - last_snmp_stats >= 2000) { + last_snmp_stats = now; + _snmp_agent.updateRadioStats( + radio_driver.getPacketsRecv(), radio_driver.getPacketsSent(), + radio_driver.getPacketsRecvErrors(), + (int16_t)_radio->getNoiseFloor(), + (int16_t)radio_driver.getLastRSSI(), + (int16_t)(radio_driver.getLastSNR() * 4), + getNumSentFlood(), getNumSentDirect(), + getNumRecvFlood(), getNumRecvDirect(), + getTotalAirTime() / 1000, uptime_millis / 1000); + } + } +#endif } #if defined(WITH_MQTT_NEIGHBORS) diff --git a/examples/simple_room_server/MyMesh.h b/examples/simple_room_server/MyMesh.h index b80b3d02..8fab0624 100644 --- a/examples/simple_room_server/MyMesh.h +++ b/examples/simple_room_server/MyMesh.h @@ -31,6 +31,10 @@ #include "helpers/esp32/WebConfigServer.h" // defines WITH_WEBCONFIG on ESP32 #endif +#ifdef WITH_SNMP +#include "helpers/SNMPAgent.h" +#endif + /* ------------------------------ Config -------------------------------- */ #ifndef FIRMWARE_BUILD_DATE @@ -176,6 +180,9 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks #ifdef WITH_MQTT_BRIDGE MQTTBridge* bridge; #endif +#ifdef WITH_SNMP + MeshSNMPAgent _snmp_agent; +#endif #ifdef WITH_MQTT_BRIDGE AlertReporter _alerter; #endif @@ -290,6 +297,7 @@ public: void removeNeighbor(const uint8_t* pubkey, int key_len) override; void formatStatsReply(char *reply) override; void formatRadioStatsReply(char *reply) override; + void formatRadioDiagReply(char *reply) override; void formatPacketStatsReply(char *reply) override; void startRegionsLoad() override; bool saveRegions() override; @@ -324,6 +332,13 @@ public: bridge->setBuildDate(getBuildDate()); #ifdef WITH_MQTT_BRIDGE bridge->setStatsSources(this, _radio, _cli.getBoard(), _ms); +#ifdef WITH_SNMP + if (_cli.getObserverPrefs()->snmp_enabled) { + _snmp_agent.setNodeName(_prefs.node_name); + _snmp_agent.setFirmwareVersion(getFirmwareVer()); + bridge->setSNMPAgent(&_snmp_agent); + } +#endif #endif bridge->begin(); #ifdef WITH_MQTT_BRIDGE diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index 49385eae..c0bc220a 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -212,11 +212,13 @@ build_flags = -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -D ESP32_CPU_FREQ=160 -D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm + -D WITH_SNMP=1 build_src_filter = ${Heltec_lora32_v3.build_src_filter} + + + + + + +<../examples/simple_room_server> lib_deps = ${Heltec_lora32_v3.lib_deps} @@ -226,6 +228,7 @@ lib_deps = arduino-libraries/NTPClient JChristensen/Timezone paulstoffregen/Time@1.6.1 + 0neblock/SNMP_Agent [env:Heltec_v3_terminal_chat] extends = Heltec_lora32_v3 @@ -551,10 +554,12 @@ build_flags = -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -D ESP32_CPU_FREQ=160 -D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm + -D WITH_SNMP=1 build_src_filter = ${Heltec_lora32_v3.build_src_filter} + + + + + +<../examples/simple_room_server> lib_deps = ${Heltec_lora32_v3.lib_deps} @@ -564,6 +569,7 @@ lib_deps = arduino-libraries/NTPClient JChristensen/Timezone paulstoffregen/Time@1.6.1 + 0neblock/SNMP_Agent [env:Heltec_v3_kiss_modem] extends = Heltec_lora32_v3 diff --git a/variants/heltec_v4/platformio.ini b/variants/heltec_v4/platformio.ini index c3b02b53..ccdcda66 100644 --- a/variants/heltec_v4/platformio.ini +++ b/variants/heltec_v4/platformio.ini @@ -324,11 +324,13 @@ build_flags = -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -D ESP32_CPU_FREQ=160 -D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm + -D WITH_SNMP=1 build_src_filter = ${heltec_v4_oled.build_src_filter} + + + + + + +<../examples/simple_room_server> lib_deps = ${heltec_v4_oled.lib_deps} @@ -338,6 +340,7 @@ lib_deps = arduino-libraries/NTPClient JChristensen/Timezone paulstoffregen/Time@1.6.1 + 0neblock/SNMP_Agent [env:heltec_v4_expansionkit_room_server_observer_mqtt] extends = heltec_v4_oled @@ -366,11 +369,13 @@ build_flags = -D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm -D ENV_PIN_SDA=4 -D ENV_PIN_SCL=3 + -D WITH_SNMP=1 build_src_filter = ${heltec_v4_oled.build_src_filter} + + + + + + +<../examples/simple_room_server> lib_deps = ${heltec_v4_oled.lib_deps} @@ -380,6 +385,7 @@ lib_deps = arduino-libraries/NTPClient JChristensen/Timezone paulstoffregen/Time@1.6.1 + 0neblock/SNMP_Agent [env:heltec_v4_room_server] extends = heltec_v4_oled diff --git a/variants/rak3112/platformio.ini b/variants/rak3112/platformio.ini index 6869a297..6f6df909 100644 --- a/variants/rak3112/platformio.ini +++ b/variants/rak3112/platformio.ini @@ -185,10 +185,12 @@ build_flags = -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -D ESP32_CPU_FREQ=160 -D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm + -D WITH_SNMP=1 build_src_filter = ${rak3112.build_src_filter} + + + + + +<../examples/simple_room_server> lib_deps = ${rak3112.lib_deps} @@ -198,6 +200,7 @@ lib_deps = arduino-libraries/NTPClient JChristensen/Timezone paulstoffregen/Time@1.6.1 + 0neblock/SNMP_Agent [env:RAK_3112_terminal_chat] extends = rak3112 diff --git a/variants/station_g2/platformio.ini b/variants/station_g2/platformio.ini index f149f1c4..28b60543 100644 --- a/variants/station_g2/platformio.ini +++ b/variants/station_g2/platformio.ini @@ -195,11 +195,13 @@ build_flags = ; -D MESH_DEBUG=1 -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -D ESP32_CPU_FREQ=160 + -D WITH_SNMP=1 build_src_filter = ${Station_G2.build_src_filter} + + + + + + +<../examples/simple_room_server> lib_deps = ${Station_G2.lib_deps} @@ -209,6 +211,7 @@ lib_deps = arduino-libraries/NTPClient JChristensen/Timezone paulstoffregen/Time@1.6.1 + 0neblock/SNMP_Agent [env:Station_G2_room_server] extends = Station_G2