Pages: [1]   Go Down
Author Topic: Consuta a servidor PHP  (Read 1366 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Estoy con el ejemplo WebClient de la librería Ethernet y tengo un servidor PHP con formularios al cual estoy conectado desde mi arduino. Hasta ahora he probado a realizar consultas con constantes numéricas y funciona perfecto. El problema viene cuando deseo realizar una consulta utilizando una variable, la cual guarda el valor de una tag rfid leída prevíamente. Creo que el error es de sintaxis, pero no he encontrado ejemplos para corregirlo:

Code:
if (client.connect()) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /consulta.php?iden='dato' HTTP/1.0");
    client.println();

La variable es dato de tipo int. ¿Alguien sabe cómo escribirlo dentro del GET?

Gracias de antemano!
« Last Edit: April 18, 2011, 09:04:03 pm by zEtA » Logged

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

Tienes que crear una string nueva, concatenando las que quieras y casteando los datos:

Code:
char buff[20];
int dato_int=5;
float unadato_float=4.345;

String mandar="GET /consulta.php?iden="+String(dato_int)+"&test="+String(dtostrf(unadato_float,5,2,buff))+" HTTP/1.0";

client.println(mandar);

suerte!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias zaktux! Ya lo he solucionado  smiley-grin
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Veréis ahora me ha surgido otro problema. A raíz de los ejemplos básicos de RFID y cliente de la librería Ethernet estoy tratando de leer el código de mi tarjeta para más tarde enviarlo a modo de consulta al servidor PHP. Os enseño los dos códigos y debajo de cada uno os describo los problemas que me surgen:
Quote
#include <SPI.h>
#include <Ethernet.h>

// Definicion de la capa de red y enlace de datos.
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2,4 };          //IP Arduino
byte server[] = { 192,168,2,12 };     // PC Luis
byte gateway[] = { 192,168,2,12 };
byte subnet[] = {255,255,255,0 };
char c = 0;
char val = 0;                         // variable que recibe bytes del puerto serie0 RFID
char code[13] = "000000000000";                  //variable que guarda el valor de la TAG
int prueba=1;                         //variable int de prueba
String mandar="GET /consulta1.php?iden="+String(prueba)+" HTTP/1.0";  //petición de consulta al servidor PHP
// Inicializamos la clase Client de la librería Ethernet
// con la IP y el puerto designados
// que necesitamos para conectar al servidor (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
  // Iniciamos la conexion Ethernet:
  Ethernet.begin(mac, ip);
  // Iniciamos la libreria Serial:
  Serial.begin(9600);
  // Dejamos un delay de 1 segundo
  delay(1000);
  Serial.println("Conectando...");

  // Si conseguimos conectar, lo reportamos a través del serial:
  if (client.connect()) {
    Serial.println("Conectado");
 
  } else {
    Serial.println("No se conectado");
    }
} // void setup

void loop()
{
  if(Serial.available() > 0) {
     
      for (int i = 0; i < 13; i++) {
        val = Serial.read();
        code=val;   
      Serial.print(code, HEX);
     }
     
  Serial.println();
  client.println(mandar);
  client.println();
  delay (3000);
  if(client.available()){
    Serial.println("Enviando peticion");
    while (client.available()){
    char c = client.read();
    Serial.print(c);
    } //while 
} //if(client.available)
 
  if (!client.connected()){
    Serial.println();
    Serial.println("Disconnecting...");
    client.stop();
   client.connect();
   Serial.println("Reconectando...");
   Serial.flush();
  }

} //if(Serial.available)
  } // void loop

Con este código no consigo leer la Tag bien, pues me aparecen valores FFF en hex entre el código de la targeta, pero cuando realiza la consulta al servidor con la variable prueba = 1, éste si le devuelve el dato asociado al identificador 1 de su base de datos. Os enseño el serialmonitor:


2º Código
Quote
#include <SPI.h>
#include <Ethernet.h>

// Definicion de la capa de red y enlace de datos.
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2,4 };          //IP Arduino
byte server[] = { 192,168,2,12 };     // PC Luis
byte gateway[] = { 192,168,2,12 };
byte subnet[] = {255,255,255,0 };
//Definicion variables RFID.
byte i = 0;
byte val = 0;
byte code[12];
byte checksum = 0;
byte bytesread = 0;
byte tempbyte = 0;
int digito1 = 0;
int digito2 = 0;
int digito3 = 0;
int digito4 = 0;
int digito5 = 0;
int digito6 = 0;
//Otras
int prueba=1;
char c = 0;
String mandar="GET /consulta1.php?iden="+String(prueba)+" HTTP/1.0";  //petición de consulta al servidor PHP
// Inicializamos la clase Client de la librería Ethernet
// con la IP y el puerto designados
// que necesitamos para conectar al servidor (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
  // Iniciamos la conexion Ethernet:
  Ethernet.begin(mac, ip);
  // Iniciamos la libreria Serial:
  Serial.begin(9600);
  // Dejamos un delay de 1 segundo
  delay(1000);
  Serial.println("Conectando...");

  // Si conseguimos conectar, lo reportamos a través del serial:
  if (client.connect()) {
    Serial.println("Conectado");
 
  } else {
    Serial.println("No se conectado");
    }
} // void setup

void loop()
{
  if(Serial.available() > 0) {
     
      if((val = Serial.read()) == 2) {                  // Chequeamos la cabecera
      bytesread = 0;
      while (bytesread < 12) {                        // Pasamos a leer los 10 digitos + 2 de checksum
        if( Serial.available() > 0) {
          val = Serial.read();
          if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) { // Si encontramos cabecera o bytes de parada antes de los 10 digitos
            break;                                    // dejamos de leer
          }

          // De Ascii/Hex conversion:
          if ((val >= '0') && (val <= '9')) {
            val = val - '0';
          } else if ((val >= 'A') && (val <= 'F')) {
            val = 10 + val - 'A';
          }

          // Every two hex-digits, add byte to code:
          if (bytesread & 1 == 1) {
            // make some space for this hex-digit by
            // shifting the previous hex-digit with 4 bits to the left:
            code[bytesread >> 1] = (val | (tempbyte << 4));

            if (bytesread >> 1 != 5) {                // If we're at the checksum byte,
              checksum ^= code[bytesread >> 1];       // Calculate the checksum... (XOR)
            };
          } else {
            tempbyte = val;                           // Store the first hex digit first...
          };

          bytesread++;                                // ready to read next digit
        }
      }

      // Output to Serial:

      if (bytesread == 12) {                          // Si la lectura de los 12 digitos está completa
        Serial.println("El codigo de la Tag es: ");
        for (i=0; i<6; i++) {
            Serial.print(code, DEC);
        } //for para sacar por serialmonitor el valor del array de bytes de los digitos
      Serial.println("");
      digito1=code[0];
      digito2=code[1];
      digito3=code[2];
      digito4=code[3];
      digito5=code[4];
      digito6=code[5];
             //Hemos pasado cada casilla del array a una variable de tipo int
      Serial.print(digito1);
      Serial.print(digito2);
      Serial.print(digito3);
      Serial.print(digito4);
      Serial.print(digito5);
      Serial.print(digito6);       
      Serial.println(""); //Imprimimos en serialmonitor los digitos en tipo int para verificarlos
     
      Serial.print("5-byte code: "); // A partir de aquí, como en Playground
      for (i=0; i<5; i++) {
        if (code < 16) Serial.print("0");
          Serial.print(code, HEX);
          Serial.print(" ");
        }
        Serial.println();

        Serial.print("Checksum: ");
        Serial.print(code[5], HEX);
        Serial.println(code[5] == checksum ? " -- passed." : " -- error.");
        Serial.println();
      }
          for (i=0; i<30; i++) {
            code=0;
        }
      bytesread = 0;
    }
     
  Serial.println();
  client.println(mandar); //enviamos la peticion al servidor
  client.println();
  delay (3000);
  if(client.available()){
    Serial.println("Enviando peticion");
    while (client.available()){
    char c = client.read();
    Serial.print(c);
    } //while 
} //if(client.available)
 
  if (!client.connected()){
    Serial.println();
    Serial.println("Disconnecting...");
   client.stop();
   client.connect();
   Serial.println("Reconectando...");
   Serial.flush();
  }

} //if(Serial.available)
  } // void loop

En este segundo, consigo leer la tarjeta sin problemas y mostrarla en decimal para enviarla al servidor. El problema es a la hora de la consulta, pues aunque le vuelvo a pedir que me dé la información asociada al identificador 1, me devuelve esto:


Sólo he cambiado la estructura del código en la parte interna del if(serial.available > 0), por lo que no consigo entender por qué no realiza la consulta al servidor de la misma forma. Por favor, a ver si alguien puede echarme una mano con este problema.

Pido disculpas por si he cargado demasiado el post, pues quería arrojar toda la información posible a vuestra mano y por si he cometido fallos garrafales en el código, pues soy bastante novato con arduino. Gracias de antemano!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Solucionado aparentemente... el problema era que no conseguía enviar la petición client.println(mandar).

Utilizando el 2º código y en vez de guardar la petición GET en el string "mandar" para enviarlo por el cliente, lo que he hecho ha sido enviar la petición directamente... lo que no entiendo es por qué de esta forma sí lo envía y la anterior no... ¿será que puede haber conflicto al declarar y usar una variable que contiene otra? En fin, sólo espero que no vuelva a darme problemas más adelante.
Saludos.
Logged

Pages: [1]   Go Up
Jump to: