Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion examples/ESP32_SNMP/ESP32_SNMP.ino
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,28 @@ void setup(){
snmp.sortHandlers();
}

void calbackStatusFunction(SendStatus status)
{
switch (status)
{
case ssNone:
Serial.println("Status: None");
break;

case ssOk:
Serial.println("Status: Ok");
break;

case ssError:
Serial.println("Status: Error");
break;

default:
Serial.println("Status: Unknow");
break;
}
}

void loop(){
snmp.loop(); // must be called as often as possible
if(settableNumberOID->setOccurred){
Expand All @@ -130,7 +152,7 @@ void loop(){
// Send the trap to the specified IP address
// If INFORM is set, snmp.loop(); needs to be called in order for the acknowledge mechanism to work.
IPAddress destinationIP = IPAddress(192, 168, 1, 243);
if(snmp.sendTrapTo(settableNumberTrap, destinationIP, true, 2, 5000) != INVALID_SNMP_REQUEST_ID){
if(snmp.sendTrapTo(settableNumberTrap, destinationIP, calbackStatusFunction, true, 2, 5000) != INVALID_SNMP_REQUEST_ID){
Serial.println("Sent SNMP Trap");
} else {
Serial.println("Couldn't send SNMP Trap");
Expand Down
39 changes: 37 additions & 2 deletions src/SNMPInform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ static void remove_inform_from_list(std::list<struct InformItem *> &list,

snmp_request_id_t
queue_and_send_trap(std::list<struct InformItem *> &informList, SNMPTrap *trap, const IPAddress& ip, bool replaceQueuedRequests,
int retries, int delay_ms) {
int retries, int delay_ms, CallbackFunctionSendStatus callbackFunctionSendStatus) {
bool buildStatus = trap->buildForSending();
if(!buildStatus) {
SNMP_LOGW("Couldn't build trap\n");
Expand All @@ -34,6 +34,14 @@ queue_and_send_trap(std::list<struct InformItem *> &informList, SNMPTrap *trap,
if(replaceQueuedRequests){
SNMP_LOGD("Removing any outstanding informs for this trap\n");
remove_inform_from_list(informList, [trap](struct InformItem* informItem) -> bool {
if (informItem->callbackFunctionSendStatus){
SNMP_LOGD("callbackFunctionSendStatus is set\n");
delay(1);//If delete callback not working :(
informItem->callbackFunctionSendStatus(ssUnknow);
}
else{
SNMP_LOGW("callbackFunctionSendStatus not set\n");
}
return informItem->trap == trap;
});
}
Expand All @@ -48,6 +56,7 @@ queue_and_send_trap(std::list<struct InformItem *> &informList, SNMPTrap *trap,
item->lastSent = millis();
item->trap = trap;
item->missed = false;
item->callbackFunctionSendStatus = callbackFunctionSendStatus;

SNMP_LOGD("Adding Inform request to queue: %lu\n", item->requestID);

Expand All @@ -69,6 +78,14 @@ void inform_callback(std::list<struct InformItem *> &informList, snmp_request_id
//TODO: if we ever want to keep received informs, change this logic

remove_inform_from_list(informList, [requestID](struct InformItem* informItem) -> bool {
if (informItem->callbackFunctionSendStatus){
SNMP_LOGD("callbackFunctionSendStatus is set\n");
delay(1);//If delete callback not working :(
informItem->callbackFunctionSendStatus(ssOk);
}
else{
SNMP_LOGW("callbackFunctionSendStatus not set\n");
}
return informItem->requestID == requestID;
});

Expand All @@ -77,13 +94,15 @@ void inform_callback(std::list<struct InformItem *> &informList, snmp_request_id

void handle_inform_queue(std::list<struct InformItem *> &informList) {
auto thisLoop = millis();
bool flagRemove = false;
for(auto informItem : informList){
if(!informItem->received && thisLoop - informItem->lastSent > informItem->delay_ms){
SNMP_LOGD("Missed Inform receive\n");
// check if sending again
informItem->missed = true;
if(!informItem->retries){
SNMP_LOGD("No more retries for inform: %lu, removing\n", informItem->requestID);
flagRemove = true;
continue;
}
if(informItem->trap){
Expand All @@ -95,14 +114,30 @@ void handle_inform_queue(std::list<struct InformItem *> &informList) {
}
}
}
remove_inform_from_list(informList, [](struct InformItem* informItem) -> bool {
if (flagRemove) remove_inform_from_list(informList, [](struct InformItem* informItem) -> bool {
if (informItem->callbackFunctionSendStatus){
SNMP_LOGD("callbackFunctionSendStatus is set\n");
delay(1);//If delete callback not working :(
informItem->callbackFunctionSendStatus(ssError);
}
else{
SNMP_LOGW("callbackFunctionSendStatus not set\n");
}
return informItem->received || (informItem->retries == 0 && informItem->missed);
});
}

void mark_trap_deleted(std::list<struct InformItem *> &informList, SNMPTrap *trap) {
SNMP_LOGD("Removing waiting Informs tied to Trap.\n");
remove_inform_from_list(informList, [trap](struct InformItem* informItem) -> bool {
if (informItem->callbackFunctionSendStatus){
SNMP_LOGD("callbackFunctionSendStatus is set\n");
delay(1);//If delete callback not working :(
informItem->callbackFunctionSendStatus(ssUnknow);
}
else{
SNMP_LOGW("callbackFunctionSendStatus not set\n");
}
return informItem->trap == trap;
});
}
4 changes: 2 additions & 2 deletions src/SNMP_Agent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,8 @@ bool SNMPAgent::sortHandlers(){
return true;
}

snmp_request_id_t SNMPAgent::sendTrapTo(SNMPTrap* trap, const IPAddress& ip, bool replaceQueuedRequests, int retries, int delay_ms){
return queue_and_send_trap(this->informList, trap, ip, replaceQueuedRequests, retries, delay_ms);
snmp_request_id_t SNMPAgent::sendTrapTo(SNMPTrap* trap, const IPAddress& ip, CallbackFunctionSendStatus callbackFunctionSendStatus, bool replaceQueuedRequests, int retries, int delay_ms){
return queue_and_send_trap(this->informList, trap, ip, replaceQueuedRequests, retries, delay_ms, callbackFunctionSendStatus);
}

void SNMPAgent::informCallback(void* ctx, snmp_request_id_t requestID, bool responseReceiveSuccess){
Expand Down
2 changes: 1 addition & 1 deletion src/SNMP_Agent.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class SNMPAgent {
bool removeHandler(ValueCallback* callback);
bool sortHandlers();

snmp_request_id_t sendTrapTo(SNMPTrap* trap, const IPAddress& ip, bool replaceQueuedRequests = true, int retries = 0, int delay_ms = 30000);
snmp_request_id_t sendTrapTo(SNMPTrap* trap, const IPAddress& ip, CallbackFunctionSendStatus callbackFunctionSendStatus, bool replaceQueuedRequests = true, int retries = 0, int delay_ms = 30000);
static void markTrapDeleted(SNMPTrap* trap);

private:
Expand Down
13 changes: 12 additions & 1 deletion src/include/SNMPInform.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@
#include <list>
#include <functional>

enum SendStatus
{
ssNone = 0,
ssOk = 1,
ssError = -1,
ssUnknow = -100
};

typedef std::function<void(SendStatus)> CallbackFunctionSendStatus;

struct InformItem {
snmp_request_id_t requestID;
int retries;
Expand All @@ -21,9 +31,10 @@ struct InformItem {
unsigned long lastSent;
SNMPTrap* trap;
bool missed;
CallbackFunctionSendStatus callbackFunctionSendStatus = nullptr;
};

snmp_request_id_t queue_and_send_trap(std::list<struct InformItem *> &informList, SNMPTrap* trap, const IPAddress& ip, bool replaceQueuedRequests, int retries, int delay_ms);
snmp_request_id_t queue_and_send_trap(std::list<struct InformItem *> &informList, SNMPTrap* trap, const IPAddress& ip, bool replaceQueuedRequests, int retries, int delay_ms, CallbackFunctionSendStatus callbackFunctionSendStatus);
void inform_callback(std::list<struct InformItem *> &informList, snmp_request_id_t requestID, bool responseReceiveSuccess);
void handle_inform_queue(std::list<struct InformItem*> &informList);
void mark_trap_deleted(std::list<struct InformItem*> &informList, SNMPTrap* trap);
Expand Down