first versione of ThingSpeak IOT library (not tested)

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;
+}