ich habe zwar schon einige kleine Projekt erfolgreich erstellt, würde mich aber noch als Anfänger bezeichnen.
Meine Schwiegermutter lebt in einem Hochwassergebiet und regelmäßig tritt der Bach neben ihrem Haus über die Ufer.
Zur kritischen Zeit verbringt sie viel Zeit vor dem PC (mit Tablet und Smartphone kann ich sie nicht überzeugen) und pürft die Pegelstände:
Um als Schwiegersohn zu punkten, würde ich ihr gerne über einen NodeMCU die Daten aus der Webseite auslesen und auf ein LCD-Disply anzeigen.
Leider verzeifel ich gerade am Auslesen der Webseite. Nachstehend mein Sketch (Anbindung LCD hab ich mal raugenommen):
/*
* Basic ESP Client example, based on the ESP libraries examples
*/
#include <ESP8266WiFi.h>
const char* ssid = "XXX";
const char* password = "XXX";
const char* host = "m.hnd.bayern.de";
void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println();
}
void loop() {
Serial.print("connecting to ");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url = "/pegel.php?pgnr=18003004";
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
// start waiting for the response
unsigned long lasttime = millis();
while (!client.available() && millis() - lasttime < 1000) {delay(1);} // wait max 1s for data
// Read all the lines of the reply from server and print them to Serial
//while(client.available()){
//char readchar = client.read();
//Serial.print(readchar);
//}
while (client.available()) {
String line = client.readStringUntil('\n');
if (line.indexOf("<p>Wasserstand [cm]: <b>") >= 0) { // Searchstring exists?
Serial.println();
Serial.print(line);
}
}
Serial.println();
Serial.println("closing connection");
delay(5000);
}
als Ergebnis kommt:
Connecting to XXX
....
WiFi connected
IP address:
192.168.43.98
connecting to m.hnd.bayern.de
Requesting URL: /pegel.php?pgnr=18003004
closing connection
Ich habe auzch schon mal ein Versuch über die "Text Finder library " gemacht... ähnlich erfolglos
Warum so kompliziert? Kleines Tablet mit einem Kiosk-Browser immer aktiv laufen lassen. Ganz ohne Frikelei. Und wenn mal Bayern die Seite aktualisiert, sieht deine Schwiegermu immer noch das passende.
Wenn eine schöne rote Warnleuchte gefragt ist, dann würde ich glatt mal anfragen,ob es ein dokumentiertes API gibt.
Lass Dir doch erst mal alles an Serial ausgeben, was da so ankommt.
Hast Du Dir den Quelltext der Tabelle mal angeschaut? Die Tabellenzeilen werden alle in einer einzigen Zeile übertragen, da ist Lesen bis \n suboptimal.
ich habe leider im Moment keinen ESP mehr mit dem ich das mal probieren könnte. Ist also alle nur Vermutung .
Du willst Dir ja bereits den Inhalt jeder Zeile anzeigen lassen, aber da kommt nichts. Anscheinend klappt da was anderes aber nicht. ich vermute mal die gewünschte Seite wird nicht erreicht. Irgendwas stimmt mit dem Aufruf der Seite mit "GET" nicht.
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
und das nachfolgende :
while (client.available())
trifft nicht zu
Setze Dir doch den String mit dem Get erst mal in eine String zusammen und lass dir den auch noch mal anzeigen. ich vermute da liget das Problem.
Heinz
Nachtrag
mir fällt gerade auf es geht um eine HTTPS seite , geht das überhaupt ?
also ich hab den Beispiel-Sketch mal umgeschrieben
/*
HTTP over TLS (HTTPS) example sketch
This example demonstrates how to use
WiFiClientSecure class to access HTTPS API.
We fetch and display the status of
esp8266/Arduino project continuous integration
build.
Limitations:
only RSA certificates
no support of Perfect Forward Secrecy (PFS)
TLSv1.2 is supported since version 2.4.0-rc1
Created by Ivan Grokhotkov, 2015.
This example is in public domain.
*/
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char* ssid = "test";
const char* password = "lego1234";
const char* host = "m.hnd.bayern.de";
const int httpsPort = 443;
// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char* fingerprint = "6B 85 D3 12 8E A2 7B A7 CF 8E CD 8C BB 76 85 35 CA 80 EE 1A";
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Use WiFiClientSecure class to create TLS connection
WiFiClientSecure client;
Serial.print("connecting to ");
Serial.println(host);
if (!client.connect(host, httpsPort)) {
Serial.println("connection failed");
return;
}
if (client.verify(fingerprint, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
}
String url = "/pegel.php?pgnr=18003004";
Serial.print("requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Connection: close\r\n\r\n");
Serial.println("request sent");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
String line = client.readStringUntil('\n');
if (line.startsWith("{\"state\":\"success\"")) {
Serial.println("esp8266/Arduino CI successfull!");
} else {
Serial.println("esp8266/Arduino CI has failed");
}
Serial.println("reply was:");
Serial.println("==========");
Serial.println(line);
Serial.println("==========");
Serial.println("closing connection");
}
void loop() {
}
Aber augenscheinlich klappt die Verbindung dennoch nicht
connecting to test
.......
WiFi connected
IP address:
192.168.43.98
connecting to m.hnd.bayern.de
connection failed
Hab jetzt auch Freund Google genutz und nach anderen "https request" Sketches durchsucht.... aber auf die Schnelle keine Lösung...