mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/
Dependencies: ChaNFSSD EthernetNetIf I2CLEDDisp Agentbed ChaNFSUSB ILinterpreter mbed BMP085 WeatherMeters ConfigFile ChaNFS I2CLCD
Diff: snmp.cpp
- Revision:
- 0:bdb53686c194
- Child:
- 1:6c7141895545
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/snmp.cpp Mon Jul 04 15:16:45 2011 +0000 @@ -0,0 +1,188 @@ +/** +* Agentbed SNMP Server +* Modified for mbed, 2011 Suga. +* +* Agentuino SNMP Agent Library Prototyping... +* Copyright 2010 Eric C. Gionet <lavco_eg@hotmail.com> +*/ +#include "mbed.h" +#include "EthernetNetIf.h" +#include "weather.h" +#ifdef USE_SNMP +#include "Agentbed.h" + +static AgentbedClass Agentbed; + +// 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 char sysDescr[] = "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 char sysObjectID[] = "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 char sysUpTime[] = "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 char sysContact[] = "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 char sysName[] = "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 char sysLocation[] = "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 char sysServices[] = "1.3.6.1.2.1.1.7.0"; // read-only (Integer) +// +// 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) +const char enterprises[] = "1.3.6.1.4.1.36582."; // read-only (Integer) +// +// +// RFC1213 local values +static char locDescr[] = "mbed Weather Platform"; // read-only (static) +static char locObjectID[] = "1.3.6.1.4.1.36582"; // read-only (static) +#endif +volatile uint32_t locUpTime = 0; // read-only (static) +#ifdef USE_SNMP +static char locContact[] = "<root@weather>"; // should be stored/read from EEPROM - read/write (not done for simplicity) +static char locName[] = "weather.mbed"; // should be stored/read from EEPROM - read/write (not done for simplicity) +static char locLocation[] = "weather"; // should be stored/read from EEPROM - read/write (not done for simplicity) +static int32_t locServices = 7; // read-only (static) + +static char oid[SNMP_MAX_OID_LEN]; +static SNMP_API_STAT_CODES api_status; +static SNMP_ERR_CODES status; + + +void pduReceived() +{ + SNMP_PDU pdu; + // + LED_NET_ON; + api_status = Agentbed.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 ) { + // + pdu.OID.toString(oid); + // + pdu.error = SNMP_ERR_READ_ONLY; + // + if ( strcmp(oid, sysDescr ) == 0 ) { + // handle sysDescr (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - locDescr + status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locDescr); + pdu.error = status; + } + } else if ( strcmp(oid, sysObjectID ) == 0 ) { + // handle sysName (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - locUpTime + status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locObjectID); + pdu.error = status; + } + } else if ( strcmp(oid, sysUpTime ) == 0 ) { + // handle sysName (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - locUpTime + status = pdu.VALUE.encode(SNMP_SYNTAX_TIME_TICKS, locUpTime); + pdu.error = status; + } + } else if ( strcmp(oid, sysName ) == 0 ) { + // handle sysName (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - locName + status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locName); + pdu.error = status; + } + } else if ( strcmp(oid, sysContact ) == 0 ) { + // handle sysContact (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - locContact + status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locContact); + pdu.error = status; + } + } else if ( strcmp(oid, sysLocation ) == 0 ) { + // handle sysLocation (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - locLocation + status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locLocation); + pdu.error = status; + } + } else if ( strcmp(oid, sysServices) == 0 ) { + // handle sysServices (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - locServices + status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locServices); + pdu.error = status; + } + } else if ( strncmp(oid, enterprises, strlen(enterprises)) == 0 ) { + // handle enterprises (set/get) requests + if ( pdu.type == SNMP_PDU_GET ) { + // response packet from get-request - enterprises + switch (oid[strlen(enterprises)]) { + case '0': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.pres); + break; + case '1': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.temp); + break; + case '2': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.humi); + break; + case '3': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.anemo); + break; + case '4': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.vane); + break; + case '5': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.rain); + break; + case '6': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.light); + break; + case '7': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.uv); + break; + case '8': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.moist); + break; + case '9': + status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.temp2); + break; + } + pdu.error = status; + } + } else { + // oid does not exist + // + // response packet - object not found + pdu.error = SNMP_ERR_NO_SUCH_NAME; + } + // + pdu.type = SNMP_PDU_RESPONSE; + + Agentbed.responsePdu(&pdu); + } + // + Agentbed.freePdu(&pdu); + // + //Serial << "UDP Packet Received End.." << " RAM:" << freeMemory() << endl; +} +#endif + +int snmp_init (char *commname) { +#ifdef USE_SNMP + Agentbed.begin(commname, "None", SNMP_DEFAULT_PORT, eth); + Agentbed.onPduReceive(pduReceived); +#endif + return 0; +} +