discof746 ethernet+lcd+ts2
Dependents: grove_stream_jpa_sd2 grove_stream_jpa_sd2 grove_stream_jpa_sd2-2 grove_stream_jpa_sd2-3
Diff: GroveStreams.cpp
- Revision:
- 0:8b675b2726b7
- Child:
- 1:e69854e65c88
diff -r 000000000000 -r 8b675b2726b7 GroveStreams.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GroveStreams.cpp Thu Jan 05 18:39:43 2017 +0000 @@ -0,0 +1,200 @@ +/* + GroveStreams is a helper class to assist with pushing data into the + GroveStreams.com IoT platform. + + License: + Copyright (C) 2017 GroveStreams LLC. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "GroveStreams.h" + +GroveStreams::GroveStreams(const char* apiKey, LcdDiscoF746NgTracer* pLcd) +{ + init(apiKey, pLcd); +} + +GroveStreams::GroveStreams(const char* apiKey) +{ + init(apiKey, NULL); +} + +GroveStreams::~GroveStreams() { + _eth.disconnect(); +} + +int GroveStreams::init(const char* apiKey, LcdDiscoF746NgTracer* pLcd) +{ + _domain = "grovestreams.com"; + _port = 80; + _apiKey = apiKey; + _myIPAddress = NULL; //Don't Change. Set below from DHCP. Needed by GroveStreams to verify that a device is not uploading more than once every 10s. + _pLcd = pLcd; + + return startEthernet(); +} + +void GroveStreams::printf(const char* format, ...) +{ + + va_list args; + va_start(args, format); + + if (_pLcd != NULL) { + char sbuffer[512]; + vsprintf(sbuffer, format, args); + _pLcd->println(sbuffer); + } else { + vprintf(format, args); + } + + va_end(args); +} + +unsigned long GroveStreams::send(const char* componentId, const char* samples) +{ + char resultBuffer[256]= {0}; + return send(componentId, samples, NULL, NULL, resultBuffer, sizeof resultBuffer); +} + +unsigned long GroveStreams::send(const char* componentId, const char* samples, char* resultBuffer, size_t resultBufferSize) +{ + return send(componentId, samples, NULL, NULL, resultBuffer, resultBufferSize); +} + +unsigned long GroveStreams::send(const char* componentId, const char* samples, const char* componentName, + const char* compTmplId, char* resultBuffer, size_t resultBufferSize) +{ + int failedCounter = 0; + int result = 1; + + while (failedCounter < 3 && result != 0) { + + result = sendNoRetry(componentId, samples, componentName, compTmplId, resultBuffer, resultBufferSize); + + this->printf("send result code: %d", result); + + if (result != 0) { + //Wait and try again + failedCounter++; + this->printf("send failed %d times", failedCounter); + wait(2); + } + + if (failedCounter > 3 ) { + this->printf("Too many failures. Restarting Ethernet."); + startEthernet(); + } + } + + return result; +} + +unsigned long GroveStreams::sendNoRetry(const char* componentId, const char* samples, const char* componentName, + const char* compTmplId, char* resultBuffer, size_t resultBufferSize) +{ + //Assemble the url that is used to pass the temperature readings to GroveStreams and call it + + network::tcp::Socket socket; + + int openResult = socket.open(); + if (openResult == 0) { + + int connResult = socket.connect(_domain, _port); + if(connResult == 0) { + + char compNamePart[100] = {0}; + if (strlen(componentName) > 0) { + sprintf(compNamePart, "&compName=%s",componentName); + } + + char compTmplIdPart[100] = {0}; + if (strlen(compTmplId) > 0) { + sprintf(compTmplIdPart, "&compTmplId=%s",compTmplId); + } + + //You may need to increase the size of sbuffer if any other char array sizes have increased + char sbuffer[512]= {0}; + + sprintf(sbuffer, "PUT /api/feed?compId=%s%s%s&api_key=%s%s HTTP/1.1\r\nHost: \r\nConnection: close\r\nX-Forwarded-For:%s\r\n\r\n", + componentId, compTmplIdPart, compNamePart, _apiKey, samples, _myIPAddress); + + this->printf("send sbuffer size: %d", strlen(sbuffer)); + + int scount = socket.write(sbuffer, strlen(sbuffer)); + this->printf("sent %d bytes: [%.*s]", scount, strstr(sbuffer, "\r\n")-sbuffer, sbuffer); + + //Read status line + + int rcount = socket.read(resultBuffer, resultBufferSize); + + this->printf("HTTP Response size: %d bytes", rcount); + this->printf("HTTP Response Status:[%.*s]", strstr(resultBuffer, "\r\n")-resultBuffer, resultBuffer); + + //Only return the body + strcpy(resultBuffer, strstr(resultBuffer, "\r\n\r\n") + strlen("\r\n\r\n")); + strcat(resultBuffer, "\0"); + this->printf("HTTP Body: [%s]", resultBuffer); + + socket.close(); + } else { + + this->printf("Socket Connect Failed: %d", connResult); + } + + } else { + this->printf("Socket Open Failed: %d", openResult); + socket.close(); + return 1; + } + + return 0; +} + + +int GroveStreams::startEthernet() +{ + //Start or restart the Ethernet connection. + int result = _eth.disconnect(); + if (result != 0) { + this->printf("Ethernet diconnect Failed: %d", result); + return result; + } + + this->printf("Connecting STM32 to network..."); + + //Connect to the network and obtain an IP address using DHCP + result = _eth.init(); + if (result != 0) { + this->printf("Ethernet init Failed: %d", result); + return result; + } + + result = _eth.connect(); + if (result != 0) { + this->printf("Ethernet connect Failed: %d", result); + return result; + } else { + this->printf("STM32 connected to network"); + + //Set the mac and ip variables so that they can be used during sensor uploads later + _myIPAddress = _eth.getIPAddress(); + + this->printf("IP address: %s", _myIPAddress ? _myIPAddress : "No IP"); + } + + return 0; +} + +const char* GroveStreams::getMACAddress() +{ + return _eth.getMACAddress(); +}