Problemas con PHP GET + BD

Hola, buenas, estoy realizando un proyecto en un Arduino UNO con Ethernet shield que obtiene mi ip pública y la sube (por php) a mi base de datos mysql.

La parte de obtener la ip ya la tengo hecha y funciona, pero el problema es que al querer mandar el dato con un GET, no ocurre nada y el Serial no muestra ningún error de conexión

Os dejo el código para que lo entendáis:

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address

char serverIPPublic[] = "icanhazip.com"; // para obtener la ip
char sqlServer[] = "*Mi servidor*";
String extip = "";
EthernetClient client;


//////////////////////

void setup(){

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    while(true);
  }

  Serial.begin(9600);
}

void loop(){
  // check for serial input

Serial.println("Obteniendo IP");

      String ipPublica = getIP(serverIPPublic); //llamo a la función de obtener la ip

      extip = ipPublica;
      Serial.println(ipPublica);
      delay(1000);
      Serial.println("Y ahora mandamos la ip por sql ");
      Serial.println(extip);
      sendSQL();
      
  delay(9000);
}

//////////////////////////

String getIP(char server[]){
  EthernetClient getIPpublic;
  String ipPublic;
  String webIP;
  int fin=0;
    if (getIPpublic.connect(server, 80)) {
          getIPpublic.println("GET / HTTP/1.1"); 
          getIPpublic.print("Host: ");
          getIPpublic.println(server);
          getIPpublic.println("Connection: keep-alive");
          getIPpublic.println();
         Serial.println("Conectado"); 
          //Serial.println("enviadoMsgIP");
          delay(100);
          
          while(getIPpublic.connected()){
            if(getIPpublic.available()){
              char c = getIPpublic.read();
              //if(c!= 'n' && c != 'r') {
                webIP.concat(c);
              //}
            } 
          }
         Serial.println("Ya he hecho la conversión"); 
          getIPpublic.stop();  
          int desde = webIP.indexOf("\r\n\r\n") + 4;
          ipPublic = webIP.substring(desde,webIP.length()-1); 
     }
        
     return ipPublic;
}


void sendSQL() {
   if (client.connect(sqlServer, 80)) {  // Conexion con el servidor
    client.print("GET /ardget.php?ip="); // Enviamos los datos por GET
    client.print(extip);
    client.println(" HTTP/1.0");
    client.println("Host: Mi servidor*");
    client.println();
    Serial.println("Conectado");
  } else {
    Serial.println("Fallo en la conexion");
  }
  if (!client.connected()) {
    Serial.println("Disconnected!");
  }
  client.stop();
}

Estoy enviando el get a un fichero llamado “ardget.php” en mi server.
Si desde mi navegador hago un request ‘Mi servidor*/ardget.php?ip= Loquesea’, se envia todo bien y me aparece en la base de datos.
También os dejo el código php(aunque no creo que este mal):

<php?

*datos de conexión*

$ipget = $_GET['ip'];

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
}

$sql = "INSERT INTO `*mibd*`.`*mitabla*` (`ip`, `id`) VALUES ('". $ipget . "', '1')";
$result = $conn->query($sql);
    // Ejecutamos la instrucción
$conn->close();

echo "Done";

He intentado modificar el código del arduino de diversas formas y copiando cosas de este foro (y del webview), pero no funciona. ¿Qué estoy haciendo mal?

Muchas gracias :slight_smile:


Nota: he cambiado mi información privada por ‘**’ (por si alguien cree que lo tengo así puesto)

si puedes emula la salida que te da el arduino con un terminal como hyperterminal en modo TCP, coloca las ordenes GET y ve por la respuesta,

es decir primero asegurar que la orden tal como sale del Arduino funciona justo como esperas, al igual la respuesta de tu server, algunas veces solo el agregado de un \n retorno de linea arregla las cosas, mira tambien si esta bien la ruta a tu script php si es /script.php ó ../script.php

tambien habilita la depuracion en PHP (debug info) para mostrar en pantalla en que parte se queda el programa por ejemplo usa printf para ver que valor tomo cada variable que envias desde tu placa

$imei = $_GET['imei'];

printf("Device ID: $imei\r\n");

Hola, hay partes de tu mensajes que no he entendido, pero te cuento qué he hecho;

He descargado Hyperterminal y con el arduino IDE cerrado, he establecido una conexión con el COM10 (mi arduino), me muestra los serial.println que yo le he puesto y envía los datos al servidor. (que funciona) Pero al cerrar la conexión ya no funciona, y con el terminal de arduino tampoco me hace el GET.

Sobre tu respuesta, cómo activo la depuración php y dónde?

¿Qué debo hacer ahora? Muchas gracias

Vale, corrijo, he vuelto a subir el código al arduino y ahora no funciona ni en hyperterminal. Tengo un código que sólo envía "abc" al servidor y la primera vez que lo probé funcionó con hyperterminal, pero después he modificado el "abc" por "aa" y no funciona. No recuerdo haber modificado otra cosa

en tu php.ini

error_reporting = E_ALL display_errors = On

, bueno, primero asegurate que tu script este haciendo lo correcto, lo que yo decia era probarlo por TCP por hyperterminal, pero tambien puedes invocarlo desde un browser, habilita los errores de PHP y mira que da de resultado

por el lado del arduino asegurate de que haga correcta la sesion TCP/IP consultando por ejemplo a google usando este tuto

https://www.arduino.cc/en/Tutorial/WebClient

Hola, no tengo un server dedicado, no tengo acceso al php.ini pero tengo el .htaccess y le he puesto que muestre errores (pero no puedo loguear los errores porque no tengo acceso al archivo del log de errores).

La primera vez probé con TCP poniendo mi host y me da un error con el puerto en 23 y en 80.

El problema es que a mi desde browser me funciona perfectamente y es muy rápido, pero el problema es que arduino no se conecta o no da la orden.

Al principio del post dije que había probado con el ejemplo del webclient y sí, funciona, (aunque ese ejemplo está anticuado porque la url que usa se ha movido de sitio xd).

E incluso he puesto al final del script php un echo"Done" para saber si compila y en navegador me lo muestra.