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.
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.
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
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.
Muchas gracias por responder. Voy a ver ambas cosas y les cuento.
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.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.
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.
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.
Lo mejor es pegues el codigo que hace la conexion, si devuelve 1 es que ha conectado con el servidor.
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.
Este es el código que estoy utilizando:
#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.
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 ;).
Gracias noter por responder:
Ya he intentado de varias formas, la última que tengo es esta:
#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:
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.
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
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.
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
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.
Prueba así, lo mismo el salto de línea entre el GET y HTTP/1.0 afecta. Así es como se hace en la documentación.
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 HTTP/1.0",hpapiros,hvariados,hornamental,hcitricos,htemperatura,hlluvia);
client.println(buffer);
client.println();
Bueno.
¿Damos por sentado que sí estás conectando al servidor, no? El programa debería devolverte algo por serial, aunque sea un error o bad request, o algo.
He estado haciendo unas pruebas con telnet, y creo que con el get y el Host es suficiente. Si hay conexión prueba a ver lo siguiente:
char *cadena = "GET /index.php?action=1&papiros=7&variados=8&ornamental=9&citricos=10&temp=11&lluvia=12\r\n";
char *server = "riego.net16.net"
if (client.connect(server, 80)) { // Se conecta al servidor
client.print(cadena);
client.print("Host: ");
client.print(server);
client.print("\r\n\r\n");
}
Probado en telnet, creo que sí funciona.
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.
Saludos...
Pero no hace falta que tengas un computador encendido todo el tiempo habiendo servicios de hosting que lo hagan por ti.... en http://www.hostinger.es/ te dan dos GB de espacio, soporte php y bases de datos MySql gratis y sin publicidad.
noter:
Bueno.
¿Damos por sentado que sí estás conectando al servidor, no? El programa debería devolverte algo por serial, aunque sea un error o bad request, o algo.
He estado haciendo unas pruebas con telnet, y creo que con el get y el Host es suficiente. Si hay conexión prueba a ver lo siguiente:char *cadena = "GET /index.php?action=1&papiros=7&variados=8&ornamental=9&citricos=10&temp=11&lluvia=12\r\n";
char *server = "riego.net16.net"
if (client.connect(server, 80)) { // Se conecta al servidor
client.print(cadena);
client.print("Host: ");
client.print(server);
client.print("\r\n\r\n");
}
Probado en telnet, creo que sí funciona.
Eres un completo genio, siempre tuviste toda la razón, era problema del protocolo de comunicación, específicamente en los retornos de carro, también me puse a hacer pruebas con Telnet y me dí cuenta que obligatoriamente deben haber 2 retornos de carro seguidos luego de enviar el header host. Muchísimas, muchísimas gracias. No sabes cuánto tiempo llevo dándole vueltas a esto y era "tan fácil".
Ha sido un placer haberte sido de ayuda, y creo que puede ser interesante para muchos otros; por ello, por favor, edita tu primer post de este hilo y modifica el asunto a algo más descriptivo (realmente el problema finalmente no era configuración de router) agregando [SOLUCIONADO].
Por ejemplo:
[SOLUCIONADO] Servicio de hosting no atiende petición GET.
Saludos.