[SOLVED] ChipKIT Max32 con Digilent WiFi Shield

Continuing the discussion from Arduino leonardo no envia datos a Ubidots:

Hola @betomax

Puede ser que el programa no esté recibiendo separación entre el HTTP Header y el HTTP Body, la cual debe ser una línea, para que quede así:

POST /api/v1.6/variables/xxxxxxxxxxx_,myvarID/values HTTP/1.1
Content-Type: application/json
Content-Length: 13
X-Auth-Token: xxxxx_mytoken
Host: things.ubidots.com

{“value”:903}

Has intentado enviar el body dentro de ésta línea?:

client.println("POST /api/v1.6/variables/"+idvariable+"/values HTTP/1.1\nContent-Type: application/json\nContent-Length: "+String(num)+"\nX-Auth-Token: "+token+"\nHost: things.ubidots.com\n\n"+body+"\n\n);

Gracias por el tip, agregue un nuevo salto de linea “\n”, la replica es como sigue:

POST /api/v1.6/variables/my_dot/values HTTP/1.1
Content-Type: application/json
Content-Length: 13
X-Auth-Token: my_token
Host: things.ubidots.com

{“value”:955}

aun no logro que Ubidots guarde nada, ahora estoy imprimiendo la respuesta del server, es como sigue:

HTTP/1.1 400 Bad Request
Server: nginx
Date: Wed, 25 Mar 2015 02:35:17 GMT
Content-Type: text/html
Content-Length: 166
Connection: close

400 Bad Request

400 Bad Request


nginx

alguna idea? gracias de antemano

Hola @betomax el problema que veo es que estás usando client.println y adicionando al final dos (2) “\n” el println agrega por si solo al final del string un \n, entonces debes cambiar en client.println por un client.print o quitar un \n al final si usas client.println

Saludos.

Gracias Woakas, anteriormente me habian comentado que entre los headers y el body [Value] deberia haber doble “\n”, entonces lo quito?

este es la parte del codigo, [Ejemplos TCP+Client+Arduino+Ethernet], tal cual estoy usando.

         Serial.println("Connected to ubidots");
         client.println("POST /api/v1.6/variables/"+idPot+"/values HTTP/1.1"); //delay(100);
         Serial.println("POST /api/v1.6/variables/"+idPot+"/values HTTP/1.1");        
         client.println("Content-Type: application/json");//delay(100);
         Serial.println("Content-Type: application/json");         
         client.print("Content-Length: "+String(num)+"\n");//delay(100);
         Serial.print("Content-Length: "+String(num)+"\n");         
         client.print("X-Auth-Token: "+token+"\n");//delay(100);
         Serial.print("X-Auth-Token: "+token+"\n");         
         client.println("Host: things.ubidots.com");//delay(100);
         Serial.println("Host: things.ubidots.com");       
         client.print("\n\n"+var+"\n");//delay(100);
         client.println();
         Serial.println("\n\n"+var+"\n\n");

Hola @betomax no es que lo debas quitar sino que cuando usas println adiciona un \n fuera de lo que tengas en el string. por consiguiente el programa debería quedar:

     Serial.println("Connected to ubidots");
     client.println("POST /api/v1.6/variables/"+idPot+"/values HTTP/1.1");
     client.println("Content-Type: application/json");
     client.println("Content-Length: "+String(num)");
     client.println("X-Auth-Token: "+token");
     client.println("Host: things.ubidots.com");
     client.print("\n"+var+"\n");

Gracias,efectivamente era tema de manejo de separacion de lineas “’\n” usando un TCP Cliente estandar, y quitando y poniendo lineas al fin obtuve el valor de retorno 201

Gracias !

2 Likes

Hola a Todos. Estoy usando el codigo de muestra de Ubidots para enviar el valor a la variable pero no la envía. Tampoco me muestra la respuesta del REQUEST para saber cual es el valor de retorno y saber que está pasando.

Adjunto el codigo con algunas modificaciones.

Si alguien puede ayudarme se lo agradecería.

Saludos.

code_PostValue.txt (3.4 KB)

Actualización.

Plataforma: Arduino Uno con Ethernet Shield W5100

Buenas tardes

Después de varias pruebas. Para encontrar el error. Configuré manualmente el dispositivo asignándole IP, GateWay, DNS, y subnet. Ejecutando nuevamente el código se muestra en el monitor el Bad Request 400 pero de una manera poco usual. Al parecer cada que se llama a la funcion Save_value() el dsipositivo intenta conectarse, se conecta y se desnocneta de inmediato causando el conection failed e inprimiendo por cada ciclo los caracteres que responde el servidor de Ubidots.

Adjunto una imagen que muestra la respuesta.

Muchas gracias por su atención.

PD1: No he podido hacer que me Imprima el request en el monitor de una sola ocación.
PD2: No he podido enviar el valor de mi variable por POST.
PD3: Adjunto codigo de muestra con las modificaciones realizadas.

 /*
    Web client

    This sketch connects to a website using an Arduino Wiznet Ethernet shield.

    Circuit:
    * Ethernet shield attached to pins 10, 11, 12, 13

    created 18 Dec 2009
    modified 9 Apr 2012
    by David A. Mellis
    modified 15 Jan 2015
    by Mateo Velez for Ubidots, Inc.

    */

   #include <SPI.h>
   #include <Ethernet.h>
  

   // Enter a MAC address for your controller below.
   // Newer Ethernet shields have a MAC address printed on a sticker on the shield
   byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
   byte ip[]={192, 168, 1, 2};
   byte gw [] = {192, 168, 1, 254};
   byte dns_[] = {200, 13, 249, 101};
   byte subnet_[] = {255, 255, 255, 0};


   // Initialize the Ethernet client library
   // with the IP address and port of the server
   // that you want to connect to (port 80 is default for HTTP):
   EthernetClient client;

   String idvariable = "55565d0d7625423f7d3b7d5a";
   String token = "D7wHWtSAwAi3cSp5RVoFecZXAZzm7ylO7ytx1YqOHWeTzgEpwWofMVlmd3uy";


   void setup() {
    // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
       ; // wait for serial port to connect. Needed for Leonardo only
     }

     // start the Ethernet connection:
    
     if (Ethernet.begin(mac)==0) {
       Serial.println("Failed to configure Ethernet using DHCP");
       // Configuarion de red manual. 
       Serial.println("Configuring with static IP:"+String(ip[0])+" and GateWay:"+String(gw[1])+"\n");
       Ethernet.begin(mac, ip, dns_, gw, subnet_);
       }
     // give the Ethernet shield a second to initialize:
     delay(2000);
     Serial.println("connecting...");
     }

   void loop()
   {
     int value = analogRead(A0);
     save_value(String(value));
 
   }

   void save_value(String value)
   {
       // if you get a connection, report back via serial:
       int num=0;
       String var = "{\"value\":"+ String(value) + "}";
       num = var.length();
       delay(2000);
       if(client.connect("things.ubidots.com", 80)) 
            {
              Serial.println("connected");
         //Linea de codigo oroginal. 
         /*client.println("POST api/v1.6/variables/"+idvariable+"/values HTTPS/1.1\nContent-Type: application/json\nContent-Length: "+String(num)+"\nX-Auth-Token: "+token+"\nHost: things.ubidots.com\n");
        // En el codigo original fala agregar el valor de la variable. 
         client.println("\n"+var+"\n");*/

         // Lineas modificadas de acuerdo a varios post de soporte en ubidots. 
         
              client.println("POST/api/v1.6/variables/"+idvariable+"/values HTTP/1.1");
              Serial.println("POST/api/v1.6/variables/"+idvariable+"/values HTTP/1.1");
              client.println("Content-Type: application/json");
              Serial.println("Content-Type: application/json");
              client.println("Content-Length: "+String(num));
              Serial.println("Content-Length: "+String(num));
              client.println("X-Auth-Token: "+token);
              Serial.println("X-Auth-Token: "+token);
              client.println("Host: things.ubidots.com\n");
              Serial.println("Host: things.ubidots.com\n");
              client.print(var);
              Serial.print(var+"\n");
            }
       else 
            {
            // if you didn't get a connection to the server:
            Serial.println("connection failed");
            }
            
       if (!client.connected()) 
          {
          Serial.println();
          Serial.println("disconnecting.");
          client.stop();
            // do nothing forevermore:
          for(;;);
          }
          
       if (client.available()) 
          {
          char c = client.read();
          Serial.print(c);
          }
         }

cambia eso por esto:

client.println(var);
client.println();

Saludos,
Metavix