mikrocontroller.net

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


Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266WiFi.h>
#include "dht.h"
#include <SPI.h>
#include <Wire.h>
#include <NTPClient.h>
#include <WiFiClient.h>

#define DHT1_PIN 4
#define DHT2_PIN 0
#define DHT3_PIN 2

dht DHT1;
dht DHT2;
dht DHT3;

const char* ssid      = "xxx";
const char* password  = "xxx";
const char* host      = "www.xxx.de";
const char* sendto    = "collectdata.php";
ESP8266WebServer server(80);

void setup() {
  Serial.begin(115200);
  delay (500);
  WiFi.begin(ssid, password);
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
  }
  Serial.println(".");
  Serial.println(WiFi.localIP());
}

void loop() {
  senden();
  delay (1500);
  //  serial();
}


void senden()
{
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  DHT1.read22(DHT1_PIN);
  DHT2.read22(DHT2_PIN);
  DHT3.read22(DHT3_PIN);

  String url = "/Tomaten/";
  url += sendto;
  url += "?a=";
  url += DHT1.humidity;
  url += "&b=";
  url += DHT1.temperature;
  url += "&c=";
  url += DHT2.humidity;
  url += "&d=";
  url += DHT2.temperature;
  url += "&e=";
  url += DHT3.humidity;
  url += "&f=";
  url += DHT3.temperature;

  server.send(200, "text/plain", "Alles gut" );
  Serial.println(url);
  Serial.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
  client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
  delay(10);
}

Ganz unten in den letzten Zeilen wird die URL aus url und Host 
aufgerufen.
Die serielle Ausgabe bringt mich leider auch nicht weiter
...
192.168.178.59
/Tomaten/collectdata.php?a=0.00&b=0.00&c=0.00&d=0.00&e=0.00&f=0.00
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
Host: www.xxx.de
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.
Autor: fpga (Gast)
Datum:

Bewertung
-2 lesenswert
nicht 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.

Autor: Clemens W. (daxmus)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Planlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fpga (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mario M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: Artus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <String.h>

char thingSpeakAddress[] = "api.thingspeak.com";
char thingSpeakSHA1[] = "78 60 18 44 81 35 BF DF 77 84 D4 0A 22 0D 9B 4E 6C DC 57 2C";
uint thingSpeakHTTPSPort = 443;

WiFiClientSecure  client;

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}



void updateThingSpeakHTTPS(String tsData, String l_APIKey) {
  if (!client.connect(thingSpeakAddress, thingSpeakHTTPSPort)) {
    //Serial.println("connection failed");
    return;
  }

  if (client.verify(thingSpeakSHA1, thingSpeakAddress)) {
    //Serial.println("certificate matches");

    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: " + l_APIKey + "\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(tsData.length());
    client.print("\n\n");
    client.print(tsData);

    if (client.connected()) {
      //Serial.println("Connecting to ThingSpeak...");
      //Serial.println();
    }
  } else {
    //Serial.println("certificate doesn't match");
  }
}



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...

Autor: Clemens W. (daxmus)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Hax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht 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:
...
192.168.178.59
/Tomaten/collectdata.php?a=0.00&b=0.00&c=0.00&d=0.00&e=0.00&f=0.00
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
Host: www.xxxx.de
Connection: close

HTTP/1.1 301 Moved Permanently
Date: Sat, 27 May 2017 11:51:53 GMT
Server: Apache
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
Vary: Accept-Encoding
Content-Length: 314
Connection: close
Content-Type: text/html; charset=iso-8859-1
 
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?

Autor: Kolja L. (kolja82)
Datum:

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

Autor: Dieter Nuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jobst M. (jobstens-de)
Datum:

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

Gruß
Jobst

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.