Forum: Mikrocontroller und Digitale Elektronik ESP will Domain nicht aufrufen.


von Kolja L. (kolja82)


Lesenswert?

Guten Morgen

Ich möchte mit einer NodeMCU (ESP88266) drei DHT22 Sensoren auslesen und 
die Werte mit einem URL-String an ein PHP Skript übermitteln.

Hier erstmal der Sketch:
1
#include <OneWire.h>
2
#include <DallasTemperature.h>
3
#include <WiFiClient.h>
4
#include <ESP8266WebServer.h>
5
#include <ESP8266mDNS.h>
6
#include <ESP8266WiFi.h>
7
#include "dht.h"
8
#include <SPI.h>
9
#include <Wire.h>
10
#include <NTPClient.h>
11
#include <WiFiClient.h>
12
13
#define DHT1_PIN 4
14
#define DHT2_PIN 0
15
#define DHT3_PIN 2
16
17
dht DHT1;
18
dht DHT2;
19
dht DHT3;
20
21
const char* ssid      = "xxx";
22
const char* password  = "xxx";
23
const char* host      = "www.xxx.de";
24
const char* sendto    = "collectdata.php";
25
ESP8266WebServer server(80);
26
27
void setup() {
28
  Serial.begin(115200);
29
  delay (500);
30
  WiFi.begin(ssid, password);
31
  Serial.println("");
32
  while (WiFi.status() != WL_CONNECTED) {
33
    delay(250);
34
    Serial.print(".");
35
  }
36
  Serial.println(".");
37
  Serial.println(WiFi.localIP());
38
}
39
40
void loop() {
41
  senden();
42
  delay (1500);
43
  //  serial();
44
}
45
46
47
void senden()
48
{
49
  WiFiClient client;
50
  const int httpPort = 80;
51
  if (!client.connect(host, httpPort)) {
52
    Serial.println("connection failed");
53
    return;
54
  }
55
  DHT1.read22(DHT1_PIN);
56
  DHT2.read22(DHT2_PIN);
57
  DHT3.read22(DHT3_PIN);
58
59
  String url = "/Tomaten/";
60
  url += sendto;
61
  url += "?a=";
62
  url += DHT1.humidity;
63
  url += "&b=";
64
  url += DHT1.temperature;
65
  url += "&c=";
66
  url += DHT2.humidity;
67
  url += "&d=";
68
  url += DHT2.temperature;
69
  url += "&e=";
70
  url += DHT3.humidity;
71
  url += "&f=";
72
  url += DHT3.temperature;
73
74
  server.send(200, "text/plain", "Alles gut" );
75
  Serial.println(url);
76
  Serial.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
77
  client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
78
  delay(10);
79
}

Ganz unten in den letzten Zeilen wird die URL aus url und Host 
aufgerufen.
Die serielle Ausgabe bringt mich leider auch nicht weiter
1
...
2
192.168.178.59
3
/Tomaten/collectdata.php?a=0.00&b=0.00&c=0.00&d=0.00&e=0.00&f=0.00
4
GET /Tomaten/collectdata.php?a=0.00&b=0.00&c=0.00&d=0.00&e=0.00&f=0.00 HTTP/1.1
5
Host: www.xxx.de
6
Connection: close

Wenn die URL im Browser aufgerufen wird, werden die Werte (hier nur 
0.00) in sqlite gespeichert.
Der ESP ist mit der angezeigten IP im WLAN zu finden.
Es wurde mit drei Modellen getestet.
Der ESP (jaja, NodeMCU) ist nackt, nur das USB-Kabel ist angeschlossen.

Wie kann ich weiter bei der Fehlersuche vorgehen?
Kann es an dem aktivierten SSL der Domain liegen?
(Ist aber nicht erzwungen!)

Gruß und gute Nacht

Kolja

Beitrag #5023122 wurde von einem Moderator gelöscht.
von fpga (Gast)


Lesenswert?

>Wenn die URL im Browser aufgerufen wird, werden die Werte (hier nur
>0.00) in sqlite gespeichert.

Das glaub ich nicht, die Domäne "/Tomaten/" gehört sicher nicht dir.

von Clemens W. (daxmus)


Lesenswert?

> Das glaub ich nicht, die Domäne "/Tomaten/" gehört sicher nicht dir.

Muß sie ja nicht, solange der DNS Server (vermutlich vom Router) sie 
auflösen kann.

Hast Du es mal mit der IP versucht? Dann könntest Du evtl. schon mal ein 
DNS Problem ausschließen.

von Planlos (Gast)


Lesenswert?

Nimm mal den ESP8266WebServer raus, wenn du den nicht verwendest.

Und probier mal, bei client.connect ein IPAddress-Objekt statt dem 
Hostname-String anzugeben.

von fpga (Gast)


Lesenswert?

>Muß sie ja nicht, solange der DNS Server (vermutlich vom Router) sie
>auflösen kann.

Na klar und das script lädt er dann wie hoch?

von Mario M. (Gast)


Lesenswert?

Die Namensauflösung und Serververbindung funktioniert, sonst käme ja die 
Meldung "connection failed". Das Problem ist, dass der ESP keine 
Gelegenheit bekommt die Daten zu senden. Also füge mal folgenden Code 
hinter delay(10) ein:
1
unsigned long timeout = millis();
2
  while (client.available() == 0) {
3
    if (millis() - timeout > 5000) {
4
      Serial.println(">>> Client Timeout !");
5
      client.stop();
6
      return;
7
    }
8
  }
9
  while(client.available()){
10
    String line = client.readStringUntil('\r');
11
    Serial.print(line);
12
  }

"server.send" ist überflüssig und auch bei den includes müsste mal 
ausgemistet werden.

von Artus (Gast)


Lesenswert?

Clemens W. schrieb:
>> Das glaub ich nicht, die Domäne "/Tomaten/" gehört sicher nicht
> dir.
>
> Muß sie ja nicht, solange der DNS Server (vermutlich vom Router) sie
> auflösen kann.
>
> Hast Du es mal mit der IP versucht? Dann könntest Du evtl. schon mal ein
> DNS Problem ausschließen.

Quatsch.

Slash vor einem Hostnamen ist schlichtweg Mist, wäre mir nicht sicher, 
ob das funktioniert.
1
#include <Arduino.h>
2
#include <ESP8266WiFi.h>
3
#include <Wire.h>
4
#include <String.h>
5
6
char thingSpeakAddress[] = "api.thingspeak.com";
7
char thingSpeakSHA1[] = "78 60 18 44 81 35 BF DF 77 84 D4 0A 22 0D 9B 4E 6C DC 57 2C";
8
uint thingSpeakHTTPSPort = 443;
9
10
WiFiClientSecure  client;
11
12
void setup() {
13
  WiFi.begin(ssid, password);
14
  while (WiFi.status() != WL_CONNECTED) {
15
    delay(500);
16
  }
17
}
18
19
20
21
void updateThingSpeakHTTPS(String tsData, String l_APIKey) {
22
  if (!client.connect(thingSpeakAddress, thingSpeakHTTPSPort)) {
23
    //Serial.println("connection failed");
24
    return;
25
  }
26
27
  if (client.verify(thingSpeakSHA1, thingSpeakAddress)) {
28
    //Serial.println("certificate matches");
29
30
    client.print("POST /update HTTP/1.1\n");
31
    client.print("Host: api.thingspeak.com\n");
32
    client.print("Connection: close\n");
33
    client.print("X-THINGSPEAKAPIKEY: " + l_APIKey + "\n");
34
    client.print("Content-Type: application/x-www-form-urlencoded\n");
35
    client.print("Content-Length: ");
36
    client.print(tsData.length());
37
    client.print("\n\n");
38
    client.print(tsData);
39
40
    if (client.connected()) {
41
      //Serial.println("Connecting to ThingSpeak...");
42
      //Serial.println();
43
    }
44
  } else {
45
    //Serial.println("certificate doesn't match");
46
  }
47
}

Das funktioniert zu 100% und ist sogar mit HTTPS gebaut. ;)

Den SHA1 Fingerprint musst du natürlich mit dem deines Zertifikates 
ersetzen, ich setze persönlich gerne auf Thingspeak, dann muss ich auf 
dem NAS nicht noch einen weiteren Dienst laufen lassen...

von Clemens W. (daxmus)


Lesenswert?

> Slash vor einem Hostnamen ist schlichtweg Mist, wäre mir nicht sicher,


Stimmt, daß ist der Quatsch. Wird echt Zeit, dass die Hitze wieder ein 
Ende nimmt...

von Hax (Gast)


Lesenswert?

Ich würd mal in den Logfiles vom Server schauen ob da überhaupt was 
ankommt.

Laut dem was über die serielle Schnittstelle ausgegeben wird hat der TO 
es schon mir der IP versucht. Im Sketch steht der Domain Namen (host), 
in der Ausgabe die IP.

Ich kenn mich mit SSL zwar nicht so aus musste aber auch schon 
verschiedene Hosts vom ESP aus per SSL ansprechen da es einen Redirect 
von HTTP auf HTTPS gab. Eventuell ist es bei dir ja auch so.

Ps: Wieso ihr denkt dass hier die Domain "/Tomaten/" angesprochen wird 
ist mir schleierhaft.

von Kolja L. (kolja82)


Lesenswert?

Mario M. schrieb:
> Das Problem ist, dass der ESP keine
> Gelegenheit bekommt die Daten zu senden. Also füge mal folgenden Code
> hinter delay(10) ein:unsigned long timeout = millis();
>   while (client.available() == 0) {
>     if (millis() - timeout > 5000) {
>       Serial.println( >>> Client Timeout ! );
>       client.stop();
>       return;
>     }
>   }
>   while(client.available()){
>     String line = client.readStringUntil('\r');
>     Serial.print(line);
>   }
>
> server.send ist überflüssig und auch bei den includes müsste mal
> ausgemistet werden.

Habe ich mal gemacht und bekomme jetzt folgendeAusgabe:
1
...
2
192.168.178.59
3
/Tomaten/collectdata.php?a=0.00&b=0.00&c=0.00&d=0.00&e=0.00&f=0.00
4
GET /Tomaten/collectdata.php?a=0.00&b=0.00&c=0.00&d=0.00&e=0.00&f=0.00 HTTPS/1.1
5
Host: www.xxxx.de
6
Connection: close
7
8
HTTP/1.1 301 Moved Permanently
9
Date: Sat, 27 May 2017 11:51:53 GMT
10
Server: Apache
11
Location: https://www.xxx.de/Tomaten/collectdata.php?a=0.00&b=0.00&c=0.00&d=0.00&e=0.00&f=0.00
12
Vary: Accept-Encoding
13
Content-Length: 314
14
Connection: close
15
Content-Type: text/html; charset=iso-8859-1
16
 
17
The document has moved a xxx= https://www.xxx.de/Tomaten/collectdata.php?a=0.00&amp;b=0.00&amp;c=0.00&amp;d=0.00&amp;e=0.00&amp;f=0.00 >here

Liegt also doch am https?

von Kolja L. (kolja82)


Lesenswert?

Sorry, musste viel von der HTML Formatierung (Tags) entfernen, da mein 
Beitrag ansonsten Spam enthielt.
Meinte zumindest die Forensoftware...

von Dieter Nuhr (Gast)


Lesenswert?

Kolja L. schrieb:
> Liegt also doch am https?

Ja. Der Apache leitet http-Seiten zwangsweise auf die https-Seiten 
weiter. Da müsste man in der Apache-Konfiguration bestimmte Seiten bzw- 
Ordner für http freischalten. Evtl. lässt sich da auch was über 
mod_rewrite machen, aber da musst Du Deinen Server-Betreiber fragen.

von Jobst M. (jobstens-de)


Lesenswert?

Nur der Begrifflichkeiten wegen:

Ein Server (den Du ansprechen möchtest) ist keine Domain.
Die Domain wäre xxx.de
Ein Server der Domain ist www oder vollständig www.xxx.de
Ein weiterer wäre z.B. mail.xxx.de oder ns1.xxx.de

Wieso Du nun von www.xxxx.de auf www.xxx.de umgeleitet wirst, weiß ich 
nicht.

Ich habe noch nicht in eine HTTPS-Verbindung hinein gelauscht, könnte 
mir aber vorstellen, dass das Protokoll innerhalb der Verschlüsselung 
dennoch HTTP/1.1 ist.
Gerade nochmal gegooglet: HTTPS/1.1 scheint es nicht zu geben.

Gruß
Jobst

von Kolja L. (kolja82)


Lesenswert?

Ja, es liegt an der SSL Verschlüsselung.
Zumindest funktioniert alles, wenn ich ne andere Domain nehme.

Damit ist das Skropt von oben doch funktionsfähig,
müsste nur aufgeräumt werden.

von Jobst M. (jobstens-de)


Lesenswert?

HTTPS scheint er ja zu machen. Ich meinte das HTTPS hinter dem GET.
Damit wird ja nicht die Verschlüsselung gesteuert.

Gruß
Jobst

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.