diff --git a/mpod.cpp b/mpod.cpp index 1190c9c592313c7d3edd9ae3fae4e7a3679bd364..4ceb264867b8642de2ca540992e7a299ca29412f 100644 --- a/mpod.cpp +++ b/mpod.cpp @@ -81,6 +81,9 @@ bool MPOD::message(const SNMP::Message *message) { case OID::OUTPUTSTATUS: { // OUTPUTSTATUS is defined in MIB as BITS but encoded as OCTETSTRING by MPOD OctetStringBER *status = static_cast<OctetStringBER *>(varbind->getValue()); + if (status->getLength() == 0) { + break; + } _on = status->getBit(0); _rampingUp = status->getBit(11); _rampingDown = status->getBit(12); @@ -88,31 +91,50 @@ bool MPOD::message(const SNMP::Message *message) { found++; break; case OID::OUTPUTMEASUREMENTSENSEVOLTAGE: - // Use private helper function to extract float value + if (varbind->getLength() != 25) { + break; + } _measurementSenseVoltage = getFloatFromVarBind(varbind); found++; break; case OID::OUTPUTMEASUREMENTCURRENT: + if (varbind->getLength() != 25) { + break; + } _measurementCurrent = getFloatFromVarBind(varbind); found++; break; case OID::OUTPUTSWITCH: // Use private helper function to extract integer value + Serial.print("Output Switch Length: "); + Serial.println(varbind->getLength()); _on = getIntegerFromVarBind(varbind); found++; break; case OID::OUTPUTVOLTAGE: + if (varbind->getLength() != 25) { + break; + } _voltage = getFloatFromVarBind(varbind); found++; break; case OID::OUTPUTCURRENT: + if (varbind->getLength() != 25) { + break; + } _current = getFloatFromVarBind(varbind); found++; break; case OID::OUTPUTVOLTAGERISERATE: + if (varbind->getLength() != 25) { + break; + } _voltageRiseRate = getFloatFromVarBind(varbind); found++; break; + default: + Serial.println(name); + break; } // Get the channel ID from the last value in the varbind name @@ -120,6 +142,11 @@ bool MPOD::message(const SNMP::Message *message) { // that far. const char *channel = strrchr(varbind->getName(), '.') + 1; _channel = atoi(channel); + + // MPOD SNMP channel 0 does not exist (starts from 1; U0 is 1). + // Mark the channel as 0 if invalid data was received. + // This can be used later to validate a sent request. + _channel = found ? _channel : 0; } // Return true if nodes found, that means this is a valid response from MPOD return found; @@ -200,7 +227,7 @@ void onMessage(const SNMP::Message *message, const IPAddress remote, const uint1 Serial.print(mpod.getVoltageRiseRate()); Serial.println(" V/s"); } else { - Serial.println("Received non-MPOD traffic"); + Serial.println("Received non-MPOD traffic (invalid channel?)."); } } diff --git a/rest.cpp b/rest.cpp index 2f1b0aef913d5460618ed72a54d48bf336c2c6bc..e4bbea1f025e0beae09f5fd353127b3718a6f917 100644 --- a/rest.cpp +++ b/rest.cpp @@ -161,7 +161,7 @@ void sendSNMP() { if (output != NONE && channel != 0) { setChannelStateAndWait(&ipAddr, channel, output); - success = true; // validates input parameters, not MPOD status, reported separately + success = mpod.getChannel() ? true : false; } String http_msg = "{\n"; @@ -285,7 +285,12 @@ void pollMPODChannel() { delay(MPOD_UPDATE_LATENCY); snmp.loop(); // Force loop to update now - ret = mpod.toJSON(); + if (mpod.getChannel()) { + ret = mpod.toJSON(); + } else { + ret = "\"reason\": \"Invalid channel\""; + channel = 0; + } } String http_msg = "{\n";