first versione of ThingSpeak IOT library (not tested)

thingspeak.cpp

Committer:
mbedakhela
Date:
2014-04-04
Revision:
0:92f5363c7790

File content as of revision 0:92f5363c7790:

/* **************************************************************************                                                                                   
 *                                
 *                                                           
 * 
 *            
 * **************************************************************************
 *  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;
}