ESP8266 > PHP > mariaDB | Übergabe der POST-Werte will nicht klappen

Hallo zusammen,

ich habe als ESP-Newbie ein kleines Problem mit der Übergabe von Daten an ein serverseitiges PHP-File.
Kurz der UseCase:
ESP8266 soll per DHT22 Temp & Humidity erfassen und per Wifi an eine PHP-Datei auf einem entfernten Server schicken (LAMP). Die Datei schreibt per INSERT in eine Tabelle (mariaDB).

Was klappt?

Was klappt nicht?

  • Die Übergabe der Messwerte an das php File (denke ich). Oder der String, oder oder oder - keine Ahnung.

Ich hoffe wirklich, dass mir hier jemand helfen kann…
Danke auf jeden Fall schonmal vorab,

Ch.

LUA

#include <DHT.h>
#include <ESP8266WiFi.h>
 
WiFiClient client;
 
#define DHTPIN 4 // SENSOR PIN
#define DHTTYPE DHT22 // SENSOR TYPE - THE ADAFRUIT LIBRARY OFFERS SUPPORT FOR MORE MODELS
DHT dht(DHTPIN, DHTTYPE);
 
const char* ssid     = "Mein Netzwerk";
const char* password = "Passwort";
const char server[] = "meinedomain.de"; 
 
void setup() {
 
  Serial.begin(9600);
  delay(100);
 
  // Blinker
  pinMode(0, OUTPUT);
 
  // Los gehts mit der Verbindung zum WiFi Netzwerk
 
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
   // blink (100, 20, 10);
  }
 
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
 
  // DHT Messung
  dht.begin(); 
  Serial.println("sensor inizialized");
  delay(5000); // GIVE THE SENSOR SOME TIME TO START
 
  int sensorTemp = dht.readTemperature(); 
  Serial.println("temp sensor read");
  int sensorHum = dht.readHumidity(); 
  Serial.println("hum sensor read");
 
  Serial.println(sensorTemp);
  Serial.println(sensorHum);
  Serial.println("\nStarting connection to server..."); 
 
//die IP des Servers auf dem du die Daten ablegen willst
//IPAddress server(111, 111, 11, 111); 
//Serial.println(server);
 
if (client.connect(server, 80)) {
Serial.println("connected!!");
WiFi.printDiag(Serial);

String data = "temp="
        + (String) sensorTemp
        +  "&humi="  
        +(String) sensorHum;
     client.println("POST /connect2.php HTTP/1.1"); 
     client.print("Host: 111.111.11.111\n");                 
     client.println("User-Agent: ESP8266/1.0");
     client.println("Connection: close");
     client.println("Content-Type: application/x-www-form-urlencoded");
     client.print("Content-Length: ");
     client.println(data.length());
     client.print("\n\n");
     client.println (data);
     client.stop(); 
     Serial.println("\n");
     Serial.println("My data string im POSTing looks like this: ");
     Serial.println(data);
     Serial.println("And it is this many bytes: ");
     Serial.println(data.length());       
     delay(2000);
     client.stop();
    } 
  
} 
 
//Serial.println("Going into deep sleep for xx seconds");
//ESP.deepSleep(20e6); // e.g. 20e6 is 20 seconds
 
 
void loop() {
// nothing here
}
 
void blink(int t1, int t0, int n) {
// Schaltet LED ein und aus. Übergabeparameter: Millisekunden Ein, 
// Millisekunden aus, Anzahl Blinks
// Optional - ggf. weglassen, um Strom zu sparen
  int i = 0;
  while (i <= n) {
    digitalWrite(0, HIGH);
    delay(t1);
    digitalWrite(0, LOW);
    delay(t0);
    i++;}
}

PHP-Skript

<?php
$servername = "111.111.111.111";
$username = "User";
$password = "DBPassword";
$dbname = "DBName";
$temp = $_REQUEST['temp'];
$humi = $_REQUEST['humi'];
//date_default_timezone_set('America/Toronto');
//$date=date('m-d-Y H:i:s') ;


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

$sql = "INSERT INTO hello_arduino (temp, humi)
VALUES ('$humi', '$temp')";

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "
" . $conn->error;
}

$conn->close();
?>

Das ist nicht POST, sondern GET.
Widerspricht also dem REST oder restfull Prinzip.

client.println("POST /connect2.php HTTP/1.1");

Hier sendest du einen POST Request.

Wenn dein PHP Programm dagegen einen GET Request erwartet, wird das versagen.

Hallo @combie,

Danke erstmal für die Rückmeldung und die Erklärung. Mal ganz DAU gefragt: Muss ich dann einfach POST gegen GET im LUA-Sketch austauschen?

Danke
Ch

POST Daten werden im Body eines Requests gesendet.
GET Daten in der URL übergeben. Da bleibt der Body leer.

Danke Dir - das hat mich auf den richtigen Weg gebracht. Hier der Code, der jetzt auch läuft:

String data = "/connect2.php?";
   data += "temp=";
   data += (String) sensorTemp;
   data += "&humi=";  
   data += (String) sensorHum;
    
  Serial.println(data);
  
  client.print(String("GET ") + data + " HTTP/1.1\r\n" +
              "Host: " + server + "\r\n" + 
               "Connection: close\r\n\r\n");
  delay(50);