Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Compiles with arduino 1.5.4r2
- *
- * Using LM335Z temperature sensor
- *
- * If you use any shield you will need to use at least a DC 9V 300ma power supply
- * if not you will get incorrect readings from the 5v rail due to not enough power
- * supplied by usb. I'm using seeed Ethernet shield 1.1v. Oh and the Agentuino snmp
- * library for compiling this I'm using r48 and did not use the suggest Ethernet libraries
- * they are depreciated and don't work just use the 1.5.4r2 Ethernet libraries
- * this is far from my code its patched together using examples I found. I take
- * no credit out side of patching it together and getting it to work!
- */
- #include <Streaming.h> // Include the Streaming library
- #include <Ethernet.h> // Include the Ethernet library
- #include <SPI.h>
- #include <EthernetDHCP.h>
- #include <MemoryFree.h>
- #include <Agentuino.h>
- //
- #define DEBUG
- #define watchdogpin 2
- //
- int temperaturePin = 2;
- // SNMP stuff
- byte count=0; // count number of processed SNMP requests
- // global variables holding sensor values
- static int32_t v_AnalogPin0=0;
- // parameters for the Ethernet library
- 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 };
- // 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
- static char AnalogPin0[] PROGMEM = "1.3.6.1.3.2009.0.3.0"; // Analog pin 0 Level (0-1023)
- // RFC1213 local values (taken from agentuino sample sketch)
- static char locDescr[] = "Gridshield SNMP Sensor"; // 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] = "www.gridshield.net"; // should be stored/read from EEPROM - read/write (not done for simplicity)
- static char locName[20] = "Datacenter"; // should be stored/read from EEPROM - read/write (not done for simplicity)
- static char locLocation[20] = "San Jose, CR"; // 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.VALUE.encode(SNMP_SYNTAX_NULL);
- 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
- }
- 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 << "sysUpTime..." << locUpTime << " " << 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 << "sysName..." << locName << " " << 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 << "sysContact..." << locContact << " " << 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 << "sysLocation..." << locLocation << " " << 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 << "locServices..." << locServices << " " << pdu.VALUE.size << endl;
- #endif
- }
- else if ( strcmp_P(oid, AnalogPin0 ) == 0 ) // Analog Pin 0 Level request
- {
- // 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 - AnalogPin0
- status = pdu.VALUE.encode(SNMP_SYNTAX_INT32, v_AnalogPin0);
- pdu.type = SNMP_PDU_RESPONSE;
- pdu.error = status;
- }
- Serial << "v_AnalogPin0..." << v_AnalogPin0 << " " << pdu.VALUE.size << endl;
- }
- // add more custom OID blocks here
- else
- {
- // oid does not exist
- //
- // response packet - object not found
- //pdu.VALUE.encode(SNMP_SYNTAX_NULL);
- 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()
- {
- // reset hardware watchdog timer
- pinMode(watchdogpin, OUTPUT);
- digitalWrite(watchdogpin, LOW);
- delay(50);
- digitalWrite(watchdogpin, HIGH);
- Serial.begin(9600);
- Serial << endl << "##################RESET###################" << endl << endl;
- Ethernet.begin(mac, ip);
- // give the Ethernet shield a second to initialize:
- delay(1000);
- // 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()
- {
- float temperature = getTemperature(temperaturePin) * 0.004882812 * 100; // convert to kelvin
- Serial.println(temperature);
- v_AnalogPin0 = ((temperature - 2.5) * 9 / 5) - 459.67; // change to Fahrenheit
- digitalWrite(watchdogpin, LOW);
- delay(50);
- digitalWrite(watchdogpin, HIGH);
- // 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;
- }
- }
- float getTemperature(int pin){
- return (analogRead(pin));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement