ESP32 wrover http post problems

Ciao a tutti,
ho realizzato una scheda composta da arduino mega e esp8266, comandata tramite seriale e libreria WifiEspAT, che ad un evento specifico invia ad un pagina php (tramite funzione POST ) dei dati prelevati da alcuni sensori. La pagina successivamente si occupa di passarli ad un database sql.
Il sito è impostato senza connessione sicura (http) e tutto funziona bene.
Adesso, per comodità e riduzione degli ingombri, sto facendo un porting su esp32 wrover ma senza successo, infatti non sto riuscendo a scrivere più il database.
Ho inizialmente provato con lo stesso codice della scheda vecchia, senza successo, poi ho fatto delle prove guardando degli esempi su internet, purtroppo anche in questo caso senza alcun risultato.
La stringa per scrivere il database tramite pagina php (testata e funzionante sia da mega che da browser è la seguente:
http://www.mysite.it/admin/system/recive.php?MyKey=abc&Board=Test&A=10&B=20&C=30&D=40&E=50&F=100&G=0&H=200&P=1
La scheda si collega alla rete, invia la funzione, ricevo

HTTP Response code: 200

ma la pagina php non recupera i dati .

Il codice che ho implementato sulla esp32 è questo:

#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>

// Replace with your network credentials
const char* ssid     = "MyNetwork";
const char* password = "1234567890";



// Domain name and URL path or IP address with path
const char* serverName = "http://www.mysite.it/admin/system/recive.php";

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
}

void loop() {

  //Check WiFi connection status
  if (WiFi.status() == WL_CONNECTED) {
    WiFiClient client;
    HTTPClient http;

    //Domain name with URL path or IP address with path
    http.begin(client, serverName);

    // Specify content-type header
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");


    // Prepare HTTP POST request data
    String httpRequestData = "MyKey=abc&Board=Test&A=10&B=20&C=30&D=40&E=50&F=100&G=0&H=200&P=1";
    Serial.print("httpRequestData: ");
    Serial.println(httpRequestData);
    delay(1000);
    // Send HTTP POST request
    int httpResponseCode = http.POST(httpRequestData);

    if (httpResponseCode > 0) {
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
    }
    else {
      Serial.print("Error code: ");
      Serial.println(httpResponseCode);
    }
    // Free resources
    http.end();
  }
  else {
    Serial.println("WiFi Disconnected");
  }
}

Se lo script PHP funziona con quell'indirizzo non è una richiesta POST, ma bensì GET.
Prova a mettere il sorgente anche del PHP.

@santyleo : Ancora un'altro ... ma dove avete imparato a dichiarare le stringhe del 'C' in quel modo orribile? Non che la cosa sia legata al tuo problema, ma dichiarare le stringhe in quel modo è estremanente rischioso ... o si conosce mooooolto bene l'utilizzo dei puntatori o prima o poi vengono fuori dei sicuri casini !!!

Le stringhe del 'C' si dicharano come char array e quindi la giusta definizione è:

...
const char ssid[] = "MyNetwork";
const char password[] = "1234567890";
...
const char serverName[] = "http://www.mysite.it/admin/system/recive.php";
...

Ripeto, NON ha nulla a che vedere con il tuo problema, ma è una pessima abitudine che molti stanno utilizzando ... probabilmente un copia/incolla dall'ennesima bojata trovata su internet :roll_eyes:

Guglielmo

Grazie per l'aiuto, con la vecchia scheda effettuavo un POST.
inserisco il PHP ed anche il vecchio codice.
il php è il seguente:

<?php
    //connect db
    include 'mysql_connect.php';
    $mysqli = new Mysql_ConnectClass();
    $connect = $mysqli->connect_mysql();

    if(isset($_GET['Board'])) {
        if(isset($_GET['MyKey']) && isset($_GET['Board']) && isset($_GET['Test']) && isset($_GET['A']) && isset($_GET['B'])
        && isset($_GET['C'])&& isset($_GET['D'])&& isset($_GET['E']) && isset($_GET['F'])&& isset($_GET['G'])&& isset($_GET['P']))
        {
            $MyKey = $_GET['MyKey'];
            $Board = $_GET['Board'];
            $Test = $_GET['Test'];
            $A = $_GET['A'];
            $B = $_GET['B'];
            $C = $_GET['C'];
            $D = $_GET['D'];
            $E = $_GET['E'];
            $F = $_GET['F'];
            $G = $_GET['G'];
            $P= $_GET['P'];

            $qry_ins_history = "INSERT INTO historical (MyKey,Board,Test,A,B,C,D,E,F,G,H,P,dateInsert)  VALUES ('".$MyKey."','".$Board."', ".$Test.",".$A.",".$B.",".$C.",".$D.",".$E.",".$F",".$G.",".$P.",NOW());";
      
            $insert= $connect->real_query($qry_ins_history);
        }
    }
?>

il codice che usavo con la vecchia soluzione hardware è questo

#include <WiFiEspAT.h>
#include <WiFiClient.h>

const char server = "www.mysite.it";
const char ssid     = "MyNetwork";
const char password = "1234567890";
String strURL = "";
void setup() {

  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
}
void loop() {
  WiFiClient  client;
  if (client.connect(server, 80)) {
    Serial.println("connected to server");
    strURL = "POST /admin/system/recive.php?MyKey=abc&Board=Test&A=10&B=20&C=30&D=40&E=50&F=100&G=0&H=200&P=1";
    strURL += " HTTP/1.1";
    client.println(strURL);
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
    client.flush();
    client.stop();
    Serial.println(strURL);
    delay(10000);
  }
}

Ciao Guglielmo, si ho copiato il codice dal web come avevo precedentemente detto, ed anch'io pensavo fosse errato l'asterisco nella definizione, ma se li levo non mi compila e mi da il seguente errore

invalid conversion from 'const char*' to 'char' [-fpermissive]

sinceramente visto l'errore e la poca conoscenza li ho rimessi.

No, non è un post.
O meglio, comunichi al server che invierai dei dati con il metodo POST, ma poi passi tutte le informazioni nell'url (quindi come un GET).

Infatti il tuo script PHP recupera i parametri passati con l'url usando la supervariabile $_GET (il nome non ti suggerisce nulla? :wink: :wink: :wink: )

Tornando allo sketch, dovrebbe essere sufficiente modificare la riga

    // Send HTTP POST request
    int httpResponseCode = http.POST(httpRequestData);

in

    // Send HTTP GET request
    int httpResponseCode = http.GET(httpRequestData);

Ovvio, guarda cosa hai scritto TU e guarda cosa ho scritto IO ... le parentesi quadre NON sono opzionali!

Guglielmo

in effetti mentre ti postavo il codice ho visto che passava i dati con il GET :sweat_smile:.
ho cambiato il software con la stringa http.GET ma non compila con il seguente errore :no_mouth:

no matching function for call to 'HTTPClient::GET(String&)'

Hai ragione non avevo visto le parentesi, :weary:

Pensavo che la libreria facesse il resto ed invece mi sbagliavo... GET() è senza parametri quindi devi comporre l'url completo prima di chiamare il metodo.

    http.begin("http://www.mysite.it/admin/system/recive.php?MyKey=abc&Board=Test&A=10&B=20&C=30&D=40&E=50&F=100&G=0&H=200&P=1"); //HTTP
    // start connection and send HTTP header
    int httpCode = http.GET();

Testato e Funziona! Grazie mille :star_struck: non avrei mai risolto da sola sopratutto perchè con la vecchia soluzione funzionava anche il POST (mistero).

Probabilmente se vai a vedere nel log php del webserver, avrai qualche warning.

1 Like

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