Go Down

Topic: ethernet y metodo get (mas dudas) (Read 6 times) previous topic - next topic

karagos

Nov 17, 2011, 02:34 am Last Edit: Dec 08, 2011, 02:12 am by karagos Reason: 1
hola de nuevo arduinologos.

ya he conseguido controlar el arduino (temperatura y leds) pero al intentar hacer una web mas compleja con varios formularios para cambiar  la fecha, horas de encendido y apagado ...... se me queda colgado pues la web ya pesa un poco.
entonces mi proxima parada era crear una web autonoma alojada en un servidor externo con flash php..... algo mas currao.
y que esta interprete lo que le envio desde el arduino a la web, osea que el arduino no crea ninguna web solo manda info.

esto se que se hace con el metodo (get /?nombre=minombre) mas o menos es algo asi.

primero no se como indicarle el archivo con su ruta completa.
ahora mismo tengo montado en el pc un servidor local lo llamo desde arduino con 127.0.0.1 que es el localhost.
el archivo que debe leer la info  esta guardado en http:\\127.0.0.1/arduino/recibe.php de mi servidor local(creado con appserv que luego lo subire a algun servidor externo.)
lo ideal seria algun manual donde se extendiera un poco como usar este metodo en arduino puesto que lo que hay de la libreria en arduino.cc es muy escueto.
espero haberme explicado y no haber dicho una barbaridad.
un saludo y gracias de nuevo por vuestra ayuda.  

edito: si alguien quiere el codigo que tengo echo no tiene mas que pedirlo.para eso estamos jejeje

pacoooh

Karagos a mi me interesa, ese código. Aún estoy con otra cosa, y como dices hay poca información en español al respecto. Y cualquier código funcional es bueno para el estudio.

Gracias de antemano.

chiva

#2
Nov 17, 2011, 11:09 am Last Edit: Nov 17, 2011, 11:32 am by chiva Reason: 1
Si quieres decirle la ruta completa, pues se la dices :D

get http://127.0.0.1/arduino/recibe.php/?nombre=minombre

Nunca está demás probar cosas, no se va a romper
La razón por la que no hay nada, es por que usa protocolo HTTP cosa que no tiene nada que ver con Arduino y está estandarizado y documentado hasta la saciedad: http://tools.ietf.org/html/rfc2616
O como introducción: http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

karagos

#3
Nov 17, 2011, 04:33 pm Last Edit: Nov 19, 2011, 04:42 am by coleoptero Reason: 1
hola. aqui esta el codido

lo que hago en el loop es recibir primero la info que me envia la web modificarla en el arduino(encender o apagar un led) despues miro si esta encendio o apagado y lo vuelvo a enviar a la web. espero haberme explicado.
Code: [Select]
/*
metodo de envio primero un ? para empezar seguido de una letra:
mayuscula es para cualquier cosa y se cierra con $
minusculas es para encender o apagar 0 o 1 ejemplo a1: enciende el "a" a0:apaga el "a"
///////////////////////////
otra opcion de hacer la web es:
igual que envias al buscador google info para buscar enviar la informacion por get a una web y esa web recoje la info y la adapta a la web.
mirar luego este codigo que esta en webclient.pde
*/
#include <Ethernet.h>
#include <SPI.h>
//////////////// temperatura /////////////////
#include <OneWire.h>//libreria temperatura
#include <DallasTemperature.h>//libreria temperatura
#define ONE_WIRE_BUS 36//pin de temperatura 11
OneWire oneWire(ONE_WIRE_BUS);//temperatura
DallasTemperature sensors(&oneWire);// temperatura
float temp;//variable donde guardaremos la temperatura
////////////////////////////// fin temperatura //////////////////
boolean leyendo = false;
//String quees;
char caracter;
String variable("");



////////////////////////////////////////////////////////////////////////
//CONFIGURE
////////////////////////////////////////////////////////////////////////
 byte ip[] = { 192, 168, 0, 15};   //ip address to assign the arduino
 byte gateway[] = { 192, 168, 0, 1 }; //ip address of the gatewa or router

 //Rarly need to change this
 byte subnet[] = { 255, 255, 255, 0 };

 // if need to change the MAC address (Very Rare)
 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

 Server server = Server(80); //port 80
////////////////////////////////////////////////////////////////////////

void setup(){
sensors.begin();//inicialicia el sensor de temperatura
  //Pins 10,11,12 & 13 are used by the ethernet shield
 pinMode(31, OUTPUT);
 pinMode(9, OUTPUT);
/*digitalWrite(9, HIGH);
delay(5000);
digitalWrite(9, LOW);*/
 Ethernet.begin(mac, ip, gateway, subnet);
 server.begin();
Serial.begin(9600);
}

void loop(){
variable="";
 // listen for incoming clients, and process qequest.
recibe();// en este void solo guardamos datos en el arduino y despues lo enviamos

//envia();
//prueba();
}
///////////////////////////////////////////// lee de ethernet ////////////////////////
void recibe(){//2
Client client = server.available();
if (client) {//3
// una peticion http termina con una linea en blanco
boolean lineaenblanco = true;
boolean enviacabecera = false;
while (client.connected()) {//4
     if (client.available()) {//5
           if(!enviacabecera){// si no se a escrito la cabecera la escribe y despues le da valor verdadero para que no vuelva a enviarla
            // escribe la cabecera
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();
            enviacabecera = true;
           }
           caracter = client.read();
///////////////////// desde aqui empieza a leer lo que se manda por get ///////
       if(leyendo && caracter == ' ') leyendo = false;// si leyendo en verdadero y c=" "=(nada) leyendo seria falso y al estar vacio no entra en if(leyendo) osea no imprime nada
       if(caracter == '?') leyendo = true; //buscamos ? para comenzar a leer la info
/////////////////////////////////// AQUI EMPIEZA A COMPARAR LO LEIDO /////
       if(leyendo && variable==""){//6
         caracter= client.read();// este seria la letra de  valor alternativo.// cada vez que usamos este comando leemos un muevo caracter.
        switch (caracter){
           case 'T':
             // temperatura
              //finito si se olvida poner un $ el bucle seria infinito asi que pondiramos un contador maximo de x mara que salga si llega al tope.
              caracter= client.read();// para leer el igual y quitarlo
              do {
                caracter = client.read();    
                if (caracter != '$') variable= variable+caracter;// evita que se imprima el caracter del dolar
                if (caracter == '\n') {variable="Error en el envio,No se envio intruccion de cierre($)";break;}
            }while (caracter != '$');
              // una vez que tiene la variable hace lo oportuno
              //client.print("temperatura = ");
              //client.print(variable);
           break;
           case 'H':
          // hghg
              caracter= client.read();// para leer el igual y quitarlo
           do {
                caracter = client.read();    
                if (caracter != '$') variable= variable+caracter;// evita que se imprima el caracter del dolar
                if (caracter == '\n') {variable="Error en el envio,No se envio intruccion de cierre($)";break;}
             }while (caracter != '$');
              // una vez que tiene la variable hace lo oportuno
              //client.print("bombas = ");
              //client.print(variable);
          break;
                  case 'a':
             // bombas

              caracter= client.read();// para leer el igual y quitarlo

              caracter=client.read();// lee si esta encendido o apagado  
             variable=(caracter);
         if (caracter=='0'){digitalWrite(9,LOW);}else if (caracter=='1'){digitalWrite(9,HIGH);}  
           //leyendo=false;
           break;
           case 'b':
          // SUBIDA
              caracter= client.read();// para leer el igual y quitarlo
         caracter=client.read();  
             variable=(caracter);
         if (caracter=='0'){digitalWrite(31,LOW);}else if (caracter=='1'){digitalWrite(31,HIGH);}  
          break;
        }
//delay(2000);
//     client.print("<br>");
}// 6 fin de leyend
// \n es nuevalinea y \r retorno o intro \t tabulador
       if (caracter == '\n' && lineaenblanco)  break;
       if (caracter == '\n') {
        lineaenblanco = true;
         }else if (caracter != '\r') {
          lineaenblanco = false;
     }
     } //5
     }//4
}//3
//////////////////////////////////////////// ENVIANDO //////////////////////////
client.println ("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><title>Acuarium MarePrime</title></head><body bgcolor=\"#000000\" text=\"#ffffff\">");//body
client.println ("<table width=\"300\" align=\"center\" cellspacing=\"5\"><tr><td colspan=\"2\" align=\"center\" valign=\"middle\">ON/OFF</td><td align=\"center\" valign=\"middle\">TEMPERATURA ACUARIO</td></tr>");// prmera linea de la tabla
client.println("<tr><td width=\"85\" align=\"center\" valign=\"middle\">Calentador</td><td width=\"44\" align=\"center\" valign=\"middle\">");//segunda linea de la tabla hasta el boton
// aqui va el from
if (digitalRead(9)==HIGH){ // si el 30 es high
client.println("<form METHOD=get action=\"http://192.168.0.15/\"><input type=hidden name=a value=0><input type=\"image\" src=\"http://i945.photobucket.com/albums/ad295/karagos/on.jpg\"></form>");
}else if (digitalRead(9)==LOW){// si es low
client.println("<form METHOD=get action=\"http://192.168.0.15/\"><input type=hidden name=a value=1><input type=\"image\" src=\"http://i945.photobucket.com/albums/ad295/karagos/off.jpg\"></form>");
}// fin del from
client.println("</td><td align=\"center\" valign=\"middle\">");
sensors.requestTemperatures();
temp=sensors.getTempCByIndex(1);//guardamos la temperatura
client.println (temp);client.println(" ºC");
// aqui va la temperatura 26.60
client.print("</td></tr></table></body></html>");// cierra las tablas y el body y html
/////////////////////////////// FIN DE ENVIANDO //////////////////////


delay (50);
 client.stop();

} //2
///////////////////////////////////////////////////////////////////////////////////////////////////////

pacoooh

gracias chiva!!!

estoy muy liado con pruebas, y esprimiendo la GRAN LIBRERÍA DE IGOR   "FSM" que la voy a utilizar para casi todo. adaptando mi código a esta librería y si obtengo más información sobre ethernet mejor que mejor, ya haré pruebas con ethernet más adelante.

gracias karagos me lo guardo y lo estudio

flico

karagos, vaya currada ... como bien dices lo mejor es hacerlo en un webserver externo. Este fin de semana lo miro y te cuento.
Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

karagos

hola.
gracias chiva de nuevo perdona por mi torpeza pero no sabia como buscar la informacion y gracias a tu ayuda he buscado esto "hypertext protocolo de transferencia" en sangoogle y mañana lo estudiare. gracias
flico: espero que te sea de ayuda.... ese codigo esta muy simplificado pero de ahi puedes sacar mucho.

un saludo.

karagos

hola arduinologos.
estoy atascado y no se como seguir.
bien:
le envio a una web por el metodo get unas variables para que la web las interprete.
client.println("GET http://127.0.0.1/arduino/recibe.php/?nombre=minombre HTTP/1.0");
pero cuando cargo la pagina recibe.php no hay cambio incluso teniedola activa y reiniciando el arduino no pasas nada.
que hago mal?
os pongo el codigo
Quote
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,15 };
byte server[] = { 127,0,0,1 }; // localhost

// 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):
Client client(server, 80);

void setup() {
  // start the Ethernet connection:
  Ethernet.begin(mac, ip);
  // start the serial library:
  Serial.begin(9600);
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect()) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET http://127.0.0.1/arduacuario/recibe.php/?nombre=minombre HTTP/1.0");
    client.println();
  }
  else {
    // kf 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:
    for(;;)
      ;
  }
}

otra cosa aparte tenia echa la web desde el arduino yo todo funcionaba bien(desde la red de casa) pero el problema es que cuando intentas entrar desde otro lugar no funciona pues no son la misma ip publica que privada hay alguna manera para que el arduino detecte desde que ip te conectas para actuar en consecuencia?

Razorblade

client.println("GET http://127.0.0.1/arduino/recibe.php/?nombre=minombre HTTP/1.0");

¿La barra / después de recibe.php tiene que estar? Yo juraría que no, y que debería ser recibe.php?nombre.................

byte server[] = { 127,0,0,1 }; // localhost

Eso para mi no tiene sentido. 127.0.0.1 es la propia IP de cada dispositivo de red. ¿Quién dices que es el servidor?
Arduino Uno (R2fix) / Duemilanove (328p)
Ethernet Shield SD (v5)

ulpiano


hay alguna manera para que el arduino detecte desde que ip te conectas para actuar en consecuencia?
[/quote]

Para poder tener visión desde internet de un servidor alojado en una dirección de intanet, tienes que configurar el router para que haga NAT (en cada modelo se hace de modo diferente).
Despues en el navegador tienes que poner tu IP publica que salvo raras ocasiones, será dinamica y cambiara si apagas y enciendes el router.

Saludos

lordcpu

#10
Dec 08, 2011, 10:57 pm Last Edit: Dec 08, 2011, 11:01 pm by lordcpu Reason: 1
hola amigo, tratare de ayudarte...

Dependiendo de como tengas instalado el servidor Web Apache en tu sistema debes buscar el archivo de configuracion del servidor el cual se llama: "httpd.conf", en mi caso yo utilizo el programa Easy PHP y se encuentra en la siguiente ruta: "C:\Archivos de programa\EasyPHP-5.3.3.1\apache\conf", reitero que esto es en mi caso, en tu maquina puede ser diferente dependiendo del modo que este instalado el servidor Web Apache, una vez encontrado este archivo debes editarlo con el "Block de Notas" y debes buscar la siguiente configuracion que esta casi al principio del archivo:

# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80


En esta seccion podremos configurar en que direccion IP y puerto escucha nuestro servidor Apache, Ej:

Con la siguiente configuracion le estamos indicando que solo debe aceptar conexiones entrantes desde nuestro PC en modo local y que escuche por el puerto 8080:

Listen 127.0.0.1:8080

Si queremos que el servidor acepte conexiones entrantes desde cualquier direccion IP y que escuche por el puerto 80 debemos configurarlo de la siguiente manera:

Listen 80

Con lo anterior configuras al servidor para que acepte peticiones desde cualquier IP incluso desde Internet, una vez hecho esto en la parte del codigo de Arduino donde especificas la direccion IP del servidor Web Apache (en este caso tu PC), debes de colocar la IP local de tu maquina:

Puedes averiguar la direccion IP de tu PC con el comando "ipconfig" en la consola de MS-DOS

Ej. en tu codigo Arduino suponiendo que la direccion IP de tu pc es la 192.168.0.2:

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,15 };
byte server[] = { 192.168,0,2 }; // Direccion IP del servidor Web Apache


Una vez hecho esto en la llamada al metodo GET debe quedarte de la siguiente manera en tu codigo:

client.println("GET http://192.168.0.2/arduino/recibe.php?nombre=minombre HTTP/1.0");

Para que te quede mas claro el formato de la llamada es de la siguiente manera:

"GET http://ip_del_servidor_apache/archivo_que_procesa_los_datos.php?nombre_variable=valor_variable  HTTP/1.0"

en el caso que quieras pasar mas de una variable solo debes separarlas con el simbolo "&"

"GET http://ip_del_servidor_apache/archivo_que_procesa_los_datos.php?nombre_variable1=valor_variable1&nombre_variable2=valor_variable2  HTTP/1.0"


recuerda que una peticion HTTP debe terminar con una linea en blanco por lo que a posterior de la instruccion que hace la peticion con GET debes hacer un client.println(); (en tu codigo veo que esta correcto)

por favor cuentame como te fue

Saludos
Luis Fuentes
Santiago de Chile

rodezn

Hola a todos, yo estoy haciendo algo similar a lo que karagos esta haciendo, pero yo quiero enviar un archivo con extensión ".txt"  a un servidor externo.

Saben como hacerlo? Como se especifica el archivo y la ubicación que esta dentro de la SD, para que el arduino lo envie al servidor ?

Anakinspain

Karagos, yo quiero hacer algo parecido a lo que tu estas trabajando y creo que ademas sobre el mismo tema: Un acuario.

¿podemos ponernos en contacto para tratar de solventar dudas?

Un saludo y enhorabuena por tu proyecto.

Jossema106

Yo estoy en lo mismo. A ver si entre todos podemos
Proyecto:
http://duinoblog.blogspot.com.es/

Jossema106

He avanzado y creo que no poco, os pego el código:
Este es el formulario en html que esta en el servidor, las XXX corresponden a la ip publica seguida del puerto que previamente hemos redireccionado en nuestro router hacia la ip interna asignada a arduino.

<html>
<body>

   <form method=get name=LED action="XXXXXXXX">
      <input type=checkbox name=L value=1>LED<br>
      <input type=submit value=submit>
   </form>
</body>
</html>


código de arduino, hay mas pero solo os pongo la comprobación con la cual enciende el led:

if(readString == ("GET /?L=1 HTTP/1.1") )
         {
           digitalWrite(ledPin, HIGH); 
         }
Proyecto:
http://duinoblog.blogspot.com.es/

Go Up