cliente http WIFLY! (SOLUCIONADO!)

bUENAS A TODOS,

eSTO INTENTANDO HACER UN SKETCH, TOMANDO COMO BASE EL EJEMPLO DE CLIENTEHTTP, LO QUE QUIERO HACER ES UN PROGRAMA QUE SOMETA UNA URL, MEDIANTE UN “GET”, ESTA URL LLEVARA UNA SERIE DE VALORES EN SU QUERYSTRING, PARA QUE CUANDO SE SOMETA EL DOCUMENT.PHP INTERNAMENTE GENERE UN REGISTRO EN UNA BASE DE DATOS MYSQL CON LOS VALORES QUE LE PASO DESDE EL ARDUINO…

TENGO REALIZADO Y FUNCIONANDO LO SIGUIENTE:

  1. CONEXION VIA WIFI!
  2. LA PROGRAMACION PHP QUE INSERTA LOS VALORES EN LA BBDD MYSQL.
    ES DECIR EL EJEMPLO HARIA LO SIGUIENTE: EJECUTANDO DESDE UN EXPLORADOR:
    WWW.MIDOMINIO.COM/ADD.PHP?FECHA=10-11-2012&HORA=10:22:33&SENSOR1=4&SENSOR2=323&SENSOR3=21
    LO QUE HACE ES GENERAR UN REGISTRO EN LA BASE DE DATOS MYSQL CON LOS CAMPOS: FECHA, HORA, SENSOR1, SENSOR2, SENSOR3 CON LOS VALORES QUE LE HEMOS PASADO EN LA URL.

ME FALLA LO SIGUIENTE:

  1. NO PUEDO SOMETER LA URL, NO SE PORQUE PERO NO ME HACE NADA…

COPIO EL SIGUIENTE CODIGO QUE ES EL QUE UTILIZO PARA HACERLO, A VER SI VEIS POR DONDE VAN LOS TIROS… PIENSO QUE EL FALLO PUEDE VENIR EN EL PROCEDIMIENTO TERMINAL() O EN EL CODIGO DEL PROCEDIMIENTO LOOP()… AUNQUE NO LO TENGO MUY CLARO… ALGUIEN ME PUEDE ECHAR UN CABLE.

#include <WiFlyHQ.h>
WiFly wifly;


const char mySSID[] = "missid";
const char myPassword[] = "passwifi";
const char site[] = "www.midominio.com";

void terminal();

void setup()
{
  char buf[32];

  Serial.begin(9600);
  Serial.println("Starting");
  Serial.print("Free memory: ");
  Serial.println(wifly.getFreeMemory(),DEC);

  Serial2.begin(9600);
  if (!wifly.begin(&Serial)) {
    Serial.println("Failed to start wifly");
    terminal();
  }

  /* Join wifi network if not already associated */
  if (!wifly.isAssociated()) {
    /* Setup the WiFly to connect to a wifi network */
    Serial.println("Joining network");
    wifly.setSSID(mySSID);
    wifly.setPassphrase(myPassword);
    wifly.enableDHCP();

    if (wifly.join()) {
      Serial.println("Joined wifi network");
    } 
    else {
      Serial.println("Failed to join wifi network");
      terminal();
    }
  } 
  else {
    Serial.println("Already joined network");
  }

  //terminal();

  Serial.print("MAC: ");
  Serial.println(wifly.getMAC(buf, sizeof(buf)));
  Serial.print("IP: ");
  Serial.println(wifly.getIP(buf, sizeof(buf)));
  Serial.print("Netmask: ");
  Serial.println(wifly.getNetmask(buf, sizeof(buf)));
  Serial.print("Gateway: ");
  Serial.println(wifly.getGateway(buf, sizeof(buf)));

  wifly.setDeviceID("Wifly-WebClient");
  Serial.print("DeviceID: ");
  Serial.println(wifly.getDeviceID(buf, sizeof(buf)));

  if (wifly.isConnected()) {
    Serial.println("Old connection active. Closing");
    wifly.close();
  }

  if (wifly.open(site, 80)) {
    Serial.print("Connected to ");
    Serial.println(site);

    /* Send the request */
    wifly.println("GET /ADD.PHP?FECHA=10-11-2012&HORA=10:22:33&SENSOR1=4&SENSOR2=323&SENSOR3=21 HTTP/1.0");
    wifly.println();
  } 
  else {
    Serial.println("Failed to connect");
  }
}

void loop()
{
   if (wifly.available() > 0) {
    char ch = wifly.read();
    Serial2.write(ch);
    if (ch == '\n') {
      /* add a carriage return */
      Serial2.write('\r');
    }
  }

  if (Serial.available() > 0) {
    wifly.write(Serial.read());
  }
}

/* Connect the WiFly serial to the serial monitor. */
void terminal()
{
  while (1) {
    if (wifly.available() > 0) {
      Serial.write(wifly.read());
    }

    if (Serial.available() > 0) {
      wifly.write(Serial.read());
    }
  }
}

el codigo de las funciones terminal() y loop() no lo acabo de tener del todo claro, por lo que no se si es por donde falla el tema. igual es que en el terminal no veo bien el codigo que devuelve el get, porque no asigno al serie de la wifi correctamente los datos… disculpar porque divago un poco con este tema, pues no lo tengo claro… alguien me puede echar un cable…

gracias de antemano… :astonished:

No conozco esa libreria ni sus metodos,pero en la funcion terminal() creo que el condicional while(1) podria provocar un bucle infinito pues siempre es cierto (no lo he probado...)

Hola.
Sería interesante que mostraras la salida que te da el programa por serial, a ver hasta qué punto la ejecución es correcta.
Saludos.

Buenas a todos,

remito el resultado de la ejecución:

Resultado mostrado en el TERA TERM:

Starting
Free memory: 6804
Already joined network
00:05:61:54:eD:16
192.168.66.142
255.255.255.0et ip
192.168.66.1get ip
Wifly-WebClientt optClient
Connected to www.midominio.com
GET /index.html HTTP/1.0

.0Rue
     T  9:3Gv Acn-:
nyx;arto-9CY L L -ITM/<h>tl00aq/
                                dd>q/p r qe hscl tsd>sdi g' atrbpGEitH0>p
                                                                         bh>

Resultado mostrado en el Monitor Serial del propio Arduino:

Starting
Free memory: 6804
$$
set u m 1
exit
$$set sys printlvl 0
exit
$$set comm remote 0
exit
$$show c
exit
$$get ip
exit
$$get opt
exit
$$show c
exit
Already joined network
MAC: $$get mac
exit
00:05:61:54:eD:16
IP: $$get ip
exit
192.168.66.142
Netmask: $$get ip
exit
255.255.255.0
Gateway: $$get ip
exit
192.168.66.1
$$set o d Wifly-WebClient
exit
DeviceID: $$get opt
exit
Wifly-WebClient
$$open www.midominio.com 80
Connected to www.midominio.com
GET /index.html HTTP/1.0

T1  t:8e 1:GrAeen1oion- tat8
C U-ETD T Nhm<a>i0dRut>d>ae/>r w stuthvcoddsbethdesi pror <EetP.<r>od/**

La pagina web INDEX.HTML es un simple HTML de pruebas que muestra lo siguiente:

Hola Arduino, estas conectado al sitio web correctamente

El codigo fuente del HTML es:

<html><head></head><body>Hola Arduino, estas conectado al sitio web correctamente</body></html>

No entiendo porque la respuesta que me da en el monitor, con esta pagina de prueba, no obstante, si someto la pagina PHP que realiza la inserción en la base de datos, tampoco se realiza, con lo cual tampoco la somete correctamente… espero me podais ayudar porque ya estoy perdido perdido…

solucionado!!! :grin:

El problema lo he solucionado cambiando varias cosas:

  1. ampliando la variable buffer:
char buf[512];
  1. Quitando todos los Serial.Print a opartir de que esta abierto el SITE, no se porque, pero por esto fallaba. es decir, quedaría de la siguiente forma (ver codigo abajo):
  2. Añadiendo los encabezados correspondientes en la conexión HTTP. (Ver codigo abajo):
  3. Añadiendo el tamaño del buffer del get en el encabezado tambien. (ver codigo abajo):
  4. Añadiendo “\r\n” despues de someter cada linea. (ver codigo abajo):
  if (wifly.isConnected()) {
    Serial.println("Old connection active. Closing");
    wifly.close();
  }

  Serial.print("Connected to ");
  Serial.println(site);
  
  String myGET = "GET /add.php?fecha=2030-12-12&hora=11:22 HTTP/1.1\r\n";
  
  if (wifly.open(site, 80)) 
  {
    wifly.print(myGET);
    wifly.print("Host: ");
    wifly.print(site);
    wifly.print("\r\n");    
    wifly.print("Accept: */*\r\n");    
    wifly.print("User-Agent: Arduino\r\n");    
    wifly.print("Content-Length: ");
    wifly.print(myGET.length());
    wifly.print("\r\n");
    wifly.print("Connection: close\r\n");
    wifly.println();
    delay(5000);
  } 
  else {
    Serial.println("Failed to connect");
  }
}
  1. Dejando los procedimientos de LOOP() y TERMINAL() de la siguiente forma:
void loop()
{
  if (wifly.available() > 0) {
    char ch = wifly.read();
    Serial.write(ch);
    if (ch == '\n') {
      /* add a carriage return */
      Serial.write('\r');
    }
  }

  if (Serial.available() > 0) {
    wifly.write(Serial.read());
  }
}

/* Connect the WiFly serial to the serial monitor. */
void terminal()
{
  while (1) {
    if (wifly.available() > 0) {
      Serial.write(wifly.read());
    }

    if (Serial.available() > 0) {
      wifly.write(Serial.read());
    }
  }
}
  1. Modificar el tamaño del buffer del puerto serie en el fichero HardwareSerial.CPP ubicado en: “C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino”, dejandolo de la siguiente forma a 512Bytes.
#if (RAMEND < 1000)
  #define SERIAL_BUFFER_SIZE 512
#else
  #define SERIAL_BUFFER_SIZE 512
#endif

Y FUNCIONAAAAAAAAAAAAAAAAAAAAAAA!!!

Arduino arranca, se conecta a la red wifi, obtiene una ip, somete la pagina web con los parametros indicados. Y dicha pagina crea un registro en la base de datos MySQL de mi servidor remoto en internet.