trash over HTTP

Dependencies:   C027_Support HTTPClient TrashSensors mbed Crypto

Fork of SLOTrashHTTP by Corey Ford

Collects sensor readings and sends them to https://trash.coreyford.name/

Server code: https://github.com/coyotebush/trash-map

Committer:
coyotebush
Date:
Thu Jun 04 04:59:57 2015 +0000
Revision:
7:49f2a1277737
Parent:
6:43ac8ef67a03
Child:
8:2398817ac9c2
Add watchdog

Who changed what in which revision?

UserRevisionLine numberNew contents of line
coyotebush 0:284e9c16e92d 1 #include "mbed.h"
coyotebush 0:284e9c16e92d 2 #include "HTTPClient.h"
coyotebush 0:284e9c16e92d 3
coyotebush 0:284e9c16e92d 4 #include "hcsr04.h"
coyotebush 5:21e76b5af13b 5 #include "GroveTemp.h"
coyotebush 3:1e5d19eb7c9a 6 #include "GPS.h"
coyotebush 0:284e9c16e92d 7
coyotebush 7:49f2a1277737 8 #include "Watchdog.h"
coyotebush 7:49f2a1277737 9
coyotebush 4:1acb5d26ec21 10 #include "SHA1.h"
coyotebush 4:1acb5d26ec21 11 #include "HMAC.h"
coyotebush 4:1acb5d26ec21 12
coyotebush 5:21e76b5af13b 13 #define TRIG_PIN A2
coyotebush 5:21e76b5af13b 14 #define ECHO_PIN A1
coyotebush 4:1acb5d26ec21 15 #define HTTP_ENDPOINT "http://trash.coreyford.name/sensor"
coyotebush 0:284e9c16e92d 16 #define SENSOR_NAME "Throop"
coyotebush 0:284e9c16e92d 17
coyotebush 2:ecc029c53752 18 #define CELLULAR_NETWORK 1
coyotebush 2:ecc029c53752 19
coyotebush 2:ecc029c53752 20 #ifdef CELLULAR_NETWORK
coyotebush 2:ecc029c53752 21 #include "MDM.h"
coyotebush 2:ecc029c53752 22 #define SIMPIN NULL
coyotebush 2:ecc029c53752 23 #define APN "Broadband"
coyotebush 2:ecc029c53752 24 #define USERNAME NULL
coyotebush 2:ecc029c53752 25 #define PASSWORD NULL
coyotebush 2:ecc029c53752 26 #else
coyotebush 2:ecc029c53752 27 #include "EthernetInterface.h"
coyotebush 2:ecc029c53752 28 #endif
coyotebush 0:284e9c16e92d 29
coyotebush 0:284e9c16e92d 30 int main()
coyotebush 4:1acb5d26ec21 31 {
coyotebush 4:1acb5d26ec21 32 char macAddress[6];
coyotebush 4:1acb5d26ec21 33 mbed_mac_address(macAddress);
coyotebush 4:1acb5d26ec21 34 printf("MAC address is %02X%02X%02X%02X%02X%02X\r\n", macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]);
coyotebush 4:1acb5d26ec21 35
coyotebush 7:49f2a1277737 36 Watchdog wdt;
coyotebush 7:49f2a1277737 37
coyotebush 3:1e5d19eb7c9a 38 GPSSerial gps;
coyotebush 3:1e5d19eb7c9a 39
coyotebush 2:ecc029c53752 40 #ifdef CELLULAR_NETWORK
coyotebush 2:ecc029c53752 41 MDMSerial mdm;
coyotebush 2:ecc029c53752 42 //mdm.setDebug(4);
coyotebush 2:ecc029c53752 43 if (!mdm.connect(SIMPIN, APN,USERNAME,PASSWORD))
coyotebush 2:ecc029c53752 44 return -1;
coyotebush 2:ecc029c53752 45 #else
coyotebush 2:ecc029c53752 46 EthernetInterface ethernet;
coyotebush 2:ecc029c53752 47 ethernet.init(); // DHCP
coyotebush 2:ecc029c53752 48 if (ethernet.connect() != 0)
coyotebush 2:ecc029c53752 49 return -1;
coyotebush 2:ecc029c53752 50 #endif
coyotebush 2:ecc029c53752 51 HTTPClient http;
coyotebush 2:ecc029c53752 52
coyotebush 6:43ac8ef67a03 53 bool first = true;
coyotebush 6:43ac8ef67a03 54
coyotebush 3:1e5d19eb7c9a 55 int gpsRet;
coyotebush 3:1e5d19eb7c9a 56 char gpsBuf[512];
coyotebush 3:1e5d19eb7c9a 57 double lat = 0, lon = 0;
coyotebush 3:1e5d19eb7c9a 58
coyotebush 0:284e9c16e92d 59 HCSR04 distS(TRIG_PIN, ECHO_PIN);
coyotebush 0:284e9c16e92d 60 double distV;
coyotebush 2:ecc029c53752 61 char str[512];
coyotebush 0:284e9c16e92d 62
coyotebush 5:21e76b5af13b 63 GroveTempSensor tempS;
coyotebush 5:21e76b5af13b 64 double tempV;
coyotebush 5:21e76b5af13b 65
coyotebush 7:49f2a1277737 66 wdt.kick(30.0);
coyotebush 7:49f2a1277737 67
coyotebush 0:284e9c16e92d 68 while (true) {
coyotebush 3:1e5d19eb7c9a 69 // Distance sensor
coyotebush 0:284e9c16e92d 70 distS.start();
coyotebush 0:284e9c16e92d 71 wait_ms(500);
coyotebush 0:284e9c16e92d 72 distV = distS.get_dist_cm();
coyotebush 4:1acb5d26ec21 73 printf("sensor reading: %0.2f\r\n", distV);
coyotebush 3:1e5d19eb7c9a 74
coyotebush 5:21e76b5af13b 75 // Temperature sensor
coyotebush 5:21e76b5af13b 76 tempV = tempS.getTemp();
coyotebush 5:21e76b5af13b 77
coyotebush 3:1e5d19eb7c9a 78 // GPS
coyotebush 3:1e5d19eb7c9a 79 printf("trying GPS\r\n");
coyotebush 3:1e5d19eb7c9a 80 while ((gpsRet = gps.getMessage(gpsBuf, sizeof(gpsBuf))) > 0)
coyotebush 3:1e5d19eb7c9a 81 {
coyotebush 3:1e5d19eb7c9a 82 int len = LENGTH(gpsRet);
coyotebush 3:1e5d19eb7c9a 83 char ch;
coyotebush 3:1e5d19eb7c9a 84 //printf("NMEA: %.*s\r\n", len-2, gpsBuf);
coyotebush 3:1e5d19eb7c9a 85 if ((PROTOCOL(gpsRet) == GPSParser::NMEA) && (len > 6)
coyotebush 3:1e5d19eb7c9a 86 && strncmp(gpsBuf, "$G", 2) == 0
coyotebush 3:1e5d19eb7c9a 87 && strncmp(gpsBuf + 3, "GLL", 3) == 0
coyotebush 3:1e5d19eb7c9a 88 && gps.getNmeaAngle(1,gpsBuf,len,lat)
coyotebush 3:1e5d19eb7c9a 89 && gps.getNmeaAngle(3,gpsBuf,len,lon)
coyotebush 3:1e5d19eb7c9a 90 && gps.getNmeaItem(6,gpsBuf,len,ch)
coyotebush 3:1e5d19eb7c9a 91 && ch == 'A')
coyotebush 3:1e5d19eb7c9a 92 {
coyotebush 3:1e5d19eb7c9a 93 printf("GPS Location: %.5f %.5f\r\n", lat, lon);
coyotebush 3:1e5d19eb7c9a 94 break;
coyotebush 3:1e5d19eb7c9a 95 }
coyotebush 3:1e5d19eb7c9a 96 }
coyotebush 7:49f2a1277737 97 wdt.kick();
coyotebush 0:284e9c16e92d 98
coyotebush 4:1acb5d26ec21 99 // Combine readings in JSON
coyotebush 4:1acb5d26ec21 100 char json[255];
coyotebush 5:21e76b5af13b 101 snprintf(json, 255,
coyotebush 6:43ac8ef67a03 102 "{\"distance\":%0.1f,\"temperature\":%0.1f,\"latitude\":%0.5f,\"longitude\":%0.5f,\"first\":%d}",
coyotebush 6:43ac8ef67a03 103 distV, tempV, lat, lon, first);
coyotebush 4:1acb5d26ec21 104
coyotebush 4:1acb5d26ec21 105 // Compute a MAC (message authentication code) of the value,
coyotebush 4:1acb5d26ec21 106 // using our MAC (media access control) address as a key.
coyotebush 4:1acb5d26ec21 107 // Yay acronyms.
coyotebush 4:1acb5d26ec21 108 SHA1 hasher;
coyotebush 4:1acb5d26ec21 109 HMAC hmacer(&hasher, (uint8_t *)macAddress, sizeof(macAddress));
coyotebush 4:1acb5d26ec21 110 hmacer.update((uint8_t *)json, strlen(json));
coyotebush 4:1acb5d26ec21 111 uint8_t hmac[20];
coyotebush 4:1acb5d26ec21 112 hmacer.finalize(hmac);
coyotebush 4:1acb5d26ec21 113 char hmacHex[41], *hmacHexPtr = hmacHex;
coyotebush 4:1acb5d26ec21 114 for (int i = 0; i < 20; i++)
coyotebush 4:1acb5d26ec21 115 hmacHexPtr += sprintf(hmacHexPtr, "%02X", hmac[i]);
coyotebush 4:1acb5d26ec21 116
coyotebush 0:284e9c16e92d 117 //POST data
coyotebush 0:284e9c16e92d 118 HTTPMap map;
coyotebush 0:284e9c16e92d 119 HTTPText inText(str, 512);
coyotebush 0:284e9c16e92d 120 map.put("name", SENSOR_NAME);
coyotebush 4:1acb5d26ec21 121 map.put("value", json);
coyotebush 4:1acb5d26ec21 122 map.put("mac", hmacHex);
coyotebush 0:284e9c16e92d 123 printf("\r\nTrying to post data...\r\n");
coyotebush 4:1acb5d26ec21 124 int ret = http.post(HTTP_ENDPOINT, map, &inText);
coyotebush 0:284e9c16e92d 125 if (!ret)
coyotebush 0:284e9c16e92d 126 {
coyotebush 0:284e9c16e92d 127 printf("Executed POST successfully - read %d characters\r\n", strlen(str));
coyotebush 0:284e9c16e92d 128 printf("Result: %s\r\n", str);
coyotebush 0:284e9c16e92d 129 }
coyotebush 0:284e9c16e92d 130 else
coyotebush 0:284e9c16e92d 131 {
coyotebush 0:284e9c16e92d 132 printf("Error - ret = %d - HTTP return code = %d\r\n", ret, http.getHTTPResponseCode());
coyotebush 0:284e9c16e92d 133 }
coyotebush 0:284e9c16e92d 134
coyotebush 6:43ac8ef67a03 135 first = false;
coyotebush 7:49f2a1277737 136 wdt.kick();
coyotebush 1:929b55ff96b0 137 wait_ms(10000);
coyotebush 7:49f2a1277737 138 wdt.kick();
coyotebush 0:284e9c16e92d 139 }
coyotebush 0:284e9c16e92d 140 }