[SOLVED] Mbed NucleoL476 send data to Ubidots not working


#1

Hola

I’m trying to post data to Ubidots Cloud service (1 variable)
I’m using NucleoL476 and X-Nucleo-IDW01M1 wifi shield and nothing is udpated to Ubidots. When I try same command API with hurl.it, It working. Socket.recv() return -3001 ?

Here my terminal results:

IDW01M1 NetworkSocketAPI TCP Client Ubidots Example
Connecting to AP
Now connected
IP address is: 192.168.0.17
MAC address is: 00:80:E1:B7:C5:D8
things.ubidots.com resolved to: 50.23.124.68
Socket connected
{“value”: 2114}
POST /api/v1.6/variables/5997efbdc03f971ca757920a/values HTTP/1.1
Content-Type: application/json
Content-Length: 15
X-Auth-Token: A1E-B0I6Hzcqxxtl0ecHPOrApvvkoABQE8
Host: things.ubidots.com

{“value”: 2114}

Send data to Ubidots
Received -3001

Code is attached

Does my command API is correct ?
Thanks

Here my code:

#include "mbed.h"
#include "SpwfInterface.h"
#include "TCPSocket.h"
 
#define AP_SSID       "XXXX"
#define AP_PASSWORD   "XXXX"
#define AP_SECURITY   NSAPI_SECURITY_WPA2
                   
#define TOKEN         "A1E-B0I6Hzcqxxtl0ecHPOrApvvkoABQE8"
#define LABEL_DEVICE  "my-test-device"
#define VARID_LUX     "5997efbdc03f971ca757920a"        // Variables temperature id

// NUCLEO: D8->UART1_TX (PA_9), D2->UART1_RX (PA_10)
SpwfSAInterface spwf(D8, D2, false);
Serial pc(USBTX, USBRX);
AnalogIn myLux(PC_3);
DigitalOut myled(LED1);

 
int main()
{
    int errConnect, errRcv = 0;
    char str[50] = "";
    char http_cmd[1000] = "";
    char buffer[2048] = "";
    
    pc.baud(115200);
    
    pc.printf("IDW01M1 NetworkSocketAPI TCP Client Ubidots Example\r\n");
    pc.printf("Connecting to AP\r\n");
    
    /* Connect to wifi acces point */    
    if(spwf.connect(AP_SSID, AP_PASSWORD, NSAPI_SECURITY_WPA2)) {      
        pc.printf("Now connected\r\n");
    } else {
        pc.printf("Error connecting to AP.\r\n");
        return -1;
    }   
            
    /* Get and print network connection parameters ip and mac adress */   
    const char *ip = spwf.get_ip_address();
    const char *mac = spwf.get_mac_address();
    pc.printf("IP address is: %s\r\n", ip ? ip : "No IP");
    pc.printf("MAC address is: %s\r\n", mac ? mac : "No MAC");
 
    /* Create a SocketAdress from Ubidots Hostname and port TCP 80 */
    SocketAddress addr(&spwf, "things.ubidots.com", 80);
    pc.printf("things.ubidots.com resolved to: %s\r\n", addr.get_ip_address());
    
    /* Create, Open a socket on specified stack */ 
    TCPSocket socket(&spwf);
    socket.set_timeout(1000);   // Set Block Mode.
    errConnect = socket.connect("things.ubidots.com", 80);
    
    /* Check connection status */
    while (true) {
        if(errConnect != 0) {
            pc.printf("Could not connect to socket : error = %d\r\n", errConnect);
            errConnect = socket.connect("things.ubidots.com", 80);
            // TODO Manage connection issues here !!!!
        } else {
            pc.printf("Socket connected\r\n");
            break;
        }
    }
    
    sprintf((char *)str, "{\"value\": %d}", (int)(myLux.read()*10000));
    printf("%s\r\n", str);
    int len = strlen((char *)str);
    
    sprintf((char *)http_cmd,"POST /api/v1.6/variables/%s/values HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: %d\r\nX-Auth-Token: %s\r\nHost: things.ubidots.com\r\n\r\n%s\r\n\r\n",
    VARID_LUX,len, TOKEN, str);
    
    pc.printf("Send data to Ubidots\r\n");
    socket.send((char *)http_cmd, sizeof((char *)http_cmd));
       
    errRcv = socket.recv(buffer, sizeof(buffer));
    pc.printf("Received %d\r\n", errRcv); 
    pc.printf("%s",buffer);
    wait(5);
    
    socket.close();
    spwf.disconnect();
    
    pc.printf("Done\r\n");
 
}

#2

Greetings, unfortunately we do not have a library for that shield. Looking into your issue, if your request works properly at hurl.it the issue may be at your hardware side. I advice you to test first the HTTP POST examples provided by the manufacturer for your shield, once you understand and make to work them try to send data to Ubidots.

Also, here you can find two standard code snippets to send data to Ubidots, you may adapt it to your needs:

Also, you may send data through TCP or UDP instead of making POST requests, to do that please refer to the article below:

Regards


#3

Hello,

Thanks for your support and sorry for this late response.

I have since solved my problem of posting data on Ubidots with a NucleoL476RG and a Shield Wifi X-Nucleo-IDW01M1.
Indeed my problem was that I did not configure the TCPSocket correctly.
Now it works correctly.
I will soon publish a tutorial with the Mbed ARM source code .
Can I share it to you so that you can add it on site https://ubidots.com/docs/devices/#verse-technology?

Thank you
Romain


#4

Thank you for your feedback @rreicher, I am glad to know that you made it to work properly. I will ask you gently, if possible, to share your code with the community for future references as well.

About your tutorial, please once it is finished send us the link to check it, we would happy to give you free credits also because of it :slight_smile:

Regards


#5

Hi jotathebest,

Here the hardware ressources used.

  1. NucleoL476RG

  2. X-Nucleo-IDW01M1

And the MBED code.

/*
	Copyright (C) 2017 romain reicher

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program 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.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    About 
    ---------------------------------------------------------------------

	Send sensors value to Ubidots.
	This example sends 3 variables to Ubidots.
		- STM32L476 VBAT/3 internal channel in mV
		- STM32L476 Internal Temperature Sensor in °C
		- The status of onboard User Button (blue) on NucleoL476RG 
	Use NucleoL476RG with X-Nucleo-IDW01M1v2 wifi shield
 
	Important note: Some IDW01M1 wifi shield had resistor R21 mounted
					which interfere with STLink/SWD programmer.
 					Please unmount R21 to fix it.
 
    romain reicher
    Date     :	20/09/2017
    Revision :  v0.1  
*/


#include "mbed.h"
#include "SpwfInterface.h"  
#include "TCPSocket.h"

/* Wifi Acces Point Settings */ 
#define AP_SSID         "YOUR_WIFI_SSID"			
#define AP_PASSWORD     "YOUR_WIFI_PASSWORD"
#define UBIDOTS_SERVER  "things.ubidots.com"
#define UBIDOTS_PORT    80
#define UBIDOTS_TOKEN   "YOUR_UBIDOTS_TOKEN"
#define UBIDOTS_DEVICE  "YOUR_UBIDOTS_LABEL_DEVICE"

/* Communication ressources */
SpwfSAInterface spwf(D8, D2, false);    
Serial pc(USBTX, USBRX);

/* Digital ressources */
DigitalOut myLed(LED1);
DigitalIn myButton(USER_BUTTON);

/* Analog ressources */
AnalogIn adc_vbat(ADC_VBAT);    // VBAT / 3 internal to ADC channel
AnalogIn adc_temp(ADC_TEMP);    // Internal Temp Sensor to ADC Channel

/* Global variables */
float temp = adc_temp.read() * 100;		// Converted in °C
float batt = adc_vbat.read() * 30000;   // Converted in mV  
bool level = false;

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main() 
{
    /* Configure Serial baud rate */
    pc.baud(115200);
    
	/* Update level variable state depending USER_BUTTON state */
    if (myButton == 0)
        level = true;
    else
        level = false;
    
    TCPSocket socket(&spwf);
    char sendBuffer[256];
    char message[64];
    int err;
	
    /* ######################## WIFI CONNECTION ######################## */

    pc.printf("IDW01M1 NetworkSocketAPI TCP Client Ubidots\r\n");
    pc.printf("Connecting to AP\r\n");
    
    //* Connect to wifi acces point */    
    if(spwf.connect(AP_SSID, AP_PASSWORD, NSAPI_SECURITY_WPA2)) 
    {      
        pc.printf("Now connected\r\n");
    } 
    else
    {
        pc.printf("Error connecting to AP.\r\n");
        return -1;
    }   
    
    /* #################### GET CONNECTION INFOS ######################## */
    
    /* Get and print network connection parameters ip and mac adress */   
    const char *ip = spwf.get_ip_address();
    const char *mac = spwf.get_mac_address();    

    pc.printf("IP address is: %s\r\n", ip ? ip : "No IP");
    pc.printf("MAC address is: %s\r\n", mac ? mac : "No MAC");
    
    /* ##################### UBIDOATS SEND DATA ######################### */

    printf("Sending HTTP Data to Ubidots...\r\n");
 
    /* Open a socket , create a TCP connection to Ubidots */
    err = socket.connect(UBIDOTS_SERVER, UBIDOTS_PORT); 
    if (err!=0) 
    {
      pc.printf("\r\nCould not connect to Socket, err = %d!!\r\n", err); 
      return -1;
    } 
    else 
        pc.printf("\r\nconnected to host server\r\n"); 
    
    /* Construct content of HTTP command */
    sprintf(message, "{\"temperature\": %0.2f, \"battery\": %0.2f, \"level\": %d}", temp, batt, (int)level);
    printf("Content Length = %d\r\n", (int)strlen(message));
    
    /* Construct HTTP command to send */
    sprintf(sendBuffer, "POST /api/v1.6/devices/%s/?token=%s HTTP/1.1\r\nHost: things.ubidots.com\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n%s", UBIDOTS_DEVICE, UBIDOTS_TOKEN, (int)strlen(message),message); 
    pc.printf("HTTP command %s\r\n", sendBuffer);
    wait(2.0);
     
    /* Send http request to Ubidots */ 
    int scount = socket.send(sendBuffer, (int)strlen(sendBuffer));
    printf("sent %d [%.*s]\r\n", scount, strstr(sendBuffer, "\r\n") - sendBuffer, sendBuffer);

    /* Receive a simple http response and print out the response line */
    char respBuffer[64];
    int rcount = socket.recv(respBuffer, sizeof respBuffer);
    printf("recv %d [%.*s]\r\n", rcount, strstr(respBuffer, "\r\n") - respBuffer, respBuffer);

    /* Close the socket to return its memory and bring down the network interface */
    pc.printf("Close Socket\r\n");
    socket.close();
    
    /* Disconnect */
    pc.printf("Disconnect Wifi\r\n");
    spwf.disconnect();
    wait(1.0);
    pc.printf("Done\r\n");

    myLed = 0;
        
    while(1) 
    {
		myLed = !myLed;
		wait(1.0);
    }
}

best regards