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 May 28 05:13:22 2015 +0000
Revision:
5:21e76b5af13b
Parent:
4:1acb5d26ec21
Child:
6:43ac8ef67a03
Add temperature sensor

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