mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/

Dependencies:   EthernetNetIf SDHCFileSystem I2CLEDDisp Agentbed NTPClient_NetServices mbed BMP085 HTTPClient ConfigFile I2CLCD

Committer:
okini3939
Date:
Tue Mar 29 18:15:27 2011 +0000
Revision:
14:ee6cc1632166
Parent:
9:8c63e4f3edab
Child:
18:9286e5010c14

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 5:9fa79cb5ec98 1 /**
okini3939 7:0d3484dc13a9 2 * Agentbed SNMP Server
okini3939 7:0d3484dc13a9 3 * Modified for mbed, 2011 Suga.
okini3939 5:9fa79cb5ec98 4 *
okini3939 5:9fa79cb5ec98 5 * Agentuino SNMP Agent Library Prototyping...
okini3939 5:9fa79cb5ec98 6 * Copyright 2010 Eric C. Gionet <lavco_eg@hotmail.com>
okini3939 5:9fa79cb5ec98 7 */
okini3939 5:9fa79cb5ec98 8 #include "mbed.h"
okini3939 5:9fa79cb5ec98 9 #include "Agentbed.h"
okini3939 5:9fa79cb5ec98 10 #include "EthernetNetIf.h"
okini3939 5:9fa79cb5ec98 11 #include "ConfigFile.h"
okini3939 14:ee6cc1632166 12 #include "conf.h"
okini3939 5:9fa79cb5ec98 13
okini3939 5:9fa79cb5ec98 14 AgentbedClass Agentbed;
okini3939 5:9fa79cb5ec98 15
okini3939 5:9fa79cb5ec98 16 // RFC1213-MIB OIDs
okini3939 5:9fa79cb5ec98 17 // .iso (.1)
okini3939 5:9fa79cb5ec98 18 // .iso.org (.1.3)
okini3939 5:9fa79cb5ec98 19 // .iso.org.dod (.1.3.6)
okini3939 5:9fa79cb5ec98 20 // .iso.org.dod.internet (.1.3.6.1)
okini3939 5:9fa79cb5ec98 21 // .iso.org.dod.internet.mgmt (.1.3.6.1.2)
okini3939 5:9fa79cb5ec98 22 // .iso.org.dod.internet.mgmt.mib-2 (.1.3.6.1.2.1)
okini3939 5:9fa79cb5ec98 23 // .iso.org.dod.internet.mgmt.mib-2.system (.1.3.6.1.2.1.1)
okini3939 5:9fa79cb5ec98 24 // .iso.org.dod.internet.mgmt.mib-2.system.sysDescr (.1.3.6.1.2.1.1.1)
okini3939 5:9fa79cb5ec98 25 const char sysDescr[] = "1.3.6.1.2.1.1.1.0"; // read-only (DisplayString)
okini3939 5:9fa79cb5ec98 26 // .iso.org.dod.internet.mgmt.mib-2.system.sysObjectID (.1.3.6.1.2.1.1.2)
okini3939 5:9fa79cb5ec98 27 const char sysObjectID[] = "1.3.6.1.2.1.1.2.0"; // read-only (ObjectIdentifier)
okini3939 5:9fa79cb5ec98 28 // .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime (.1.3.6.1.2.1.1.3)
okini3939 5:9fa79cb5ec98 29 const char sysUpTime[] = "1.3.6.1.2.1.1.3.0"; // read-only (TimeTicks)
okini3939 5:9fa79cb5ec98 30 // .iso.org.dod.internet.mgmt.mib-2.system.sysContact (.1.3.6.1.2.1.1.4)
okini3939 5:9fa79cb5ec98 31 const char sysContact[] = "1.3.6.1.2.1.1.4.0"; // read-write (DisplayString)
okini3939 5:9fa79cb5ec98 32 // .iso.org.dod.internet.mgmt.mib-2.system.sysName (.1.3.6.1.2.1.1.5)
okini3939 5:9fa79cb5ec98 33 const char sysName[] = "1.3.6.1.2.1.1.5.0"; // read-write (DisplayString)
okini3939 5:9fa79cb5ec98 34 // .iso.org.dod.internet.mgmt.mib-2.system.sysLocation (.1.3.6.1.2.1.1.6)
okini3939 5:9fa79cb5ec98 35 const char sysLocation[] = "1.3.6.1.2.1.1.6.0"; // read-write (DisplayString)
okini3939 5:9fa79cb5ec98 36 // .iso.org.dod.internet.mgmt.mib-2.system.sysServices (.1.3.6.1.2.1.1.7)
okini3939 5:9fa79cb5ec98 37 const char sysServices[] = "1.3.6.1.2.1.1.7.0"; // read-only (Integer)
okini3939 5:9fa79cb5ec98 38 //
okini3939 5:9fa79cb5ec98 39 // Arduino defined OIDs
okini3939 5:9fa79cb5ec98 40 // .iso.org.dod.internet.private (.1.3.6.1.4)
okini3939 5:9fa79cb5ec98 41 // .iso.org.dod.internet.private.enterprises (.1.3.6.1.4.1)
okini3939 5:9fa79cb5ec98 42 // .iso.org.dod.internet.private.enterprises.arduino (.1.3.6.1.4.1.36582)
okini3939 5:9fa79cb5ec98 43 const char enterprises[] = "1.3.6.1.4.1.36582."; // read-only (Integer)
okini3939 5:9fa79cb5ec98 44 //
okini3939 5:9fa79cb5ec98 45 //
okini3939 5:9fa79cb5ec98 46 // RFC1213 local values
okini3939 5:9fa79cb5ec98 47 static char locDescr[] = "mbed Weather Platform"; // read-only (static)
okini3939 5:9fa79cb5ec98 48 static char locObjectID[] = "1.3.6.1.4.1.36582"; // read-only (static)
okini3939 5:9fa79cb5ec98 49 uint32_t locUpTime = 0; // read-only (static)
okini3939 5:9fa79cb5ec98 50 static char locContact[] = "<root@weather>"; // should be stored/read from EEPROM - read/write (not done for simplicity)
okini3939 5:9fa79cb5ec98 51 static char locName[] = "weather.mbed"; // should be stored/read from EEPROM - read/write (not done for simplicity)
okini3939 5:9fa79cb5ec98 52 static char locLocation[] = "weather"; // should be stored/read from EEPROM - read/write (not done for simplicity)
okini3939 5:9fa79cb5ec98 53 static int32_t locServices = 7; // read-only (static)
okini3939 5:9fa79cb5ec98 54
okini3939 5:9fa79cb5ec98 55 uint32_t prevMillis = 0;
okini3939 5:9fa79cb5ec98 56 char oid[SNMP_MAX_OID_LEN];
okini3939 5:9fa79cb5ec98 57 SNMP_API_STAT_CODES api_status;
okini3939 5:9fa79cb5ec98 58 SNMP_ERR_CODES status;
okini3939 5:9fa79cb5ec98 59
okini3939 9:8c63e4f3edab 60 extern DigitalOut led_y;
okini3939 14:ee6cc1632166 61 extern Sensor sensor;
okini3939 5:9fa79cb5ec98 62
okini3939 5:9fa79cb5ec98 63 void pduReceived()
okini3939 5:9fa79cb5ec98 64 {
okini3939 5:9fa79cb5ec98 65 SNMP_PDU pdu;
okini3939 5:9fa79cb5ec98 66 //
okini3939 9:8c63e4f3edab 67 led_y = 1;
okini3939 5:9fa79cb5ec98 68 api_status = Agentbed.requestPdu(&pdu);
okini3939 5:9fa79cb5ec98 69 //
okini3939 5:9fa79cb5ec98 70 if ( pdu.type == SNMP_PDU_GET || pdu.type == SNMP_PDU_GET_NEXT || pdu.type == SNMP_PDU_SET
okini3939 5:9fa79cb5ec98 71 && pdu.error == SNMP_ERR_NO_ERROR && api_status == SNMP_API_STAT_SUCCESS ) {
okini3939 5:9fa79cb5ec98 72 //
okini3939 5:9fa79cb5ec98 73 pdu.OID.toString(oid);
okini3939 5:9fa79cb5ec98 74 //
okini3939 5:9fa79cb5ec98 75 pdu.error = SNMP_ERR_READ_ONLY;
okini3939 5:9fa79cb5ec98 76 //
okini3939 5:9fa79cb5ec98 77 if ( strcmp(oid, sysDescr ) == 0 ) {
okini3939 5:9fa79cb5ec98 78 // handle sysDescr (set/get) requests
okini3939 5:9fa79cb5ec98 79 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 80 // response packet from get-request - locDescr
okini3939 5:9fa79cb5ec98 81 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locDescr);
okini3939 5:9fa79cb5ec98 82 pdu.error = status;
okini3939 5:9fa79cb5ec98 83 }
okini3939 5:9fa79cb5ec98 84 } else if ( strcmp(oid, sysObjectID ) == 0 ) {
okini3939 5:9fa79cb5ec98 85 // handle sysName (set/get) requests
okini3939 5:9fa79cb5ec98 86 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 87 // response packet from get-request - locUpTime
okini3939 5:9fa79cb5ec98 88 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locObjectID);
okini3939 5:9fa79cb5ec98 89 pdu.error = status;
okini3939 5:9fa79cb5ec98 90 }
okini3939 5:9fa79cb5ec98 91 } else if ( strcmp(oid, sysUpTime ) == 0 ) {
okini3939 5:9fa79cb5ec98 92 // handle sysName (set/get) requests
okini3939 5:9fa79cb5ec98 93 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 94 // response packet from get-request - locUpTime
okini3939 5:9fa79cb5ec98 95 status = pdu.VALUE.encode(SNMP_SYNTAX_TIME_TICKS, locUpTime);
okini3939 5:9fa79cb5ec98 96 pdu.error = status;
okini3939 5:9fa79cb5ec98 97 }
okini3939 5:9fa79cb5ec98 98 } else if ( strcmp(oid, sysName ) == 0 ) {
okini3939 5:9fa79cb5ec98 99 // handle sysName (set/get) requests
okini3939 5:9fa79cb5ec98 100 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 101 // response packet from get-request - locName
okini3939 5:9fa79cb5ec98 102 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locName);
okini3939 5:9fa79cb5ec98 103 pdu.error = status;
okini3939 5:9fa79cb5ec98 104 }
okini3939 5:9fa79cb5ec98 105 } else if ( strcmp(oid, sysContact ) == 0 ) {
okini3939 5:9fa79cb5ec98 106 // handle sysContact (set/get) requests
okini3939 5:9fa79cb5ec98 107 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 108 // response packet from get-request - locContact
okini3939 5:9fa79cb5ec98 109 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locContact);
okini3939 5:9fa79cb5ec98 110 pdu.error = status;
okini3939 5:9fa79cb5ec98 111 }
okini3939 5:9fa79cb5ec98 112 } else if ( strcmp(oid, sysLocation ) == 0 ) {
okini3939 5:9fa79cb5ec98 113 // handle sysLocation (set/get) requests
okini3939 5:9fa79cb5ec98 114 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 115 // response packet from get-request - locLocation
okini3939 5:9fa79cb5ec98 116 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locLocation);
okini3939 5:9fa79cb5ec98 117 pdu.error = status;
okini3939 5:9fa79cb5ec98 118 }
okini3939 5:9fa79cb5ec98 119 } else if ( strcmp(oid, sysServices) == 0 ) {
okini3939 5:9fa79cb5ec98 120 // handle sysServices (set/get) requests
okini3939 5:9fa79cb5ec98 121 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 122 // response packet from get-request - locServices
okini3939 5:9fa79cb5ec98 123 status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locServices);
okini3939 5:9fa79cb5ec98 124 pdu.error = status;
okini3939 5:9fa79cb5ec98 125 }
okini3939 5:9fa79cb5ec98 126 } else if ( strncmp(oid, enterprises, strlen(enterprises)) == 0 ) {
okini3939 5:9fa79cb5ec98 127 // handle enterprises (set/get) requests
okini3939 5:9fa79cb5ec98 128 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 129 // response packet from get-request - enterprises
okini3939 5:9fa79cb5ec98 130 switch (oid[strlen(enterprises)]) {
okini3939 5:9fa79cb5ec98 131 case '0':
okini3939 14:ee6cc1632166 132 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.pres);
okini3939 5:9fa79cb5ec98 133 break;
okini3939 5:9fa79cb5ec98 134 case '1':
okini3939 14:ee6cc1632166 135 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.temp);
okini3939 5:9fa79cb5ec98 136 break;
okini3939 5:9fa79cb5ec98 137 case '2':
okini3939 14:ee6cc1632166 138 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.humi);
okini3939 5:9fa79cb5ec98 139 break;
okini3939 5:9fa79cb5ec98 140 case '3':
okini3939 14:ee6cc1632166 141 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.anemo);
okini3939 5:9fa79cb5ec98 142 break;
okini3939 5:9fa79cb5ec98 143 case '4':
okini3939 14:ee6cc1632166 144 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.vane);
okini3939 5:9fa79cb5ec98 145 break;
okini3939 5:9fa79cb5ec98 146 case '5':
okini3939 14:ee6cc1632166 147 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.rain);
okini3939 5:9fa79cb5ec98 148 break;
okini3939 5:9fa79cb5ec98 149 case '6':
okini3939 14:ee6cc1632166 150 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.light);
okini3939 5:9fa79cb5ec98 151 break;
okini3939 5:9fa79cb5ec98 152 case '7':
okini3939 14:ee6cc1632166 153 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.uv);
okini3939 5:9fa79cb5ec98 154 break;
okini3939 5:9fa79cb5ec98 155 case '8':
okini3939 14:ee6cc1632166 156 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.moist);
okini3939 5:9fa79cb5ec98 157 break;
okini3939 5:9fa79cb5ec98 158 case '9':
okini3939 14:ee6cc1632166 159 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.temp2);
okini3939 5:9fa79cb5ec98 160 break;
okini3939 5:9fa79cb5ec98 161 }
okini3939 5:9fa79cb5ec98 162 pdu.error = status;
okini3939 5:9fa79cb5ec98 163 }
okini3939 5:9fa79cb5ec98 164 } else {
okini3939 5:9fa79cb5ec98 165 // oid does not exist
okini3939 5:9fa79cb5ec98 166 //
okini3939 5:9fa79cb5ec98 167 // response packet - object not found
okini3939 5:9fa79cb5ec98 168 pdu.error = SNMP_ERR_NO_SUCH_NAME;
okini3939 5:9fa79cb5ec98 169 }
okini3939 5:9fa79cb5ec98 170 //
okini3939 5:9fa79cb5ec98 171 pdu.type = SNMP_PDU_RESPONSE;
okini3939 5:9fa79cb5ec98 172
okini3939 5:9fa79cb5ec98 173 Agentbed.responsePdu(&pdu);
okini3939 5:9fa79cb5ec98 174 }
okini3939 5:9fa79cb5ec98 175 //
okini3939 5:9fa79cb5ec98 176 Agentbed.freePdu(&pdu);
okini3939 5:9fa79cb5ec98 177 //
okini3939 5:9fa79cb5ec98 178 //Serial << "UDP Packet Received End.." << " RAM:" << freeMemory() << endl;
okini3939 5:9fa79cb5ec98 179 }