Forum: Mikrocontroller und Digitale Elektronik ESP8266 http POST Request funktioniert nicht


von Alex S. (elektrogaertner)


Lesenswert?

Hallo Zusammen,

habe jetzt 10 Tage lang abends mehrere Stunden rumprobiert und komme 
nicht auf meinen Fehler.

Problem:
Ich möchte mit einem ESP8266 NodeMCU Modul V2 Sensorwerte in eine 
Datenbank auf meiner NAS speichern.

Die Datenbank ist eingerichtet, dann gibt es dazu eine php-Datei, die 
die gesendeten POST-Werte in die DB schreibt. Das ganze liegt hier: 
"192.168.178.36/demo" (hier liegt die eintragen5.php und zum Test eine 
formular.html mit der über 2 Formularfelder die beiden gleich benamten 
POST Werte an eintragen5.php übergeben werden können). Damit klappt der 
Eintrag in die DB auch einwandfrei. Das ganze läuft über http und nicht 
über https.

Kriege auch über den Browser problemlos bei Eingabe des Pfads 
"192.168.178.36/demo" die dort ebenfalls liegende "index.html" 
angezeigt.

Das Programm auf dem ESP8266 ist wie folgt programmiert (Code kopiert 
und angepasst, meine wLan Daten natürlich anonymisiert):

Übergebe auch erstmal nur statische Werte. Wenn das klappt, später dann 
Sensorwerte.


1
/*
2
 * HTTP Client POST Request
3
 * Copyright (c) 2018, circuits4you.com
4
 * All rights reserved.
5
 * https://circuits4you.com 
6
 * Connects to WiFi HotSpot. */
7
8
#include <ESP8266WiFi.h>
9
#include <WiFiClient.h> 
10
#include <ESP8266WebServer.h>
11
#include <ESP8266HTTPClient.h>
12
13
/* Set these to your desired credentials. */
14
const char *ssid = "meinWlan";  //ENTER YOUR WIFI SETTINGS
15
const char *password = "meinPasswort";
16
17
//Web/Server address to read/write from 
18
const char *host = "192.168.178.36";   //https://circuits4you.com website or IP address of server
19
20
//=======================================================================
21
//                    Power on setup
22
//=======================================================================
23
24
void setup() {
25
  delay(1000);
26
  Serial.begin(115200);
27
  WiFi.mode(WIFI_OFF);        //Prevents reconnection issue (taking too long to connect)
28
  delay(1000);
29
  WiFi.mode(WIFI_STA);        //This line hides the viewing of ESP as wifi hotspot
30
  
31
  WiFi.begin(ssid, password);     //Connect to your WiFi router
32
  Serial.println("");
33
34
  Serial.print("Connecting");
35
  // Wait for connection
36
  while (WiFi.status() != WL_CONNECTED) {
37
    delay(500);
38
    Serial.print(".");
39
  }
40
41
  //If connection successful show IP address in serial monitor
42
  Serial.println("");
43
  Serial.print("Connected to ");
44
  Serial.println(ssid);
45
  Serial.print("IP address: ");
46
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP
47
}
48
49
//Main Loop
50
void loop() {
51
  HTTPClient http;    //Declare object of class HTTPClient
52
53
  String postData;
54
  String sensor_id = "124";
55
  String messwert  = "41";
56
57
  //Post Data
58
  postData = "sensor_id=" + sensor_id + "&messwert=" + messwert ;
59
  
60
  http.begin("192.168.178.36/demo/eintragen5.php");              //Specify request destination
61
62
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");    //Specify content-type header
63
64
  //Ausgabe zur Prüfung
65
  Serial.println(postData);
66
 
67
  
68
  int httpCode = http.POST(postData);   //Send the request
69
  String payload = http.getString();    //Get the response payload
70
71
  Serial.println(httpCode);   //Print HTTP return code
72
  Serial.println(payload);    //Print request response payload
73
74
  http.end();  //Close connection
75
  
76
  delay(2000);  //Post Data at every 2 seconds
77
}


Ausgabe Serieller Monitor:
#############################
Connecting.....
Connected to meinWlan
sensor_id=124&messwert=41
-1

sensor_id=124&messwert=41
-1

#############################



PHP Skript "eintragen5.php"

1
<?php
2
//Creates new record as per request
3
    //Connect to database
4
    $servername = "192.168.178.36:3307";
5
    $username = "raspberry";
6
    $password = "meinPasswort";
7
    $dbname = "raspberry";
8
 
9
    // Create connection
10
    $conn = new mysqli($servername, $username, $password, $dbname);
11
    // Check connection
12
    if ($conn->connect_error) {
13
        die("Database Connection failed: " . $conn->connect_error);
14
    }
15
 
16
    if(!empty($_POST['sensor_id']) && !empty($_POST['messwert']))
17
    {
18
      $sensor_id = $_POST['sensor_id'];
19
      $messwert = $_POST['messwert'];
20
 
21
      $sql = "INSERT INTO sensordaten (messwert, sensor_id)
22
    
23
    VALUES ('".$messwert."', '".$sensor_id."')";
24
 
25
    if ($conn->query($sql) === TRUE) {
26
        echo "OK" . "<br><br>";
27
    } else {
28
        echo "Error: " . $sql . "<br>" . $conn->error;
29
    }
30
  }
31
 
32
  $conn->close();
33
34
echo "Sensor-ID:  " . $_POST['sensor_id'] . "<br><br>" . "Messwert:  " . $_POST['messwert'];
35
36
?>


Ich bin mir sicher, dass es ein saublöder Fehler meinerseits ist, den 
ich einfach nicht sehe... Würde mich freuen, wenn einer von Euch helfen 
kann.

Besten Dank im voraus!

von Drago S. (mratix)


Lesenswert?

Alex S. schrieb:
> -1
Er konnte nicht hinaus gehen und den Webserver (auf dem Raspi) 
kontaktieren.

> Serial.println(httpCode);   //Print HTTP return code
Hier sollte ein 3-stelliger Response zurückkommen.

Was sagen die Apache/Nginx access+error logs?

Auf den ersten Blick sieht mir der httpclient relativ kurz und 
lückenhaft aus.

z.B. sehe ich keinen initialen Verbindungsaufbau i.F.
1
http.connect(host, httpPort);

Danach kann erst
> http.begin("192.168.178.36/demo/eintragen5.php");              //Specify request 
destination
durchlaufen.

Hier 
[https://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/] 
ist ein schönes Projekt, Schritt für Schritt. Schau dir mal den Teil mit 
Webserver (Display) und Webclient (Außensensor) an. Ist ganz gut und 
verständlich erklärt.

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Fehlt da nicht das http:// vor der IP bei http.begin?

von Coronianer (Gast)


Lesenswert?

Alex S. schrieb:
> habe jetzt 10 Tage lang abends mehrere Stunden rumprobiert und komme
> nicht auf meinen Fehler.

Und warum debugst Du dann nicht richtig und schaust mal in den 
Quellcode?


>   http.begin("192.168.178.36/demo/eintragen5.php");

1. In 
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp#L268 
siehst Du, dass begin einen Bool-Wert zurückliefert. Warum wertest Du 
den nicht aus?
2. In 
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp#L284 
siehst Du, dass Du das Protokoll mitgeben musst. Wieso machst Du das 
nicht?


> Ich bin mir sicher, dass es ein saublöder Fehler meinerseits ist, den
> ich einfach nicht sehe... Würde mich freuen, wenn einer von Euch helfen
> kann.

Der einzige saublöde Fehler ist, dass Du nicht systematisch und 
vernünftig vorgehst. Insbesondere die Doku der API sollte man wenigstens 
gelesen haben.
Copy&Paste von irgendwelchen Webseiten gemacht? Grosser Fehler!

von Alex S. (elektrogaertner)


Lesenswert?

Hallo Zusammen,

danke für die Antworten, die mich aber leider nicht weitergebracht 
haben.
Es braucht keinen "initialen Verbindungsaufbau" wie (mratix) meinte. 
Ebenso wenig ein Protokoll beim .begin-Aufruf wie (Coronianer) meinte.

Also Coronianer, lies Du gerne weiter mehrere hundert Zeilen lange 
API-Beschreibungen wenn Du eine klitzekleine Sache haben willst. Ich 
nehme gern auch mal was, das andere bereits gelöst haben...

Damit andere mit einem ähnlich "niedrigen" Anspruch wie ich sehen, dass 
man sehr wohl auch mal Copy-Paste machen kann, hier die Lösung für mein 
Problem. Gefunden auf: https://github.com/esp8266/Arduino/issues/2979
1
void loop() {
2
 
3
 if(WiFi.status()== WL_CONNECTED){   //Check WiFi connection status
4
 
5
HTTPClient http;
6
String message="sensor_id=123&messwert=89";
7
http.begin("http://192.168.178.36/demo/eintragen5.php");
8
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
9
int httpCode = http.POST(message);
10
if(httpCode > 0) {
11
  Serial.printf("[HTTP] POST... code: %d\n", httpCode);
12
  if(httpCode == HTTP_CODE_OK) {
13
            String payload = http.getString();
14
            Serial.println(payload);
15
        }
16
    } else {
17
        Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
18
    }
19
http.end();
20
21
 }else{
22
 
23
    Serial.println("Error in WiFi connection");   
24
  }
25
 
26
  delay(600000);  //Send a request every 600 seconds
27
 
28
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.