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:
Luminoscity
Date:
Sat Mar 19 19:20:07 2016 +0000
Revision:
10:313495291942
Parent:
9:ce77a3614cd7
Trying to get serial output to work on Mac/Windows

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