Skip to content
Snippets Groups Projects

Handle invalid channel replies

Merged Cyril Danilevski requested to merge invalid_channels into main
2 files
+ 36
4
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 29
2
@@ -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?).");
}
}
Loading