Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 2 of 2

Thread: SNMP for Teensy 3.1-2

  1. #1

    SNMP for Teensy 3.1-2

    Hi forum users.
    Trying to migrate from a Mega2560 to Teensy3.X because of the substantial horsepower on offer.
    Teensy has so far been good to me!

    I have an error i cant seem to solve with the Agentuino library. (https://github.com/1sw/Agentuino) exported from: http://code.google.com/p/agentuino/

    Code:
    Code:
    #include <Streaming.h>         // Include the Streaming library
    #include <Ethernet.h>          // Include the Ethernet library
    #include <SPI.h>
    #include <MemoryFree.h>
    #include <Agentuino.h> 
    //#include <Flash.h>
    //
    #define DEBUG
    //
    static byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    static byte ip[] = { 192, 168, 2, 64 };
    static byte gateway[] = { 192, 168, 2, 1 };
    static byte subnet[] = { 255, 255, 255, 0 };
    //
    // tkmib - linux mib browser
    //
    // RFC1213-MIB OIDs
    // .iso (.1)
    // .iso.org (.1.3)
    // .iso.org.dod (.1.3.6)
    // .iso.org.dod.internet (.1.3.6.1)
    // .iso.org.dod.internet.mgmt (.1.3.6.1.2)
    // .iso.org.dod.internet.mgmt.mib-2 (.1.3.6.1.2.1)
    // .iso.org.dod.internet.mgmt.mib-2.system (.1.3.6.1.2.1.1)
    // .iso.org.dod.internet.mgmt.mib-2.system.sysDescr (.1.3.6.1.2.1.1.1)
    const static char sysDescr[] PROGMEM     = "1.3.6.1.2.1.1.1.0";  // read-only  (DisplayString)
    // .iso.org.dod.internet.mgmt.mib-2.system.sysObjectID (.1.3.6.1.2.1.1.2)
    const static char sysObjectID[] PROGMEM    = "1.3.6.1.2.1.1.2.0";  // read-only  (ObjectIdentifier)
    // .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime (.1.3.6.1.2.1.1.3)
    const static char sysUpTime[] PROGMEM     = "1.3.6.1.2.1.1.3.0";  // read-only  (TimeTicks)
    // .iso.org.dod.internet.mgmt.mib-2.system.sysContact (.1.3.6.1.2.1.1.4)
    const static char sysContact[] PROGMEM    = "1.3.6.1.2.1.1.4.0";  // read-write (DisplayString)
    // .iso.org.dod.internet.mgmt.mib-2.system.sysName (.1.3.6.1.2.1.1.5)
    const static char sysName[] PROGMEM       = "1.3.6.1.2.1.1.5.0";  // read-write (DisplayString)
    // .iso.org.dod.internet.mgmt.mib-2.system.sysLocation (.1.3.6.1.2.1.1.6)
    const static char sysLocation[]PROGMEM    = "1.3.6.1.2.1.1.6.0";  // read-write (DisplayString)
    // .iso.org.dod.internet.mgmt.mib-2.system.sysServices (.1.3.6.1.2.1.1.7)
    const static char sysServices[] PROGMEM    = "1.3.6.1.2.1.1.7.0";  // read-only  (Integer)
     
    // .1.3.6.1.4.1.318.1.1.1.2.2.1.0
    const static char upsBatPnct[]  = "1.3.6.1.4.1.318.1.1.1.2.2.1.0";
     
    //
    // Arduino defined OIDs
    // .iso.org.dod.internet.private (.1.3.6.1.4)
    // .iso.org.dod.internet.private.enterprises (.1.3.6.1.4.1)
    // .iso.org.dod.internet.private.enterprises.arduino (.1.3.6.1.4.1.36582)
    //
    //
    // RFC1213 local values
    static char locDescr[]              = "Monitoring device";  // read-only (static)
    static char locObjectID[]           = "1.3.6.1.3.2009.0";                       // read-only (static)
    static uint32_t locUpTime           = 0;                                        // read-only (static)
    static char locContact[20]          = "support@domain.com";                            // should be stored/read from EEPROM - read/write (not done for simplicity)
    static char locName[20]             = "Monitor Alpha01";                              // should be stored/read from EEPROM - read/write (not done for simplicity)
    static char locLocation[20]         = "Centurion, za";                        // should be stored/read from EEPROM - read/write (not done for simplicity)
    static int32_t locServices          = 7;                                        // read-only (static)
     
    uint32_t prevMillis = millis();
    char oid[SNMP_MAX_OID_LEN];
    SNMP_API_STAT_CODES api_status;
    SNMP_ERR_CODES status;
     
    void pduReceived()
    {
      SNMP_PDU pdu;
      //
      #ifdef DEBUG
        Serial << F("UDP Packet Received Start..") << F(" RAM:") << freeMemory() << endl;
      #endif
      //
      api_status = Agentuino.requestPdu(&pdu);
      //
      if ( pdu.type == SNMP_PDU_GET || pdu.type == SNMP_PDU_GET_NEXT || pdu.type == SNMP_PDU_SET
        && pdu.error == SNMP_ERR_NO_ERROR && api_status == SNMP_API_STAT_SUCCESS ) {
        //
      #ifdef DEBUG
      Serial.print("Checking for OID: ");
        Serial.println(oid);
      #endif
      
        pdu.OID.toString(oid);
    
        //
        //Serial << "OID: " << oid << endl;
        //
        if ( strcmp_P(oid, sysDescr ) == 0 ) {
          // handle sysDescr (set/get) requests
          if ( pdu.type == SNMP_PDU_SET ) {
            // response packet from set-request - object is read-only
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = SNMP_ERR_READ_ONLY;
          } else {
            // response packet from get-request - locDescr
            status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locDescr);
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          }
          //
          #ifdef DEBUG
            Serial << F("sysDescr...") << locDescr << F(" ") << pdu.VALUE.size << endl;
            Serial.println(locDescr);
          #endif
        } else if ( strcmp_P(oid, sysUpTime ) == 0 ) {
          // handle sysName (set/get) requests
          if ( pdu.type == SNMP_PDU_SET ) {
            // response packet from set-request - object is read-only
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = SNMP_ERR_READ_ONLY;
          } else {
            // response packet from get-request - locUpTime
            status = pdu.VALUE.encode(SNMP_SYNTAX_TIME_TICKS, locUpTime);
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          }
          //
          #ifdef DEBUG
            Serial << F("sysUpTime...") << locUpTime << F(" ") << pdu.VALUE.size << endl;
          #endif
        } else if ( strcmp_P(oid, sysName ) == 0 ) {
          // handle sysName (set/get) requests
          if ( pdu.type == SNMP_PDU_SET ) {
            // response packet from set-request - object is read/write
            status = pdu.VALUE.decode(locName, strlen(locName)); 
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          } else {
            // response packet from get-request - locName
            status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locName);
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          }
          //
          #ifdef DEBUG
            Serial << F("sysName...") << locName << F(" ") << pdu.VALUE.size << endl;
          #endif
        } else if ( strcmp_P(oid, sysContact ) == 0 ) {
          // handle sysContact (set/get) requests
          if ( pdu.type == SNMP_PDU_SET ) {
            // response packet from set-request - object is read/write
            status = pdu.VALUE.decode(locContact, strlen(locContact)); 
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          } else {
            // response packet from get-request - locContact
            status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locContact);
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          }
          //
          #ifdef DEBUG
            Serial << F("sysContact...") << locContact << F(" ") << pdu.VALUE.size << endl;
          #endif
        } else if ( strcmp_P(oid, sysLocation ) == 0 ) {
          // handle sysLocation (set/get) requests
          if ( pdu.type == SNMP_PDU_SET ) {
            // response packet from set-request - object is read/write
            status = pdu.VALUE.decode(locLocation, strlen(locLocation)); 
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          } else {
            // response packet from get-request - locLocation
            status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locLocation);
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          } 
          //
          #ifdef DEBUG
            Serial << F("sysLocation...") << locLocation << F(" ") << pdu.VALUE.size << endl;
          #endif
        } else if ( strcmp_P(oid, sysServices) == 0 ) {
          // handle sysServices (set/get) requests
          if ( pdu.type == SNMP_PDU_SET ) {
            // response packet from set-request - object is read-only
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = SNMP_ERR_READ_ONLY;
          } else {
            // response packet from get-request - locServices
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locServices);
            pdu.type = SNMP_PDU_RESPONSE;
            pdu.error = status;
          }
          //
          #ifdef DEBUG
            Serial << F("locServices...") << locServices << F(" ") << pdu.VALUE.size << endl;
          #endif
        } else if ( strcmp_P(oid, upsBatPnct) == 0) {
         
          // battery voltage output
          int val = analogRead(0);
          status = pdu.VALUE.encode(SNMP_SYNTAX_INT, val);
          pdu.type = SNMP_PDU_RESPONSE;
          pdu.error = status;      
        }
         
        else {
          // oid does not exist
          //
          // response packet - object not found
          Serial.println(SNMP_ERR_NO_SUCH_NAME);
          pdu.type = SNMP_PDU_RESPONSE;
          pdu.error = SNMP_ERR_NO_SUCH_NAME;
        }
        //
        Agentuino.responsePdu(&pdu);
      }
      //
      Agentuino.freePdu(&pdu);
      //
      //Serial << "UDP Packet Received End.." << " RAM:" << freeMemory() << endl;
    }
     
    void setup()
    {
      Serial.begin(9600);
      Serial.println(locLocation);
      Serial.println("Starting ethernet");
      Ethernet.begin(mac);
      Serial.println(Ethernet.localIP());
      //
      api_status = Agentuino.begin();
      //
      if ( api_status == SNMP_API_STAT_SUCCESS ) {
        //
        Agentuino.onPduReceive(pduReceived);
        //
        delay(10);
        //
        Serial << F("SNMP Agent Initalized...") << endl;
        //
        return;
      }
      //
      delay(10);
      //
      Serial << F("SNMP Agent Initalization Problem...") << status << endl;
    }
     
    void loop()
    {
      // listen/handle for incoming SNMP requests
      Agentuino.listen();
      //
      // sysUpTime - The time (in hundredths of a second) since
      // the network management portion of the system was last
      // re-initialized.
      if ( millis() - prevMillis > 1000 ) {
        // increment previous milliseconds
        prevMillis += 1000;
        //
        // increment up-time counter
        locUpTime += 100;
      }
    }
    Code compiles and seem to work well with Mega2560


    Compile fails with (Line 191):
    Code:
    status = pdu.VALUE.encode(SNMP_SYNTAX_INT, val);
      error: call of overloaded 'encode(SNMP_SYNTAXES, int&)' is ambiguous
    
    C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_265296\AgentPlus.ino:191:53: note: candidates are:
    In file included from C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_265296\AgentPlus.ino:5:0:
    C:\Users\User\Documents\Teensy\libraries\Agentuino-master/Agentuino.h:412:17: note: SNMP_ERR_CODES SNMP_VALUE::encode(SNMP_SYNTAXES, const char*) <near match>
      SNMP_ERR_CODES encode(SNMP_SYNTAXES syn, const char *value) {
                     ^
    C:\Users\User\Documents\Teensy\libraries\Agentuino-master/Agentuino.h:412:17: note:   no known conversion for argument 2 from 'int' to 'const char*'

    Section of Agentuino.h in error report
    Code:
    	SNMP_ERR_CODES encode(SNMP_SYNTAXES syn, const char *value) {    // Line 412
    		memset(data, 0, SNMP_MAX_VALUE_LEN);
    		if ( syn == SNMP_SYNTAX_OCTETS || syn == SNMP_SYNTAX_OPAQUE ) {
    			if ( strlen(value) - 1 < SNMP_MAX_VALUE_LEN ) {
    				syntax = syn;
    				size = strlen(value);
    				for ( i = 0; i < size; i++ ) {
    					data[i] = (byte)value[i];
    				}
    				return SNMP_ERR_NO_ERROR;
    			} else {
    				clear();	
    				return SNMP_ERR_TOO_BIG;
    			}
    		} else {
    			clear();
    			return SNMP_ERR_WRONG_TYPE;
    		}
    	}
    From my cryptic knowledge of C, it "Should" work.
    Any ideas?
    Thank you regardless.

  2. #2
    Senior Member
    Join Date
    Nov 2015
    Location
    Wales
    Posts
    579
    Your issue lies here:
    Code:
    int val = analogRead(0);
    status = pdu.VALUE.encode(SNMP_SYNTAX_INT, val);
    encode() doesn't have an argument that will accept an int

    Try:
    uint32_t val = analogRead(0);

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •