ESP8266 filedownload von https-seite

Hallo an alle Bitverbieger,

s. Titel, konkret will ich die csv-Datei von dieser https://www.sonnenaufgang-sonnenuntergang.de/csvexport.php Quelle beziehen für das schalten meiner Hofbeleuchtung.

Bisher habe ich das nicht hinbekommen.
Versucht habe ich das mit dem Beispiel aus der Arduino IDE “BasicHttpClient”.

  • WiFi-Verbindung steht
  • NTPClient liefert die aktuelle zeit
  • http.begin() klappt auch noch
  • http.get() “[HTTP] GET… failed, error: connection refused”
    Da bin ich aber glaube ich auf dem falschen Weg weil ich ja keine HTML-Seite abrufen will sondern eine csv-Datei.?

Ziel ist es also eine Funktion zu schreiben,die jeden 1. im Monat die csv-Datei abruft.
-Zeilenweise einliest
-Werte aus Spalte 2 & 3 in einer neuen Datei auf dem ESP8266 speichert (SPIFFS)
neuen Datei hat dann das Format

07:00:00;22:00:00 //für den 1. im akt. Monat
06:59:45;22:02:15 //…2…

Hat jemand für den ESP eine Codeschnippsel oder eine Quelle für mich wo ich mir das laden/auslesen (“einer Textdatei”) ansehen kann?

In der Sparversion könnte man dann z.B. so ein Modul verwenden.

Da bin ich aber glaube ich auf dem falschen Weg weil ich ja keine HTML-Seite abrufen will sondern eine csv-Datei.?

Warum...

HTTP, kann vielfältige Daten zu dir bringen, auch CSV.

combie:
Warum...

HTTP, kann vielfältige Daten zu dir bringen, auch CSV.

dank combie für die Rückmeldung! ist nur die Frage wie das geht?
erst mal muss ich das http.get() dazu bewegen was zurück zu liefern, oder?
Man kann die https-Seite ja so aufrufen ohne irgendwelche Authentifizierung, dann müsste es doch auch ohne das Token funktionieren.?

hier mal der code aus dem Bsp noch garnicht viel verändert:

void getCSV() {

  HTTPClient http;

  Serial.print("[HTTP] begin...\n");

  // configure server and url
  //http.begin(CSV_URL);
  http.begin(CSV_URL, "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38");  
  //CSV_URL https://www.sonnenaufgang-sonnenuntergang.de/csvexport.php
  Serial.println("Token scheinbar erkannt!?"); //Token aus dem Bsp evtl muss das anders???
  // start connection and send HTTP header
  int httpCode = http.GET();
  if (httpCode > 0) {
    // HTTP header has been send and Server response header has been handled
    Serial.printf("[HTTP] GET... code: %d\n", httpCode);

    // file found at server
    if (httpCode == HTTP_CODE_OK) {

      // get lenght of document (is -1 when Server sends no Content-Length header)
      int len = http.getSize();

      // create buffer for read
      uint8_t buff[128] = { 0 };

      // get tcp stream
      WiFiClient * stream = http.getStreamPtr();

      // read all data from server
      while (http.connected() && (len > 0 || len == -1)) {
        // get available data size
        size_t size = stream->available();

        if (size) {
          // read up to 128 byte
          int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));

          // write it to Serial
          Serial.write(buff, c);

          if (len > 0) {
            len -= c;
          }
        }
        delay(1);
      }

      Serial.println();
      Serial.print("[HTTP] connection closed or file end.\n");

    }
  } else {
    Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  }

  http.end();
}

was muss anders?

Die Seite ist nicht "http" sondern "https", die Version mit verschlüsselter Verbindung, da funktioniet "http" nicht.
Ich hab nie was damit gemacht, darum kann ich Dir auch keinen Ratschlag geben, wie und wo Du eine Bibliothek oder Sketch für eine https-Verbindung herbekommst.
Grüße Uwe

xbow42:

  • http.begin() klappt auch noch

Unterstützt Deine Library überhaupt das https-Protokoll oder nur http?
Wenn https unterstützt wird, dann informiere Dich, wie Du mit Deiner Library das "secure" https Protokoll nutzen kannst! Ein http-Beispielprogramm wird Dir das nicht zeigen.

In deinem Code sehe ich leider keinerlei Abhandlung, des "S" in HTTPS.
Da ist wohl noch Nacharbeit nötig....

Meine Erfahrungen sind mit HTTPS+ESP auch leider Null.
Hier ist ein Anfang

habe jetzt das Bsp HTTPSRequest gefunden

Fingerprint von https://www.sonnenaufgang-sonnenuntergang.de habe ich jetzt auch nach der chromium-browser-installation herausbekommen.
Leider ist der nur bis 9. Jan 2018 gültig, wenn es denn läuft muss noch eine Funktion gebaut werden die den fingerprint updated. ISt bestimmt auch nicht so einfach. Aber step by step...

danke euch erst mal für den Fingerzeig! Melde mich wieder wenn es wieder klemmt.

Wenn das (Haupt-) Ziel ist, Sonnauf- und Untergangszeiten zu bekommen, dann darf ich auf die ausgezeichnete Library von Jurs hinweisen.
Siehe: Sommerzeit / Winterzeit - Sonnenaufgang / Sonnenuntergang

Da ist kein Download nötig (schon gar nicht jedes Monat) und funktioniert ausgezichnet.

huhu 8) ich komme schon mal an die Daten.

 /*
 *  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.
 *
 *  Created by Ivan Grokhotkov, 2015.
 *  This example is in public domain.
 */

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "........";
const char* password = "........";

const char* host = "sonnenaufgang-sonnenuntergang.de";
const char* url    = "/csvexport.php"; 
const int httpsPort = 443;

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
//https://github.com/esp8266/Arduino/blob/4897e0006b5b0123a2fa31f67b14a3fff65ce561/doc/esp8266wifi/client-secure-examples.md
const char* fingerprint = "43 00 3A 02 96 71 A6 E1 06 07 E4 D6 A5 7E 61 C6 D8 64 CE 68";  //gültig bis 9.1.2018
//todo: 
//fingerprint in Datei ablegen( SPIFFS)
//updatefunktion f. fingerprint.txt !?

void setup() {
  Serial.begin(115200);
  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());

  // 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");
  }

  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: ESP8266_Relay01\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
  //read Header
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    Serial.println(line); //debug
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  //read content
  Serial.println("-------read content -------------------------------");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line != "\r") {
      Serial.println(line);
    }
    else {
      Serial.println("fertig!");
      break;
    }
  }
}
void loop() {}

werde mich jetzt mal mit SPIFFS beschäftigen…

danke für den Tipp werde mir die Library auch mal ansehen.
https-Zugriff ist ja auch ganz interessant, vielleicht dann eher für andere Aufgaben…