Problema con un código simple

Hola, tengo un problema con este código. Y no sé si es por la placa, que es Intel Galileo Gen2 o porque no lee bien el puerto, ya que en la condición " if (client.connect(server, 80)) " nunca entra.
Para comprobarlo he imprimido por pantalla el valor de 'client' y es 0.

El problema es que no tiene conexión con el cliente, y no sé ¿¿¿por qué???

Esto es lo que sale cuando ejecuto:


0
connecting...
connection failed

disconnecting.


El código es el siguiente:

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


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 100 };
byte server[] = { 216, 58, 211, 206 }; // Google
EthernetClient client;

void setup()
{
 Ethernet.begin(mac, ip);
 
 Serial.begin(9600);

 Serial.println(client);//Compruebo que no hay conexión=0

 delay(1000);

 Serial.println("connecting...");

 if (client.connect(server, 80)) {
   Serial.println("connected");
   client.println("GET /search?q=arduino HTTP/1.0");
   client.println();
 } else {
   Serial.println("connection failed");
 }
}

void loop()
{
 if (client.available()) {
   char c = client.read();
   Serial.print(c);
 }

 if (!client.connected()) {
   Serial.println();
   Serial.println("disconnecting.");
   client.stop();
   for(;;)
     ;
 }
}

Espero me ayudéis a encontrar la solución.
Muchísimas gracias de antemano.

Puede ser debido a varias razones.

Podría ser por ejemplo que tuvieras un filtro MAC en tu router de acceso a Internet.

Puedes problarlo con una máquina local que tenga ejecutándose un servicio web por el puerto 80 abierto y si te funciona podrás descartar que sea problema del código.

Saludos.

(ºLe.

Hola, he comprobado y está descartado que sea por eso.

He hecho más comprobaciones y si pongo la ip de mi máquina en " byte server[ ] = { 192,168,..,.. }; " sí que me funciona y puedo leer lo que hay en localhost.

Pero, como dije en el post anterior, si pongo cualquier otra dirección, por ejemplo la de google (216,58,211,195), no funciona.

Muchas gracias por la respuesta.
Espero contestación.

Un saludo.

Hola.
Para salir fuera de tu red necesitas configurar puerta de acceso o gateway. Y si además deseas usar nombres en lugar de IP necesitarás DNS.
Puedes intentar con 192.168.1.1 o la que tenga tu router para ambos parámetros.

Hola, muchas gracias por contestar.

Ésta es la configuración que le he dado, y aun así no me funciona.

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

IPAddress server(216,58,211,195);
//char server[] = "www.google.com";

IPAddress gateway(192,168,1,1);
IPAddress ip(192,168,1,100);
IPAddress dns(8,8,8,8);
EthernetClient client;

void setup() {

¿Y has puesto todos los parámetros que has definido en el EthernetBegin?

Saludos
En varias ocaciones he tratado de usar una IP para usar google como servidor y no me ha funcionado.
Uno que otro Sketch funciona con dns. Tal como colocaste char server[] = "www.google.com";

Por eso creo que mas que el codigo tu problema esta en la IP del servidor. Si colocas http://216.58.211.195/ en un navegador te abre la pagina de búsqueda de google pero no se sabe si lo que ha hecho en enrutar al navegador al lugar del buscador.

Hola, gracias de nuevo por ayudarme.

Sí, están puesto todos los parámetros definidos.
El código final queda así:

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

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

char server[]="http://216.58.211.195/";
//char server[]="www.google.es";
//IPAddress server(216,58,211,195);

IPAddress gateway(192,168,1,1);
IPAddress ip(192,168,1,100);
IPAddress dns(8,8,8,8);

EthernetClient client;

void setup() {

  Ethernet.begin(mac,ip,dns,gateway);
  Serial.begin(9600);
  Serial.println(client);
   while (!Serial) {
    ; 
  }

  
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
     for(;;)
      ;
  }
    delay(1000);
 
 Serial.println("connecting...");

  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET");
    client.println();
  } 
  else {
    
    Serial.println("connection failed");
  }
  Serial.println(client);
}

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:
    for(;;)
      ;
  }
}

Todavía no he encontrado la solución a mi problema, parece que no pueda salir fuera de mi red por algún motivo que todavía desconozco.

¿Tienes el DHCP habilitado en tu router o asignas las ip manualmente?
Supongo que tienes un ordenador conectado al mismo router. Si es windows abre una ventana de comandos (ejecutar->cmd) y teclea ipconfig /all y mira los resultados. A saber:

  • Si la máscara de subred es 255.255.255.0
  • Si la puerta de enlace predeterminada es 192.168.1.1
  • Si autoconfiguración habilitada está en NO

Si todo es así entiendo que tu arduino debería conectar. Si no es así cuenta a ver ;).

Puede parecer una tontería pero, ¿responde a ping el arduino haciéndole ping desde un pc dentro de la misma red?

Vamos primero a intentar descartar lo que puede parecer obvio, y que precisamente por eso, a veces no lo comprobamos.

Lo digo porque, la librería ethernet, ¿funciona con el puerto ethernet del galileo?

Creo que en uno de los primeros post comenta que sí le va en local, así que creo que el problema esté en la configuración de red.

Pues yo no tengo claro que esa librería funcione con el Galileo...

Edito: Si que funciona.

http://arduino.cc/en/ArduinoCertified/IntelGalileoGen2

The onboard Ethernet interface is fully supported, use the Ethernet Library. It does not require the use of the SPI interface like existing Arduino shields.

Hola, gracias por responder.

Voy por partes:

  • Trabajo en Linux, no creo que eso cambie mucho.
  • He hecho un ping a la ip que le pasé en el código la última vez que lo ejecuté (IPAddress ip(192,168,1,100):wink: y me da respuesta.
  • La librería ethernet sí que me funciona correctamente.

He mirado tu código y he pensado que no es nada que no pueda hacer un Arduino Uno, con una ethernet shield. Yo no tengo una placa Galileo, pero si lo otro.

He probado tu código, y me daba un error al compilar, con la definición de dns. Lo que he hecho es lo siguiente:

Ethernet.begin(mac,ip,gateway,gateway);

¿Por qué? pues porque normalmente los routers, ya llevan unas dns, y si usas como dns su misma ip, se encargan de hace su trabajo.

Después, he probado usando

char server[]="http://216.58.211.195/";

Obteniendo por la consola serie:

0
connecting...
connected
0

disconnecting.

En cambio si uso:

char server[]="www.google.es";

o bien

IPAddress server(216,58,211,195);

obtengo esto:

0
connecting...
connected
1
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.es/?gfe_rd=cr&ei=y98kVbjNF
disconnecting.

Espero que te sirva de ayuda. Te pongo el código completo:

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

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//char server[]="http://216.58.211.195/";
char server[]="www.google.es";
//IPAddress server(216,58,211,195);

IPAddress gateway(192,168,1,1);
IPAddress ip(192,168,1,100);
//IPAddress dns=(8,8,8,8);

EthernetClient client;

void setup() {

  Ethernet.begin(mac,ip,gateway,gateway);
  Serial.begin(9600);
  Serial.println(client);
   while (!Serial) {
    ; 
  }

  
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
     for(;;)
      ;
  }
    delay(1000);
 
 Serial.println("connecting...");

  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET");
    client.println();
  } 
  else {
    
    Serial.println("connection failed");
  }
  Serial.println(client);
}

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:
    for(;;)
      ;
  }
}

Y éste es el resultado:

0
connecting...
connection failed
1

disconnecting.

:frowning:

La IP del router es 192.168.1.1, no? Otra posibilidad que se me ocurre, es que no le guste la mac al router. Prueba con esta:

byte mac[] = {  0x90, 0xA2, 0xDA, 0xEF, 0xFE, 0xED };

Ricovi; aunque el ordenador con el que conectas sea linux, supongo que sabrás si conecta mediante dhcp o configuración manual, o que puedas mirar los datos de la conexión actual, para saber qué datos ponerle al arduino. Me atrevería a decir, visto lo visto, que lo más probable es que tengas dhcp activo, pero deberías intentar buscar esos datos, bien desde la conexión del ordenador o bien entrando al menú del router.