first versione of ThingSpeak IOT library (not tested)
Diff: thingspeak.cpp
- Revision:
- 0:92f5363c7790
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/thingspeak.cpp Fri Apr 04 13:44:43 2014 +0000 @@ -0,0 +1,361 @@ +/* ************************************************************************** + * + * + * + * + * ************************************************************************** + * FileName: thingspeak.c + * Dependencies: + * Module: + * Compiler: + * + * Author Rev. Date Comment + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Stefano Lai 1.0 03/27/2014 First release + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * Software License Agreement + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License (version 2) as published by + * the Free Software Foundation AND MODIFIED BY OpenPicus team. + * + * ***NOTE*** The exception to the GPL is included to allow you to distribute + * a combined work that includes OpenPicus code without being obliged to + * provide the source code for proprietary components outside of the OpenPicus + * code. + * OpenPicus software is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * + * Warranty + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT + * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT + * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * WE ARE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF + * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS + * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE + * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER + * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT + * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE. + * + **************************************************************************/ +#include "mbed.h" +#include "thingspeak.h" +#include "TCPSocketConnection.h" + +/**************************************************************************************** + * --- Global Parameters --- * + ***************************************************************************************/ + +//static TCP_SOCKET Socket; +//TCPSocketConnection ThingSock; + + + + +static int i; +static BOOL flagTCP=FALSE; +static BOOL flagTCPisCON=FALSE; +static int z = 0; +static int error = 0; + + /*------------------------------------------------------------------------------------- + | Function: WdataF(char* apikey, float value[], int nvalue) | + | Description: Function to write float data in a specific ThingSpeak database. | + | Returns: BYTE 0 - No error | + | 1 - TCPClientOpen error | + | Parameters: char* apikey - ThingSpeak write api key | + | | + | int* value - array with float data to send to ThingSpeak | + | | + | int nvalue - number of value elements | + -------------------------------------------------------------------------------------*/ + +int THINGSPEAK::wfTHINGSPEAK(char* apikey, float* value, int nvalue) +{ + error = 0; + char messageTS[nvalue*20]; + char bufferTS[20]; + TCPSocketConnection ThingSock; + flagTCP=0; + + for(i=0; i<nvalue;i++) + { + if(i==0) + { + sprintf(messageTS,"field%d=%2.1f", i+1, (double)value[i]); + } + else + { + sprintf(bufferTS,"&field%d=%2.1f", i+1, (double)value[i]); + strcat(messageTS,bufferTS); + } + + } + + char strPOST[195+(int)strlen(messageTS)]; + sprintf( strPOST, "POST /update HTTP/1.1\r\nHost: api.thingspeak.com\r\nConnection: close\r\nX-THINGSPEAKAPIKEY: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s", apikey, (int)strlen(messageTS), messageTS); + + while(flagTCP==FALSE) + { + if(z==5) + { + z=0; + flagTCP=TRUE; + error=1; + } + else + { + //Socket=TCPClientOpen ( IPThingSpeak, "80"); + //vTaskDelay(25); + //flagTCP=TCPisConn(Socket); + //flagTCPisCON=flagTCP; + //vTaskDelay(25); + //z++; + ThingSock.connect(IPThingSpeak, 80); + //ThingSock.connect(IPThingSpeak, 80); + flagTCP=ThingSock.is_connected(); + flagTCPisCON=flagTCP; + z++; + } + } + + if(flagTCPisCON==TRUE) + { + //TCPWrite ( Socket, strPOST, (int)strlen(strPOST) ); + //vTaskDelay(200); + //TCPClientClose ( Socket ); + //flagTCPisCON=FALSE; + + ThingSock.send_all(strPOST, (int)strlen(strPOST)); + ThingSock.close(); + flagTCPisCON=FALSE; + } + + return error; +} + + /*------------------------------------------------------------------------------------- + | Function: WdataI(char* apikey, int* value, int nvalue) | + | Description: Function to write integer data in a specific ThingSpeak database. | + | Returns: BYTE 0 - No error | + | 1 - TCPClientOpen error | + | Parameters: char* apikey - ThingSpeak write api key | + | | + | int* value - array with integer data to send to ThingSpeak | + | | + | int nvalue - number of value elements | + -------------------------------------------------------------------------------------*/ + +int THINGSPEAK::wiTHINGSPEAK(char* apikey, int* value, int nvalue) +{ + error = 0; + char messageTS[nvalue*20]; + char bufferTS[20]; + TCPSocketConnection ThingSock; + flagTCP=0; + + for(i=0; i<nvalue;i++) + { + if(i==0) + { + sprintf(messageTS,"field%d=%d", i+1, value[i]); + } + else + { + sprintf(bufferTS,"&field%d=%d", i+1, value[i]); + strcat(messageTS,bufferTS); + } + + } + + char strPOST[195+(int)strlen(messageTS)]; + sprintf( strPOST, "POST /update HTTP/1.1\r\nHost: api.thingspeak.com\r\nConnection: close\r\nX-THINGSPEAKAPIKEY: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s", apikey, (int)strlen(messageTS), messageTS); + + while(flagTCP==FALSE) + { + if(z==5) + { + z=0; + flagTCP=TRUE; + error=1; + } + else + { + //Socket=TCPClientOpen ( IPThingSpeak, "80"); + //vTaskDelay(25); + //flagTCP=TCPisConn(Socket); + //flagTCPisCON=flagTCP; + //vTaskDelay(25); + //z++; + ThingSock.connect(IPThingSpeak, 80); + flagTCP=ThingSock.is_connected(); + flagTCPisCON=flagTCP; + z++; + } + } + + if(flagTCPisCON==TRUE) + { + //TCPWrite ( Socket, strPOST, (int)strlen(strPOST) ); + //vTaskDelay(200); + //TCPClientClose ( Socket ); + //flagTCPisCON=FALSE; + ThingSock.send_all(strPOST, (int)strlen(strPOST)); + ThingSock.close(); + flagTCPisCON=FALSE; + } + + return error; +} + + /*------------------------------------------------------------------------------------- + | Function: thingHTTP(char* apikey, char* data) | + | Description: Function to use ThingHTTP APP. | + | Returns: BYTE 0 - No error | + | 1 - TCPClientOpen error | + | 2 - ThingSpeak response timeout | + | Parameters: char* apikey - ThingSpeak write api key | + | | + | char* data - pointer to the return data/string value from ThingSpeak| + -------------------------------------------------------------------------------------*/ + +int THINGSPEAK::thingHTTP(char* apikey, char* data) +{ + error = 0; + char strPOST[300]; + int size; + int flag = 0; + TCPSocketConnection ThingSock; + i=0; + flagTCP=0; + + sprintf( strPOST, "POST /apps/thinghttp/send_request HTTP/1.1\r\nHost: api.thingspeak.com\r\nConnection: close\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\napi_key=%s",8+(int)strlen(apikey), apikey); + + while(flagTCP==FALSE) + { + if(z==5) + { + z=0; + flagTCP=TRUE; + error=1; + } + else + { + //Socket=TCPClientOpen ( IPThingSpeak, "80"); + //vTaskDelay(25); + //flagTCP=TCPisConn(Socket); + //flagTCPisCON=flagTCP; + //vTaskDelay(25); + //z++; + ThingSock.connect(IPThingSpeak, 80); + flagTCP=ThingSock.is_connected(); + flagTCPisCON=flagTCP; + z++; + } + } + + if(flagTCPisCON==TRUE) + { + //TCPWrite ( Socket, strPOST, (int)strlen(strPOST) ); + ThingSock.send_all(strPOST, (int)strlen(strPOST)); + while( flag==0 ) + { + // size = TCPRxLen ( Socket ); + + if((int)size<=0) + { + i++; + // vTaskDelay(5); + if(i==100) + { + error=2; + break; + } + } + else + flag = 1; + } + if(flag==1) + { + char bufferTS[(int)size]; + + //TCPRead ( Socket, bufferTS, (int)size ); + + //vTaskDelay(100); + ThingSock.receive_all(bufferTS, (int)size); + + strcpy(data,bufferTS); + } + //TCPClientClose ( Socket ); + ThingSock.close(); + flagTCPisCON=FALSE; + } + return error; +} + /*----------------------------------------------------------------------------------------- + | Function: thingTWEET(char* apikey, char* message) | + | Description: Function to use ThingTWEET APP. | + | Returns: BYTE 0 - No error | + | 1 - TCPClientOpen error | + | Parameters: char* apikey - ThingSpeak TWEET api key | + | | + | char* message - message to send on Twitter to change status, you can | + | add some tag in this way: | + | message&lat=(your latitude)&long=(your longitude) | + | for available tags see this | + | https://dev.twitter.com/docs/api/1/post/statuses/update | + -----------------------------------------------------------------------------------------*/ + +int THINGSPEAK::thingTWEET(char* apikey, char* message) +{ + error = 0; + char strPOST[400]; + TCPSocketConnection ThingSock; + flagTCP=0; + + sprintf( strPOST, "POST /apps/thingtweet/1/statuses/update HTTP/1.1\r\nHost: api.thingspeak.com\r\nConnection: close\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\napi_key=%s&status=%s",8+(int)strlen(apikey)+(int)strlen(message), apikey, message); + + while(flagTCP==FALSE) + { + if(z==5) + { + z=0; + flagTCP=TRUE; + error=1; + } + else + { + //Socket=TCPClientOpen ( IPThingSpeak, "80"); + //vTaskDelay(25); + //flagTCP=TCPisConn(Socket); + //flagTCPisCON=flagTCP; + //vTaskDelay(25); + //z++; + ThingSock.connect(IPThingSpeak, 80); + flagTCP=ThingSock.is_connected(); + flagTCPisCON=flagTCP; + z++; + } + } + + if(flagTCPisCON==TRUE) + { + //TCPWrite ( Socket, strPOST, (int)strlen(strPOST) ); + //vTaskDelay(200); + //TCPClientClose ( Socket ); + //flagTCPisCON=FALSE; + ThingSock.send_all(strPOST, (int)strlen(strPOST)); + ThingSock.close(); + flagTCPisCON=FALSE; + } + + return error; +}