Go Down

Topic: [SOLUCIONADO] Servicio de hosting no atiende petición GET desde arduino (Read 4609 times) previous topic - next topic

chronos682

Buen día a todos, tengo un arduino leonardo con ethernet shield el cual se conecta a una página php y por get envía comandos para guardarlos en la BD. Tengo instalado un servidor wamp y en localhost todo funciona perfecto, el arduino se conecta como cliente a la página en php en el servidor local y se guardan los datos adecuadamente. Pero luego subo la página php a un servidor en godaddy y al intentar conectarme no envía nada. Mi pregunta es cómo tengo que configurar el router para que permita la conexión del arduino a una página web externa. De antemano gracias por responder.

templaries

Comprueba que valor devuelve cliente.connect, si es lo que usas para conectar a tu servidor web y te dará pistas de lo que pasa.

https://www.arduino.cc/en/Reference/ClientConnect

Returns

Returns an int (1,-1,-2,-3,-4) indicating connection status :

SUCCESS 1
TIMED_OUT -1
INVALID_SERVER -2
TRUNCATED -3
INVALID_RESPONSE -4

surbyte

Tienes que hacer un port foward a la dirección del arduino.
Busca en tu router Port Foward y asignas la ip de tu arduino la repites si te pide entrante saliente y luego el puerto que usas. Muy importante.
Entonces todo lo que salga/entre será redireccionado a tu arduino desde la ip pública.

chronos682

Muchas gracias por responder. Voy a ver ambas cosas y les cuento.

chronos682

Comprueba que valor devuelve cliente.connect, si es lo que usas para conectar a tu servidor web y te dará pistas de lo que pasa.

https://www.arduino.cc/en/Reference/ClientConnect

Returns

Returns an int (1,-1,-2,-3,-4) indicating connection status :

SUCCESS 1
TIMED_OUT -1
INVALID_SERVER -2
TRUNCATED -3
INVALID_RESPONSE -4
Devuelve 1 como si la conexión fuera exitosa.

chronos682

Tienes que hacer un port foward a la dirección del arduino.
Busca en tu router Port Foward y asignas la ip de tu arduino la repites si te pide entrante saliente y luego el puerto que usas. Muy importante.
Entonces todo lo que salga/entre será redireccionado a tu arduino desde la ip pública.

Ya tengo abierto el puerto 80 para que entre y salga información ya que los valores de los sensores llega desde una ubicación remota a través de la ip pública y por el puerto 80 se redirige la información a la ip del arduino. Al parametro server le estoy pasando la url porque el servidor web no me proporciona una ip dedicada sino es una ip común para todos los sites alojados en ese servidor. Sigue sin funcionar. Ya no sé que más hacerle. Cuando veo lo que me retorna la página luego de hacer el GET solo dice pageok.

templaries

Lo mejor es pegues el codigo que hace la conexion, si devuelve 1 es que ha conectado con el servidor.

noter

Hola.
No es necesario abrir puertos en tu router, pues tu arduino está funcionando como cliente. Lo más probable es que tu problema no sea tanto de conexión como de protocolo. El servidor de godaddy será mas refinado que tu servidor wamp, y exigirá más cabeceras en la petición GET. Hace bastante tiempo ayudé a solventar algo similar, aunque ahora mismo no lo localizo. Busca de momento información relacionada con headers http.

chronos682

Este es el código que estoy utilizando:

Code: [Select]

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

byte mac[] = {  0x90, 0xA2, 0xDA, 0x0D, 0x4E, 0xD9 }; // MAC de la tarjeta ethernet shield
byte ip[] = { 192,168,1,15 }; // Direccion ip local
char server[] = "http://www.jm2arquitectura.com";
EthernetClient client;
char buffer[200];
int hpapiros=1;
int hvariados=2;
int hornamental=3;
int hcitricos=4;
int htemperatura=5;
int hlluvia=6;

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip); // inicializa ethernet shield
  delay(1000); // espera 1 segundo despues de inicializar
}

void loop()
{

  Serial.println("Conectando..");

  if (client.connect(server, 80)) {  // Se conecta al servidor
    sprintf(buffer,"GET /riego/index.php?action=1&papiros=%d&variados=%d&ornamental=%d&citricos=%d&temp=%d&lluvia=%d",hpapiros,hvariados,hornamental,hcitricos,htemperatura,hlluvia);
client.println(buffer);
client.println("HTTP/1.0");
   
    Serial.println("Conexion exitosa");
  }
  else
  {
    Serial.println("Falla en la conexion");
  }
  if (client.connected()) {
client.stop();
client.flush();
Serial.println("Desconectado");
  }
  else
  {
Serial.println("Desconectado");
  }
  delay(5000);
}



En localhost funciona de maravillas. Y noter gracias por responder, voy a mirar a ver que más encuentro acerca de los headers. Muchas gracias a todos.

noter

#9
Oct 08, 2015, 04:49 pm Last Edit: Oct 08, 2015, 04:56 pm by noter
Echa un vistazo a los puntos 3-5 de esta solución a ver si te trae algo de luz.
Como ves proporciona un montón de headers para servers tikismikis ;).

chronos682

Gracias noter por responder:

Ya he intentado de varias formas, la última que tengo es esta:

Code: [Select]

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

byte mac[] = {  0x90, 0xA2, 0xDA, 0x0D, 0x4E, 0xD9 }; // MAC de la tarjeta ethernet shield
byte ip[] = { 192,168,1,15 }; // Direccion ip local
//char server[] = "http://www.jm2arquitectura.com";
char server[] = "http://riego.net16.net";
EthernetClient client;
//char buffer[200];
int hpapiros=1;
int hvariados=2;
int hornamental=3;
int hcitricos=4;
int htemperatura=5;
int hlluvia=6;

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip); // inicializa ethernet shield
  delay(1000); // espera 1 segundo despues de inicializar
 
  //Serial.println("Conectando..");
  String cadena = "GET /index.php?action=1&papiros=7&variados=8&ornamental=9&citricos=10&temp=11&lluvia=12\r\n";

  if (client.connect(server, 80)) {  // Se conecta al servidor
  //sprintf(cadena,"GET /riego/index.php?action=1&papiros=%d&variados=%d&ornamental=%d&citricos=%d&temp=%d&lluvia=%d\r\n",hpapiros,hvariados,hornamental,hcitricos,htemperatura,hlluvia);
  client.print(cadena);
  client.print("Host: ");
  client.print(server);
  client.print("\r\n");
  client.print("Accept: */*\r\n");
  client.print("Accept-Encoding: gzip, deflate, sdch\r\n");
  client.print("Accept-Language: es-ES,es;q=0.8\r\n");
  client.print("Referer: https://www.arduino.cc/en/Tutorial/WebClient\r\n");
  client.print("User-Agent: Arduino\r\n");
  client.print("HTTP/1.1 200 OK\r\n");
  //client.print("HTTP/1.1\r\n");
  client.print("Connection: close\r\n");
  client.print("Content-Encoding: gzip\r\n");
  client.print("Content-Length: ");
  client.print(cadena.length());
  client.print("\r\n");
  client.print("Content-Type: text/html\r\n");
  client.print("Server: Apache\r\n");
  client.print("Vary: Accept-Encoding\r\n");
  client.println();
  //Serial.println("Conexion exitosa");
  }
  else
  {
    //Serial.println("Falla en la conexion");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
 
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while (true);
  }
  delay(5000);
}


Ya no se me ocurre qué más hacerle. Usando una extensión de chrome que me permite ver la petición get que hace a la página directamente el navegador me muestra esto:

Code: [Select]

GET /index.php?action=1&papiros=1&variados=2&ornamental=3&citricos=4&temp=18&lluvia=5 HTTP/1.1
Host: riego.net16.net
Accept: image/webp,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: es-ES,es;q=0.8
Cookie: um=2JE*3LgllQViBe0avP0qPsMcdt|2JT!3-kbZvDwxGdidNBT9nRBNb|2Ke.'5ED74041A89BACDC'|2Kf.'COOKIE_ID'; ssc=facebook%3B5; dt=X; di2=NVH1GJ.UYM|F7IU.X86|EFJ3.W4N; uid=55690c9b3b9a5f12; uvc=0%7C36%2C5%7C37%2C1%7C38%2C5%7C39%2C7%7C40; bt2=5613c158001ws00020033s0002001Bs0002001Cs0002001Fs0001005Hs0001001Js0005001Ks0002002Ls0002001Ns2000001Ps000201wVs0002003_s0001; vc=93; loc=MDAwMDBTQUNPMDAxODQ2MTA1OTAwMDAwMDAwVg==
Referer: https://s7.addthis.com/pinit.html
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

HTTP/1.1 200 OK
Connection: close
Content-Type: text/html
Date: Thu, 08 Oct 2015 13:28:05 GMT
Server: Apache
Transfer-Encoding: chunked
X-Powered-By: PHP/5.2.17


Traté de colocar los que más pude en Arduino, pero sigue sin funcionar.

chujalt

Saludos...

Yo para que mi arduino salte a internet configuro el router de la siguiente manera:

Opciones avanzadas --> Configuración --> Configuración WLAN --> Servidor DMZ predeterminado (ahí pongo la IP interna de mi arduino y activo la casilla) a partir de ese momento tu arduino será visible en internet.

Me imagino que tu router será distinto, pero lo que tienes que buscar es "Servidor DMZ"

No se si ese es el problema, pero de esta manera a mi me funciona.

Saludos
chujalt.com

chronos682

Gracias por responder chujalt, esa parte si está funcionando bien, ya tengo abierto el puerto 80 y la redureccion a la ip del arduino ya están implementadas, de hecho recibo adecuadamente los valores de los sensores a través de internet, el problema es para conectar el arduino a una página de internet actuando como cliente web.

chujalt

Saludos....

Yo hice algo parecido pero por wifi... por si te sirve de ayuda
http://haciendoweb.com/Hilo-Aporte-Arduino-sensor-temperatura-wifi-php-MySql

Saludos
chujalt.com

chronos682

#14
Oct 08, 2015, 09:51 pm Last Edit: Oct 08, 2015, 10:54 pm by chronos682
Amigo chujalt está muy buena esa idea, voy a probar y te cuento como me fue.

Edito: Analizando mejor la situación creo que no me va a servir, porque yo necesito que toda la información se guarde de manera automática, sin intervención del usuario y sin tener que usar ningún otro componente aparte de las dos placas de arduino (la que recoge la información de los sensores) y la que procesa la información y la envía a la página php. Si yo uso tu método tendría que tener un computador encendido todo el tiempo para que se ejecute el código html que genera el servidor de arduino. Si hubiera alguna forma de que arduino interpretara código html como si fuera un navegador sería excelente.

Sigo mirando la forma de hacerlo desde Webclient. Gracias.

Go Up