Pages: [1] 2   Go Down
Author Topic: ethernet y metodo get (mas dudas)  (Read 5747 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: December 07, 2011, 08:12:09 pm by karagos » Logged

Barcelona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si quieres decirle la ruta completa, pues se la dices smiley-grin

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
« Last Edit: November 17, 2011, 05:32:05 am by chiva » Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*
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
///////////////////////////////////////////////////////////////////////////////////////////////////////
« Last Edit: November 18, 2011, 10:42:38 pm by coleoptero » Logged

Barcelona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Trabajando en ...

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

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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(;smiley-wink
      ;
  }
}
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?
Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 149
LED
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿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?
Logged

Arduino Uno (R2fix) / Duemilanove (328p)
Ethernet Shield SD (v5)

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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
Logged

Chile
Offline Offline
Newbie
*
Karma: 0
Posts: 28
El sabio deja de ser sabio cuando cree que lo sabe todo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: December 08, 2011, 05:01:47 pm by lordcpu » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo estoy en lo mismo. A ver si entre todos podemos
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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); 
         }
Logged


Pages: [1] 2   Go Up
Jump to: