Connessione a Database Altervista con Arduino Wifi Shield

Buongiorno e buon anno. Vorrei realizzare un semplice progetto in cui viene letto da Arduino un numero intero da un sensore collegato ad un Pin digitale e questo dato viene inviato ad un Database residente su Altervista.
Sono riuscito a fare il collegamento con Ethernet Shield 2 ma non riesco ad inviare il dato con la Shield WiFi.
Utilizzo un Arduino Uno R3 e una Arduino Wifi Shield R3. Ho effettuato l'aggiornamento della WiFi Shield al firmware 1.1.0.
Uso Arduino IDE 1.8.13.
La WiFi Shield sembra essere connessa, ma lato server sql non riceve nessun dato.
Provo a inserire il codice della parte dello sketch che serve per la connessione

char server[] = "www.casadomoticaipsia.altervista.org";
.
.
.

  if (client.connect(server, 80)) {
    Serial.println("connected");
    sprintf(buffer, "%s%s%s/%d/%s", "GET http://", server, "/arduino/progetti/consolazione/prova.php", ingressi, "HTTP/1.1" );
    Serial.println( buffer );
    client.println(buffer);
    client.println();
    client.println();
  }

  while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }

Metti anche il sorgente del file PHP (mascherando username e password database).
Sul serial monitor che output hai?
Sarebbe utile anche il log PHP (lo trovi nei file del server)

Ciao e grazie per la risposta. Il file log non riesco a trovarlo.
Il codice PHP è il seguente

<?php
// inclusione del file di connessione
include "connessioneDatabase.php";

$_path_info = array();
  
if (!empty($_SERVER['PATH_INFO'])) 
{
        $_path_info = explode( '/',$_SERVER['PATH_INFO'] );
} 
else 
{
        die( "ERROR001" );
}

 // Recupero dai dati inviati da Arduino i valori dei sensori che mi servono

$Ingressi = $_path_info[1];


// stringa di connessione al DBMS
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);


//Inserimento dati nel database: tabella ingressi
$Data = date("d/m/y");
$Orario = date("H:i:s");

$sql = "INSERT INTO ingressi  
VALUES ('$Data', '$Orario', '$Ingressi')";
$result = $conn->query($sql);
if (!$result) 
{
 die('Query Errata: ' .$conn->error);
}
If ($result == false) 
{
die('Errore inserimento dati ingressi'); 
exit;
} 
else
{
die('Inserimento dati ingressi riuscito'); 
return; 
}
$conn->close();
die(); 
?> 

Mentre l'output su Monitor seriale è:

Attende di connettersi a SSID: SSID: Vodafone-Home93
IP Address: 192.168.1.28
signal strength (RSSI):-59 dBm
Millis: 25025
Ingresso: 0
E' trascorso 1 minuto
connecting...
connected
GET http://www.casadomoticaipsia.altervista.org/arduino/progetti/consolazione/prova.php/0/HTTP/1.1

disconnecting.
Millis: 26303
Ingresso: 0

E' trascorso 1 minuto
connecting...
connected
GET http://www.casadomoticaipsia.altervista.org/arduino/progetti/consolazione/prova.php/0/HTTP/1.1

disconnecting.
Millis: 35329

E' sempre bene "ritornare" sempre qualcosa al client cosi da sapere se c'è stato qualche errore, se la connessione è andata a buon fine etc ect...

Ad esempio invece di usare l'istruzione die() che non fa altro che terminare lo script, prova ad usare echo() cosi lo script continua ad essere eseguito.

Ad esempio questo blocco di istruzioni non sarà mai eseguito in caso di query non riuscita perché l'istruzione if (!$result) precedente termina lo script. In caso positivo invece, termini lo script e lasci la connessione al DB inutilmente aperta.


If ($result == false) 
{
die('Errore inserimento dati ingressi'); 
exit;
} 
else
{
die('Inserimento dati ingressi riuscito'); 
return; 
}

Ad ogni modo, il problema principale è proprio la query SQL perché passi solo i VALUES senza specificare in quali campi vanno inseriti.
Dovrebbe essere qualcosa del genere (ovviamente con i nomi che hai assegnato tu):

$sql = "INSERT INTO ingressi  
('field1', 'field2', 'field3')  VALUES ('$Data', '$Orario', '$Ingressi')";

Non credo che il problema sia quello, perché mi pare di aver letto che se passo dati per tutti i campi di una tabella non c'è bisogno di specificare i campi, comunque l'ho messi e ho cambiato i die con echo.
Questo è il risultato della query:
ERROR001Query Errata: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''data', 'orario', 'num_persone') VALUES ('02/01/24', '15:42:16', '')' at line 1Errore inserimento dati ingressi

Come vedi non è presente l'unico dato che dovrebbe arrivare da Arduino, quindi questo mi fa pensare che c'è qualche problema nell'invio del dato che invece con la stessa sintassi viene inviato con Ethernet invece di WiFi.

Ok, ho guardato con più attenzione l'output del monitor seriale ed in effetti la richiesta GET non è costruita bene. Manca di sicuro uno spazio prima di HTTP/1.0
Probabilmente è per quello che non viene correttamente recuperato il $_path_info

Inoltre in questo modo stai trattando la variabile come fosse una stringa, non è che nella tabella invece è definita come intero? Anche se immagino che MySQL poi faccia da solo...

Ma perché il parametro invece non lo passi come richiesta GET invece di "inglobarlo"nell'endpoint? Ovviamente adeguando lo script con le istruzioni relative

...../progetti/consolazione/prova.php?num_persone=0 HTTP/1.1

Ho messo lo spazio, ma il problema è che se funziona con Ethernet vuol dire che l'errore non è nella sintassi, ci deve essere qualcosa nel fatto che si usa WiFi

In teoria un Client dovrebbe essere indipendente dal layer di trasporto utilizzato.

Ho provato ad inserire da browser la stringa http://www.casadomoticaipsia.altervista.org/arduino/progetti/consolazione/prova.php/80
ed il risultato è stato dati inseriti e se vado a vedere la tabella nel server il dato è stato registrato.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.