Go Down

Topic: Conectar arduino Web Client via Ethernet Shiel (Read 334 times) previous topic - next topic

LUISRO847

Hola amigos,

Intento conectar mi arduino Ethernet Shield W5100 a un servidor web con la librería Ethernet casi intacta, solo cambié las variables específicas de mi LAN pero no logro enviar un simple mensaje.

Podrían echarle un vistazo y sugerirme las correcciones.

Muchas gracias.


Code: [Select]



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

// Enter a MAC address for your controller below.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "192,168,0,11";    // server ip

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 13);

// 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;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield 10 second to initialize:
  delay(10000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /estacion1/arduinoapc.php?billete= ");
    client.println("Host: 192, 168, 0, 11");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

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


angelxulo

#1
Sep 19, 2019, 03:47 pm Last Edit: Sep 20, 2019, 05:46 pm by angelxulo
Deberías de explicar mejor tus necesidades y dar mas datos a conocer sobre como quieres enviar el mensaje, a donde y desde donde?

Según el código que muestras, has configurado tu Arduino como un Cliente en la IP "192.168.0.13" conectado a un Servidor en la IP "192.168.0.11".

La dos funciónes que hace el Cliente es conectarse a un servidor y cambiar un valor en un determinado archivo PHP. Y aparte imprimir por el Puerto Serial los caracteres recibidos por el Servidor al cual esta conectado. Aparentemente no veo ningún error en el código. Salvo que me parecen raras las IPs

¿Es esta la función que quieres que haga tu Arduino? ¿O por casualidad quieres montar un Servidor Web en el cual te muestre lo que le mandes por el Serial del cliente?
¿O te intentas conectar a una base de datos enviando y recibiendo datos?

A la espera estaré de tu respuesta y mayores detalles

Kike_GL

El servidor Xampp (192.168.0.11) esta activo y tiene una carpeta llamada "htdocs/estacion1" ? que contiene el archivo arduinoapc.php ?
Saludos, Kike_GL

LUISRO847

#3
Sep 19, 2019, 09:41 pm Last Edit: Sep 21, 2019, 06:45 pm by surbyte
Hola amigos, muchas gracias por atender mi consulta.

Efectivamente tengo una arduino UNO con ip 192.168.0.13 con una shiel Ethernet w5100 en una LAN, lo que intento es enviar datos via web service a una base de datos que esta en el servidor 192.168.0.11 xampp, con apache, mysql ya encendidos.

La base de datos est'a configurada en el directorio xampp/htdcs/arduino.php.

Cuando le envio datos desde un navegador, digamos mi laptop 192.168.0.10 que est'a en la misma red, recibe los datos con el env'io de
Code: [Select]
http://estacion1/arduino.php?billete=5 por ejemplo, y en la base de datos recibo el valor de 5.

Pero al subir el codigo a mi arduino, en el monitor serial me indica:
Connecting...
disconnecting
??

puedo hacer ping al arduino desde mi laptop tambi'en.

ya he revisado mi sketch y no encuentro errores, estoy perdido....

angelxulo

Te mande un MP porque creo que no entendiste mi declaración, la he re-formulado arriba.

Aun así te dejo este código el cual esta preparado para enviarle un Texto o Valor a una Base de Datos través de un archivo PHP de configuración y conexión hacia la misma. (Si no sabes crear el archivo PHP pregunta).

Es lo que mas se asemeja a tu objetivo, incluso creo que lo hará a la perfección.

Code: [Select]
#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Configura el MAC de tu Modulo Ethernet correctamente.
IPAddress ip (192,168,0,16); //Escribe la IP que le asigna tu router normalmente, o incluso configurale una fija a traves del router y la pones aqui.

char server[] = "192.168.0.11"; //Aqui va la direccion IP del Servidor, en tu caso como dijiste "XAMPP", escribe la IP que le a asignado tu router al PC donde esta XAMPP, si puedes ponerla fija en el router mejor.
EthernetClient client;

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

void loop() {
 
    if (client.connect(server, 80)) {

        client.print("GET /arduino.php?");
        client.print("billete=5");
        client.stop();

    }

    else {

        Serial.println("--> Conexion fallida\n");
    }
 
  delay(10000);

}


Consejos:

¡¡Lo que tienes que configurar te lo he comentado en el codigo!!

Comprueba la MAC de tu Modulo Ethernet de Arduino. Entra en tu Router y mira que IP le a asignado a esa MAC y configurala en el código (si puedes configurarla Estatica en el Router)

Comprueba la MAC del PC donde este montado el XAMPP. Entra en tu Router y mira que IP le a asignado a esa MAC o mas sencillo; ve a la consola (CMD) de windows como administrador y escribe "ipconfig" te saldra la IP de tu PC, apuntala y configurala en el código (si puedes configurarla Estática en el Router pero sin olvidar ponerla en el código)

Ya me diras que tal te fue

Kike_GL

Quote from: LUISRO847
Cuando le envio datos desde un navegador, digamos mi laptop 192.168.0.10 que est'a en la misma red, recibe los datos con el env'io de http://estacion1/arduino.php?billete=5 por ejemplo, y en la base de datos recibo el valor de 5.
Ya pero el Arduino deberia usar:

Code: [Select]

http://192.168.0.11/arduino.php?billete=5


Cambia:
Code: [Select]

if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /arduino.php?billete=5");
    client.println("Host: 192, 168, 0, 11");
    client.println("Connection: close");
    client.println();
} else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
}
Saludos, Kike_GL

LUISRO847

Hola Kike, Angel,

Muchas gracias por su apoyo, me doy cuenta que es importante informar de todo contexto del desarrollo para obtener el soporte correcto.

Como comente la topologia es como sigue: Xampp server 192.168.0.11, arduino 192.168.0.13, terminal laptop 192.168.0.10, esto lo confirme desde el router admin, con mac, etc.

Si envio una via http por el browser de mi laptop me registra el valor en la base de datos sin problema, por lo que asumo que la base de datos est'a ok, e infiero que el problema es en el c'odigo arduino.

De acuerdo a lo que me indican, entiendo que el error del c'odigo es en la peticion GET pues estoy enviando la direccion completa de la db, es correcto?

"GET: /arduino.php?"

Favor confirmar este punto pues deber'e hacer una conexi'on remota al arduino para probarlo...

Gracias de nuevo




angelxulo

Haber el método de envió GET funciona en la mayoría de los casos, pero creo que el problema radica en tu archivo PHP...

El método POST es un método de envió no visible, en el caso de una web no se mostraría aunque en una base de datos según tu archivo PHP podría entenderlo.

De todas formas de dejo el el Codigo Arduino nuevamente configurado y un ejemplo de Codigo PHP que funcionara perfectamente con el Arduino si modificas bien los datos que te he comentado en el

CODIGO ARDUINO:

Code: [Select]
#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Configura el MAC de tu Modulo Ethernet correctamente.
IPAddress ip (192,168,0,16); //Escribe la IP que le asigna tu router normalmente, o incluso configurale una fija a traves del router y la pones aqui.

char server[] = "192.168.0.11"; //Aqui va la direccion IP del Servidor, en tu caso como dijiste "XAMPP", escribe la IP que le a asignado tu router al PC donde esta XAMPP, si puedes ponerla fija en el router mejor.
EthernetClient client;

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

void loop() {
 
    if (client.connect(server, 80)) {

        client.print("GET /arduino.php?");
        client.print("value=");
        client.print("5"); //Aqui escribes el valor que quieres que envie a la base de datos
        client.stop();

    }

    else {

        Serial.println("--> Conexion fallida\n");
    }
 
  delay(10000);

}


CODIGO PHP (edita tu archivo arduino.php borra todo y pega esto):

Code: [Select]
<?php

    $dbusername 
"arduino";  // Cambia esto por tu usuario de la base de datos
    
$dbpassword "arduinotest";  // Cambia esto por la contraseña de la base de datos
    
$server "localhost"//No hace falta tocarlo si se ejecuta este archivo en el mismo servidor y no remotamente

    
$dbconnect mysql_pconnect($server$dbusername$dbpassword);
    
$dbselect mysql_select_db("test",$dbconnect);  //Cambia el nombre de la base de datos "test" por la tuya

    
$sql "INSERT INTO test.tabla1 (value) VALUES ('".$_GET["value"]."')"//Cambia la tabla "tabla1" por la tabla que tengas dentro de la base de datos "test"

    
mysql_query($sql);

?>

LUISRO847

Hola Angel,

Muchas gracias por tu soporte, he le'ido algunos de tus post y eres un pro para guiar a los interesados. Voy a revisar el c'odigo PHP que me enviaste.

Por ahora solamente quiero probar ingresar un dato via web service, y mas adelante ampliar la base de datos a un formulario con mas variables, entiendo que para ello debo utilizar peticiones POST.

Ves que hay una diferencia entre tu c'odigo arduino y el que envi'o Kike, y es que tu agregas una linea cliente.print("billete="); o cliente.print("valor="); dependiendo como este configurado en la db, en qu'e radicar'a la diferencia? cual ser'a el mejor m'etodo?

En un par de horas podre probar'e los c'odigos como el envio a la base de datos.

Saludos.


LUISRO847

Hola amigos,

Lamento comunicarles que no me funcionó la corrección en el código, intenté con sendos cambios sugiridos en el pedido GET....y la respuesta fue la siguiente:

connecting...
connected

disconnecting.

Les comparto el código cómo quedó:

Volví a probar desde mi laptop y si le llegan las variables a la db, cualquier valor sin problema, por eso asumo que el php de mysql está bien...

Code: [Select]


/*
  Web client

 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield.

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

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen

 */

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

// Enter a MAC address for your controller below.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "192,168,0,11";    // server ip

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 13);

// 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;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield 10 second to initialize:
  delay(10000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /arduinoapc.php?billete=5");
    client.println("Host: 192, 168, 0, 11");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

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


LUISRO847

Como nota adicional,

Con el arduino puedo pegarle a google,com o cualquier sitio web y responde,

También revisé que en el Firewall el puerto 80 esté habilitado para MySQL y todo en orden...



Kike_GL

LUISRO847, puedes publicar tu código de arduino.php ?

Para recuperar el valor de la variable estas usando $_GET[] ? deberias usar:

Code: [Select]

$valor = $_REQUEST['billete'];
Saludos, Kike_GL

LUISRO847

os comparto el php, en xampp/htdocs/arduino.php

Code: [Select]

<?php
// Script para recolectar datos enviados por arduinos conectados a la red

$RecibioBillete 0;

// Parametros de base de datos
$mysql_servidor "localhost";
$mysql_base "estacion01";
$mysql_usuario "arduino";
$mysql_clave "";
$billete htmlspecialchars($_GET["billete"],ENT_QUOTES);
if ((
$billete!="") ) {
    
mysql_connect($mysql_servidor,$mysql_usuario,$mysql_clave) or 
       die(
"Imposible conectarse al servidor.");
    
mysql_select_db($mysql_base) or die("Imposible abrir Base de datos");

    
$sql "insert into arduino (valor) 
            values ('
$billete')";
      
mysql_query($sql);
    
$RecibioBillete=$sql.'arduino'.'valor';  
    
//echo $RecibioBillete;
    //echo "$RecibioBillete";
    //echo "\n";
}
?>




Kike_GL

Prueba esto

Code: [Select]

<?php
//Parámetros de base de datos
$mysql_servidor 'localhost';
$mysql_usuario 'arduino';
$mysql_clave '';
$mysql_base 'estacion01';

if (isset(
$_REQUEST['billete'])) {
   
$billete $_REQUEST['billete'];
   
$mysqli = new mysqli($mysql_servidor$mysql_usuario$mysql_clave$mysql_base) OR die('Imposible conectarse al servidor o BD.');
   
$sql "insert into arduino (valor) values ('$billete')";
   
$mysqli->query($sql) OR die('Revisa el query de tabla<p>'$sql);
   if (
$mysqli->affected_rows == 1){
      return 
'Ya grabo...';
   }else{
      return 
'Problemas, no grabo';
   }
   
$mysqli->close();
}
?>

Saludos, Kike_GL

LUISRO847

Hola amigos,

Les comento que lamentablemente aún no logro enviar datos al webservice, he cambiado 4 veces el archivo php en xampp/htdocs y sendos códigos.

Mi router pone por default ip dinámicas, pero ya desabilité la opción para que queden estáticas.

No obstante continuo enviando exitosamente peticiones desde el browser de cualquier equipo en la red, y se procesan también en la base de datos.

Con este último código que me envió Angel (levemente modificado) solamente obtengo el siguiente mensaje:

Conetado  y repite las líneas, pero no le llega nada a la db....creo que borraré todo y volveré a cargar de nuevo, o intentar con otros códigos.

Mi meta es enviar valores continuos desde un contador de billetes, el código me funciona bien para el monitor serial, pero ahora necesito que se guarden los valores en la db.

Cualquier sugerencia bienvenida.

Code: [Select]


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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192, 168, 0, 13}; // IP del modulo de Internet
byte serv[] = {192, 168, 0, 11} ; // IP del servidor
EthernetClient cliente;

void setup() {

    Serial.begin(9600);
    Ethernet.begin(mac, ip);

}

void loop() {

    if (cliente.connect(serv, 80)) {

        Serial.println("Conectado");
        cliente.print("GET /estacion01/arduinoapc.php?");
        cliente.print("valor=");
        cliente.print("5");
        cliente.stop(); // Se cierra conexion
       
    }
    else {

        Serial.println("Conexion fallida!");

    }

delay(5000);










Go Up