Hi, this is my first Arduino project after testing some example sketches and making an LCD display menu. I would like to read a few predefined MIB’s from a modem with SNMP get-commands. First I want to display a MIB in my serial monitor and finally I’d like to display them on my LCD. The modem I am using for this test is configured for use with SNMP V2c. The modem is not in a “live” environment. When I use a MIB browser I can see one of predefined MIB’s at this location: 1.3.6.1.2.1.10.127.1.1.1.1.6.3. The MIB contains a value around -490.
When I check my serial monitor using the code below the only thing I see is “SNMP Agent Initalized…” Can someone tell me how I can display a MIB there?
I used the sketch from the “Agentuino SNMP Astronomy Weather Station” and I adapted it for my own needs. I compared it with the Agentuino example sketch and the only difference I see was an “F” every time this function is used: Serial << F("SNMP Agent Initalized...") << endl;
Can someone tell what the “F” is needed for?
/*
* Adaptation of
* Agentuino SNMP Astronomy Weather Station
* http://openhardware.gridshield.net/home/arduino-snmp-temperature-sensor
* example from "yesyesserver.co.uk/temp/wheater_station"
*/
#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
// SNMP stuff
byte count=0; // count number of processed SNMP requests
// parameters for the Ethernet library
static byte mac[] = { 0x90, 0xA3, 0xDA, 0x0E, 0xAD, 0x3f };
static byte ip[] = { 192, 168, 1, 200 };
static byte gateway[] = { 192, 168, 1, 1 };
static byte subnet[] = { 255, 255, 255, 0 };
// must-have RFC1213-MIB OIDs (taken from agentuino sample sketch)
// .iso.org.dod.internet.mgmt.mib-2.system.sysDescr (.1.3.6.1.2.1.1.1)
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)
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)
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)
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)
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)
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)
static char sysServices[] PROGMEM = "1.3.6.1.2.1.1.7.0"; // read-only (Integer)
// custom OIDs -> Aan te passen
static char MyMib[] PROGMEM = "1.3.6.1.2.1.10.127.1.1.1.1.6.3"; // The MIB I want to read
// RFC1213 local values (taken from agentuino sample sketch) -> Aan te passen
static char locDescr[] = "Arduino based SNMP Astronomy Weather Station"; // read-only (static)
static char locObjectID[] = "1.3.6.1.2.1.10.127.1"; // read-only (static)
static uint32_t locUpTime = 0; // read-only (static)
static char locContact[20] = "yesyes"; // should be stored/read from EEPROM - read/write (not done for simplicity)
static char locName[20] = "Agentuino"; // should be stored/read from EEPROM - read/write (not done for simplicity)
static char locLocation[20] = "Maidenhead, UK"; // should be stored/read from EEPROM - read/write (not done for simplicity)
static int32_t locServices = 7; // read-only (static)
uint32_t prevMillis = millis(); // used for system uptime calculation
char oid[SNMP_MAX_OID_LEN]; // will hold the OID of an SNMP request
SNMP_API_STAT_CODES api_status; // agentuino SNMP status
SNMP_ERR_CODES status;
// SNMP callback function, taken from agentuino sample sketch and extended to include my custom OIDs
void pduReceived() // is being called when an SNMP packet has been received
{
SNMP_PDU pdu;
//
#ifdef DEBUG
Serial << "UDP Packet Received Start.." << " RAM:" << freeMemory() << endl;
#endif
//
api_status = Agentuino.requestPdu(&pdu);
// check if valid packet
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 )
{
//
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 << "sysDescr..." << locDescr << " " << pdu.VALUE.size << endl;
#endif
}
else if ( strcmp_P(oid, sysObjectID ) == 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_OCTETS, locObjectID);
pdu.type = SNMP_PDU_RESPONSE;
pdu.error = status;
}
//
#ifdef DEBUG
Serial << "ObjectID" << locObjectID << " " << pdu.VALUE.size << endl;
#endif
}
//… had to shorten the code for I can post only 9500 characters in the Arduino forum. Check out the full code at the web page shown at the beginning of this example.
// add more custom OID blocks here
else
{
// oid does not exist
//
// response packet - object not found
pdu.type = SNMP_PDU_RESPONSE;
pdu.error = SNMP_ERR_NO_SUCH_NAME;
Serial << "Unknown OID" << endl;
}
//
Serial << "Sending response..." << endl;
Agentuino.responsePdu(&pdu);
count++;
}
else
// packet not valid, send GENERAL_ERROR response. Required, otherwise the invalid packet
// will get stuck in the buffer and processed over and over again
{
Serial << "Unknown Packet!!" << endl;
Serial << "PDU Type: " << pdu.type << " PDU Error: " << pdu.error << " API status: "<< api_status << endl;
pdu.type = SNMP_PDU_RESPONSE;
pdu.error = SNMP_ERR_GEN_ERROR;
Agentuino.responsePdu(&pdu);
Serial << "Sent 'GENERAL_ERROR' response" << endl;
}
//
Serial << "freeing PDU.." << " RAM:" << freeMemory() << endl;
Agentuino.freePdu(&pdu);
//
Serial << "UDP Packet Received End.." << " RAM:" << freeMemory() << endl;
}
void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip);
// start Agentuino SNMP library
api_status = Agentuino.begin();
if ( api_status == SNMP_API_STAT_SUCCESS )
{
Agentuino.onPduReceive(pduReceived); // register callback function that is being called when an SNMP packet has been received
delay(10);
Serial << "SNMP Agent Initalized..." << endl;
}
else
{
delay(10);
Serial << "SNMP Agent Initalization Problem..." << status << endl;
}
}
void loop()
{
Serial.print(MyMib);
// listen for / handle 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;
}
}