Forum: Mikrocontroller und Digitale Elektronik Werte vom ESP an Webserver übertragen - Bad Request


von Kolja L. (kolja82)


Lesenswert?

Nabend nochmal


Ich würde gerne Daten vom ESP auf meinen Webserver übertragen.
Das Script ist recht simpel:
1
void senden()
2
{
3
  WiFiClient client;
4
  const int httpPort = 80;
5
  if (!client.connect(host, httpPort)) {
6
    Serial.println("connection failed");
7
    return;
8
  }
9
10
  scan();
11
12
13
  String url = "/wama/";
14
  url += sendto;
15
  url += "?wama_1=";
16
  url += acc1;
17
  url += "&wama_2=";
18
  url += acc2;
19
20
  client.println();
21
  client.println(String("GET ") + url + " HTTPS/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
22
  Serial.print(String("GET ") + url + " HTTPS/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
23
24
  delay(10);
25
26
  unsigned long timeout = millis();
27
  while (client.available() == 0) {
28
    if (millis() - timeout > 5000) {
29
      Serial.println(">>> Client Timeout !");
30
      client.stop();
31
      return;
32
    }
33
  }
34
  while (client.available()) {
35
    String line = client.readStringUntil('\r');
36
    Serial.print(line);
37
  }
38
39
}

Leider werden keine Daten in die Datenbank eingetragen,
was auf manuellem Wege im Browser jedoch funktioniert.

Über die serielle Ausgabe bekomme ich folgendes zu lesen:
1
15964
2
15796
3
GET /wama/collectdata.php?wama_1=15964&wama_2=15796 HTTPS/1.1
4
Host: www.xxx.xx
5
Connection: close
6
7
HTTP/1.1 400 Bad Request
8
Date: Wed, 16 May 2018 20:38:18 GMT
9
Server: Apache
10
Vary: Accept-Encoding
11
Content-Length: 226
12
Connection: close
13
Content-Type: text/html; charset=iso-8859-1
14
15
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
16
<html><head>
17
<title>400 Bad Request</title>
18
</head><body>
19
<h1>Bad Request</h1>
20
<p>Your browser sent a request that this server could not understand.<br />
21
</p>
22
</body></html>

Die Funktion Scan() schreibt die beiden Zahlen in die Ausgabe und in die 
beiden Variablen.

Kan jemand von euch etwas mit dieser "Fehlermeldung" anfangen?

Danke und Gruß

von Oliver S. (phetty)


Lesenswert?

Nimm stattdessen mqtt, ist erstmal was komplizierter aber zum übertragen 
von Messwerten sinnvoller.

von Kolja L. (kolja82)


Lesenswert?

Danke für den Hinweis, aber das Skript, die Datenbank, die Auswertung 
und die Webseite sind schon fertig.
Daher würde ich, wenn der Fehler nicht grundlegend ist, gerne diesen Weg 
weitergehen.

von Tom (Gast)


Lesenswert?

Der ESP kann https?

von Kolja L. (kolja82)


Lesenswert?

Die Webseite zumindest nicht...
Aber auch ohne das "S" in dem Aufruf gibt es den selben Fehler

: Bearbeitet durch User
von Pop (Gast)


Lesenswert?

Suche den Fehler PHP seitig auf dem Webserver mit den unter Linux 
Bekannten Möglichkeiten.

Tcpdump | Grep wama, etc...
Hier scheint das Problem zu liegen.

von yesitsme (Gast)


Lesenswert?

1
  url += acc2;
2
3
  client.println();
4
  client.println(String("GET ") + url + " HTTPS/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");

->
1
  url += acc2;
2
3
  client.print(String("GET ") + url + " HTTP/1.0\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");

Geht das so besser?

von Kolja L. (kolja82)


Lesenswert?

So funktioniert es:
1
void senden()
2
{
3
  WiFiClient client;
4
  const int httpPort = 80;
5
  if (!client.connect(host, httpPort)) {
6
    Serial.println("connection failed");
7
    return;
8
  }
9
10
  scan();
11
12
13
  String url = "/wama/";
14
  url += sendto;
15
  url += "?wama_1=";
16
  url += acc1;
17
  url += "&wama_2=";
18
  url += acc2;
19
20
  client.println();
21
22
  client.println(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
23
  client.println(url.length());
24
  Serial.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
25
26
  delay(10);
27
28
  unsigned long timeout = millis();
29
  while (client.available() == 0) {
30
    if (millis() - timeout > 5000) {
31
      Serial.println(">>> Client Timeout !");
32
      client.stop();
33
      return;
34
    }
35
  }
36
  while (client.available()) {
37
    String line = client.readStringUntil('\r');
38
    Serial.print(line);
39
  }
40
41
}

aber die Waschmaschine wackelt nicht genug :-(

von yesitsme (Gast)


Lesenswert?

Hmm... du haust dem Server immer noch als erstes einen Zeilenumbruch um 
die Ohren... Ich denke es is nur eine Frage der Zeit bis das kaputt 
geht.

Kolja L. schrieb:
> aber die Waschmaschine wackelt nicht genug :-(

Einfach die Transportsicherung wieder reinschrauben... *duck und 
wegrenn*

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

wie yesitsme schon schrieb,
1
  client.println();
hat vor dem Header nichts zu suchen.

Und was soll das nach dem Header?
1
  client.println(url.length());

Sascha

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.