discof746 ethernet+lcd+ts2
Dependents: grove_stream_jpa_sd2 grove_stream_jpa_sd2 grove_stream_jpa_sd2-2 grove_stream_jpa_sd2-3
GroveStreams.cpp
- Committer:
- 38domo
- Date:
- 2021-01-13
- Revision:
- 3:494da6893902
- Parent:
- 2:b77ba7f2611b
File content as of revision 3:494da6893902:
/* GroveStreams is a helper class to assist with pushing data into the GroveStreams.com IoT platform. */ #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(); } extern char gsStreamIPdatas[]; static char* _domain; int GroveStreams::init(const char* apiKey, LcdDiscoF746NgTracer* pLcd) { _domain = gsStreamIPdatas; _port = 1880; _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::sendJPA(const char* componentId, const char* samples) { char resultBuffer[256]= {0}; return sendJPA(componentId, samples, NULL, NULL, resultBuffer, sizeof resultBuffer); } unsigned long GroveStreams::sendInitDatasJPA(const char* componentId, const char* samples) { char resultBuffer[256]= {0}; return sendInitDatasJPA(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::sendJPA(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 = sendNoRetryJPA(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::sendInitDatasJPA(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 = sendNoRetryInitDatasJPA(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 /stm32/datas?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; } unsigned long GroveStreams::sendNoRetryJPA(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 /stm32/touches?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; } unsigned long GroveStreams::sendNoRetryInitDatasJPA(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) { //printf("\nConnect to socket : %s\n",_domain); 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 /stm32/init?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(); }