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:
Fri Jun 03 15:38:22 2011 +0000
Revision:
19:69b77f9e0446
Parent:
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 18:9286e5010c14 12 #include "weather.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 18:9286e5010c14 49 volatile 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 5:9fa79cb5ec98 60
okini3939 5:9fa79cb5ec98 61 void pduReceived()
okini3939 5:9fa79cb5ec98 62 {
okini3939 5:9fa79cb5ec98 63 SNMP_PDU pdu;
okini3939 5:9fa79cb5ec98 64 //
okini3939 9:8c63e4f3edab 65 led_y = 1;
okini3939 5:9fa79cb5ec98 66 api_status = Agentbed.requestPdu(&pdu);
okini3939 5:9fa79cb5ec98 67 //
okini3939 5:9fa79cb5ec98 68 if ( pdu.type == SNMP_PDU_GET || pdu.type == SNMP_PDU_GET_NEXT || pdu.type == SNMP_PDU_SET
okini3939 5:9fa79cb5ec98 69 && pdu.error == SNMP_ERR_NO_ERROR && api_status == SNMP_API_STAT_SUCCESS ) {
okini3939 5:9fa79cb5ec98 70 //
okini3939 5:9fa79cb5ec98 71 pdu.OID.toString(oid);
okini3939 5:9fa79cb5ec98 72 //
okini3939 5:9fa79cb5ec98 73 pdu.error = SNMP_ERR_READ_ONLY;
okini3939 5:9fa79cb5ec98 74 //
okini3939 5:9fa79cb5ec98 75 if ( strcmp(oid, sysDescr ) == 0 ) {
okini3939 5:9fa79cb5ec98 76 // handle sysDescr (set/get) requests
okini3939 5:9fa79cb5ec98 77 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 78 // response packet from get-request - locDescr
okini3939 5:9fa79cb5ec98 79 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locDescr);
okini3939 5:9fa79cb5ec98 80 pdu.error = status;
okini3939 5:9fa79cb5ec98 81 }
okini3939 5:9fa79cb5ec98 82 } else if ( strcmp(oid, sysObjectID ) == 0 ) {
okini3939 5:9fa79cb5ec98 83 // handle sysName (set/get) requests
okini3939 5:9fa79cb5ec98 84 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 85 // response packet from get-request - locUpTime
okini3939 5:9fa79cb5ec98 86 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locObjectID);
okini3939 5:9fa79cb5ec98 87 pdu.error = status;
okini3939 5:9fa79cb5ec98 88 }
okini3939 5:9fa79cb5ec98 89 } else if ( strcmp(oid, sysUpTime ) == 0 ) {
okini3939 5:9fa79cb5ec98 90 // handle sysName (set/get) requests
okini3939 5:9fa79cb5ec98 91 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 92 // response packet from get-request - locUpTime
okini3939 5:9fa79cb5ec98 93 status = pdu.VALUE.encode(SNMP_SYNTAX_TIME_TICKS, locUpTime);
okini3939 5:9fa79cb5ec98 94 pdu.error = status;
okini3939 5:9fa79cb5ec98 95 }
okini3939 5:9fa79cb5ec98 96 } else if ( strcmp(oid, sysName ) == 0 ) {
okini3939 5:9fa79cb5ec98 97 // handle sysName (set/get) requests
okini3939 5:9fa79cb5ec98 98 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 99 // response packet from get-request - locName
okini3939 5:9fa79cb5ec98 100 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locName);
okini3939 5:9fa79cb5ec98 101 pdu.error = status;
okini3939 5:9fa79cb5ec98 102 }
okini3939 5:9fa79cb5ec98 103 } else if ( strcmp(oid, sysContact ) == 0 ) {
okini3939 5:9fa79cb5ec98 104 // handle sysContact (set/get) requests
okini3939 5:9fa79cb5ec98 105 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 106 // response packet from get-request - locContact
okini3939 5:9fa79cb5ec98 107 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locContact);
okini3939 5:9fa79cb5ec98 108 pdu.error = status;
okini3939 5:9fa79cb5ec98 109 }
okini3939 5:9fa79cb5ec98 110 } else if ( strcmp(oid, sysLocation ) == 0 ) {
okini3939 5:9fa79cb5ec98 111 // handle sysLocation (set/get) requests
okini3939 5:9fa79cb5ec98 112 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 113 // response packet from get-request - locLocation
okini3939 5:9fa79cb5ec98 114 status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locLocation);
okini3939 5:9fa79cb5ec98 115 pdu.error = status;
okini3939 5:9fa79cb5ec98 116 }
okini3939 5:9fa79cb5ec98 117 } else if ( strcmp(oid, sysServices) == 0 ) {
okini3939 5:9fa79cb5ec98 118 // handle sysServices (set/get) requests
okini3939 5:9fa79cb5ec98 119 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 120 // response packet from get-request - locServices
okini3939 5:9fa79cb5ec98 121 status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locServices);
okini3939 5:9fa79cb5ec98 122 pdu.error = status;
okini3939 5:9fa79cb5ec98 123 }
okini3939 5:9fa79cb5ec98 124 } else if ( strncmp(oid, enterprises, strlen(enterprises)) == 0 ) {
okini3939 5:9fa79cb5ec98 125 // handle enterprises (set/get) requests
okini3939 5:9fa79cb5ec98 126 if ( pdu.type == SNMP_PDU_GET ) {
okini3939 5:9fa79cb5ec98 127 // response packet from get-request - enterprises
okini3939 5:9fa79cb5ec98 128 switch (oid[strlen(enterprises)]) {
okini3939 5:9fa79cb5ec98 129 case '0':
okini3939 14:ee6cc1632166 130 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.pres);
okini3939 5:9fa79cb5ec98 131 break;
okini3939 5:9fa79cb5ec98 132 case '1':
okini3939 14:ee6cc1632166 133 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.temp);
okini3939 5:9fa79cb5ec98 134 break;
okini3939 5:9fa79cb5ec98 135 case '2':
okini3939 14:ee6cc1632166 136 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.humi);
okini3939 5:9fa79cb5ec98 137 break;
okini3939 5:9fa79cb5ec98 138 case '3':
okini3939 14:ee6cc1632166 139 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.anemo);
okini3939 5:9fa79cb5ec98 140 break;
okini3939 5:9fa79cb5ec98 141 case '4':
okini3939 14:ee6cc1632166 142 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.vane);
okini3939 5:9fa79cb5ec98 143 break;
okini3939 5:9fa79cb5ec98 144 case '5':
okini3939 14:ee6cc1632166 145 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.rain);
okini3939 5:9fa79cb5ec98 146 break;
okini3939 5:9fa79cb5ec98 147 case '6':
okini3939 14:ee6cc1632166 148 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.light);
okini3939 5:9fa79cb5ec98 149 break;
okini3939 5:9fa79cb5ec98 150 case '7':
okini3939 14:ee6cc1632166 151 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.uv);
okini3939 5:9fa79cb5ec98 152 break;
okini3939 5:9fa79cb5ec98 153 case '8':
okini3939 14:ee6cc1632166 154 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.moist);
okini3939 5:9fa79cb5ec98 155 break;
okini3939 5:9fa79cb5ec98 156 case '9':
okini3939 14:ee6cc1632166 157 status = pdu.VALUE.encode(SNMP_SYNTAX_OPAQUE_FLOAT, sensor.temp2);
okini3939 5:9fa79cb5ec98 158 break;
okini3939 5:9fa79cb5ec98 159 }
okini3939 5:9fa79cb5ec98 160 pdu.error = status;
okini3939 5:9fa79cb5ec98 161 }
okini3939 5:9fa79cb5ec98 162 } else {
okini3939 5:9fa79cb5ec98 163 // oid does not exist
okini3939 5:9fa79cb5ec98 164 //
okini3939 5:9fa79cb5ec98 165 // response packet - object not found
okini3939 5:9fa79cb5ec98 166 pdu.error = SNMP_ERR_NO_SUCH_NAME;
okini3939 5:9fa79cb5ec98 167 }
okini3939 5:9fa79cb5ec98 168 //
okini3939 5:9fa79cb5ec98 169 pdu.type = SNMP_PDU_RESPONSE;
okini3939 5:9fa79cb5ec98 170
okini3939 5:9fa79cb5ec98 171 Agentbed.responsePdu(&pdu);
okini3939 5:9fa79cb5ec98 172 }
okini3939 5:9fa79cb5ec98 173 //
okini3939 5:9fa79cb5ec98 174 Agentbed.freePdu(&pdu);
okini3939 5:9fa79cb5ec98 175 //
okini3939 5:9fa79cb5ec98 176 //Serial << "UDP Packet Received End.." << " RAM:" << freeMemory() << endl;
okini3939 5:9fa79cb5ec98 177 }