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

main.cpp

Committer:
coyotebush
Date:
2015-05-28
Revision:
4:1acb5d26ec21
Parent:
3:1e5d19eb7c9a
Child:
5:21e76b5af13b

File content as of revision 4:1acb5d26ec21:

#include "mbed.h"
#include "HTTPClient.h"

#include "hcsr04.h"
#include "GPS.h"

#include "SHA1.h"
#include "HMAC.h"

#define TRIG_PIN D6
#define ECHO_PIN D5
#define HTTP_ENDPOINT "http://trash.coreyford.name/sensor"
#define SENSOR_NAME "Throop"

#define CELLULAR_NETWORK 1

#ifdef CELLULAR_NETWORK
#include "MDM.h"
#define SIMPIN      NULL
#define APN         "Broadband"
#define USERNAME    NULL
#define PASSWORD    NULL 
#else
#include "EthernetInterface.h"
#endif

int main() 
{
    char macAddress[6];
    mbed_mac_address(macAddress);
    printf("MAC address is %02X%02X%02X%02X%02X%02X\r\n", macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]);
    
    GPSSerial gps;

#ifdef CELLULAR_NETWORK
    MDMSerial mdm;
    //mdm.setDebug(4);
    if (!mdm.connect(SIMPIN, APN,USERNAME,PASSWORD))
        return -1;
#else
    EthernetInterface ethernet;
    ethernet.init(); // DHCP
    if (ethernet.connect() != 0)
        return -1;
#endif
    HTTPClient http;
    
    int gpsRet;
    char gpsBuf[512];
    double lat = 0, lon = 0;
    
    HCSR04 distS(TRIG_PIN, ECHO_PIN);
    double distV;
    char str[512];
    
    while (true) {
        // Distance sensor
        distS.start();
        wait_ms(500); 
        distV = distS.get_dist_cm();
        printf("sensor reading: %0.2f\r\n", distV);
        
        // GPS
        printf("trying GPS\r\n");
        while ((gpsRet = gps.getMessage(gpsBuf, sizeof(gpsBuf))) > 0)
        {
            int len = LENGTH(gpsRet);
            char ch;
            //printf("NMEA: %.*s\r\n", len-2, gpsBuf); 
            if ((PROTOCOL(gpsRet) == GPSParser::NMEA) && (len > 6)
             && strncmp(gpsBuf, "$G", 2) == 0
             && strncmp(gpsBuf + 3, "GLL", 3) == 0
             && gps.getNmeaAngle(1,gpsBuf,len,lat)
             && gps.getNmeaAngle(3,gpsBuf,len,lon)
             && gps.getNmeaItem(6,gpsBuf,len,ch)
             && ch == 'A')
            {
                printf("GPS Location: %.5f %.5f\r\n", lat, lon);
                break;
            }
        }
        
        // Combine readings in JSON
        char json[255];
        snprintf(json, 255, "{\"distance\":%0.1f,\"latitude\":%0.5f,\"longitude\":%0.5f}", distV, lat, lon);
           
        // Compute a MAC (message authentication code) of the value,
        // using our MAC (media access control) address as a key.
        // Yay acronyms.
        SHA1 hasher;
        HMAC hmacer(&hasher, (uint8_t *)macAddress, sizeof(macAddress));
        hmacer.update((uint8_t *)json, strlen(json));
        uint8_t hmac[20];
        hmacer.finalize(hmac);
        char hmacHex[41], *hmacHexPtr = hmacHex;
        for (int i = 0; i < 20; i++)
            hmacHexPtr += sprintf(hmacHexPtr, "%02X", hmac[i]);
        
        //POST data
        HTTPMap map;
        HTTPText inText(str, 512);
        map.put("name", SENSOR_NAME);
        map.put("value", json);
        map.put("mac", hmacHex);
        printf("\r\nTrying to post data...\r\n");
        int ret = http.post(HTTP_ENDPOINT, map, &inText);
        if (!ret)
        {
          printf("Executed POST successfully - read %d characters\r\n", strlen(str));
          printf("Result: %s\r\n", str);
        }
        else
        {
          printf("Error - ret = %d - HTTP return code = %d\r\n", ret, http.getHTTPResponseCode());
        }
        
        wait_ms(10000);
    }
}