Hallo zusammen,
für ein Datenlogger-Projekt mit dem ESP nutze ich die SD-Lib. Ich lege
die LOG-Dateien in einem Unterverzeichnis automatisch an. Die nächste
freie Nummer wird als neuer Dateiname genommen. Soweit erstmal alles ok.
Aber jetzt brauche ich die Anzeige des verfügbaren Speicherplatzes und
ein korrektes Dateidatum für die Log-Dateien wäre auch nicht schlecht...
Nach dem ESP-Beispiel "SD-Card Info" bekomme ich erstmal die Gesamtgröße
der SD-Karte ausgegeben. Meine einzige Idee wäre jetzt, alle Dateien auf
der Karte zu durchsuchen und den genutzten Speicherpatz (aufgerundet auf
den nächsten Sektor) zu summieren. Irgendwie recht umständlich... Hat da
jemand eine andere Idee?
Zum Dateidatum: in der von der SD.h genutzen SDfat.h gibt es eine
Definition für das Dateidatum und die Uhrzeit:
1
/** Default date for file timestamps is 1 Jan 2000 */
Diese sind aber als const definiert (warum auch immer) und ich finde
keine Funktion, um das Datum korrekt zu setzen. Datum und Uhrzeit ist
per NTP bekannt.
Dateinamen mit JJMMDDHH.log scheiden aus, da mehrfach pro Stunde neue
Logdateien angelegt werden können. Einzige Alternative wäre ein
Dateiname aus Einerstelle des Jahres, Tag des Jahres (001-366), Stunde
und Minute. Ist aber eher "gewöhnungsbedürftig"...
Auch wenn man per SD-Lib das Datum schreiben könnte, würde ich es lieber
in den Dateinamen einbauen. Beim Kopieren geht ein Dateidatum schon mal
verloren. FAT ist auch nicht eindeutig was die Sommerzeit angeht.
Wer NTP hat, hat auch die Unix-Zeit. Die funktioniert in 32 Bit
mindestens bis 2037, als uint32_t auch bis 2106 mit 1 Sekunde Auflösung.
32 Bit in Hex-Schreibweise sind zufällig 8 Zeichen. Wenn eine Minute
Auflösung wirklich ausreicht, kann man auch durch 60 teilen und kommt
auch Dezimal bis 2160 (99999999 Minuten ab 1970).
date -d@$((5ABEC128)) konvertiert Hex nach menschenlesbar.
Anstelle von NTP kann man Datum und Uhrzeit auch relativ einfach aus
einem HTTP Header extrahieren:
1
stefan@stefanspc:~$ curl -v ptb.de
2
* Rebuilt URL to: ptb.de/
3
* Trying 192.53.103.142...
4
* TCP_NODELAY set
5
* Connected to ptb.de (192.53.103.142) port 80 (#0)
6
> GET / HTTP/1.1
7
> Host: ptb.de
8
> User-Agent: curl/7.52.1
9
> Accept: */*
10
>
11
<HTTP/1.1302Found
12
<Date:Sat,31Mar201806:50:41GMT
13
<Server:Apache
14
<Location:http://www.ptb.de/
15
<Content-Length:202
16
<Content-Type:text/html;charset=iso-8859-1
17
<
18
<!DOCTYPEHTMLPUBLIC"-//IETF//DTDHTML2.0//EN">
19
<html><head>
20
<title>302 Found</title>
21
</head><body>
22
...
23
</body></html>
24
* Curl_http_done: called premature == 0
25
* Connection #0 to host ptb.de left intact
26
stefan@stefanspc:~$
Du musst nach dem Verbindungsaufbau nur zwei Zeilen (+1 Leerzeile)
senden:
1
GET / HTTP/1.1
2
Host: ptb.de
Und erhältst dann diese Antwort:
1
Date: Sat, 31 Mar 2018 06:50:41 GMT
Die Breite der einzelnen Felder ist immer gleich, deswegen kann man sich
hier sehr einfach die Teile heraus schneiden, die man benötigt.
Ich habe hier bewusst den Webserver der ptb gewählt, weil dieses
Institut die offizielle Uhrzeit für Deutschland ermittelt. Ich hoffe,
dass deren Webserver halbwegs damit überein stimmen. Ein bisschen
Verzögerung durch das Netz muss man bei dieser Methode natürlich
tolerieren.
Das Unix-Datum als Dateiname ist auch eine Idee. Ist zwar nicht sofort
lesbar, aber die Sortierung auf der KArte passt. In der CSV-Datei steht
eh der Startpunkt nochmal im Klartext.
@Michael: fsinfo ist wohl für das SPIFFS gedacht und findet sich in der
FS.h. Wenn ich die zur SD.h dazubinde, dann streiten die sich über die
Zuständigkeit für das file-Objekt :-(
Beim ESP32 oassen die Bibliotheken scheinbar besser zusammen. Im
Beispiel hier
https://github.com/espressif/arduino-esp32/blob/master/libraries/SD/examples/SD_Test/SD_Test.ino
sind die beiden H-Dateien friedlich zusammen...
Hallo,
Bernhard S. schrieb:> @Michael: fsinfo ist wohl für das SPIFFS gedacht und findet sich in der> FS.h. Wenn ich die zur SD.h dazubinde, dann streiten die sich über die> Zuständigkeit für das file-Objekt :-(
stimmt, hatte ich aus einem meiner ESP-Projekte entliehen ohne
nachzudenken.
Die Streitereien der Module kenne ich auch zur genüge.
Bleibt wohl doch nur selber addieren...
Gruß aus Berlin
Michael
Selber addieren geht erstmal. Leider hat die SD.h keine Funktionen zum
auslesen der gesamten Sektoren einer Karte. Hier müsste wieder FS.h ran
:-(
Aber erstmal das Posisitve: ich logge meine Messdaten als CSV-Dateien
mit individuellem Dateinamen auf der SD-Karte im Verzeichnis log. Ein
Logo wird von der SD-Karte gelesen und in den HTML-Seiten korrekt
dargestellt. Eine Callback-Funktion liefert mir ein Dateilisting (und
die Anzahl der belegten Sektoren). Der Datei-Download klappt jetzt mit
einem kleinen Hack auch. Ich habe es nicht geschafft, einen Callback für
log anzulegen. Stattdessen missbrauche ich den Callback für "File not
found" und werte darin das Server-Argument aus. Wenn das jetzt log
drinsteht, wird der Dateiname extrahiert und die Datei zum Client
gestreamt. Klappt auch mit größeren Dateien ;-)
Meine Frage wäre jetzt nur, wie ich auf die gesamtgröße der SD-Karte
komme, ohne die FS.h zu verwenden.
Meine Code-Teile:
1) Callbacks in setup()
2) Callback-Funktion handleNotFound() mit Workaraound:
Der DEBUG-Teil liefert mir die übergebenen Argumente des HTTP-Aufrufs.
Damit kann man unbekannte Aufrufe untersuchen und passende Callbacks
erstellen. Im Else-Zweig wird dann die eigentliche 404-Fehlermeldung bei
unbekannten URIs ausgegeben.
1
voidhandleNotFound(){
2
// DEBUG output, check the response from the webpage
ES IST ECHT ZUM KOTZEN, WENN MAN HTML-TAGS IM QUELLCODE DURCH
SCHEISSDRECK ERSETZEN MUSS UM DIE VERF***TE SPAMERKENNUNG ZU ÜBERLISTEN.
Ich habe jetzt echt 20 Versuche gebraucht, um rauszufinden, an welcher
Zeile sich die Spamerkennung aufgeilt. Macht echt keinen Spass!
Bernhard S. schrieb:> ES IST ECHT ZUM KOTZEN, WENN MAN HTML-TAGS IM QUELLCODE DURCH> SCHEISSDRECK ERSETZEN MUSS UM DIE VERF***TE SPAMERKENNUNG ZU ÜBERLISTEN.>> Ich habe jetzt echt 20 Versuche gebraucht, um rauszufinden, an welcher> Zeile sich die Spamerkennung aufgeilt. Macht echt keinen Spass!
Möglicherweise wären ein oder mehrere Anhänge hier die bessere Wahl. ;-)
Sheeva P. schrieb:> Stefan U. schrieb:>> Anstelle von NTP kann man Datum und Uhrzeit auch relativ einfach aus>> einem HTTP Header extrahieren:>>
1
>> stefan@stefanspc:~$ curl -v ptb.de
2
>>
>> Was ist eigentlich ein HTTP-HEAD-Request? ;-)
Damit forderst du nur den Header an - um mal zu schauen ob die Datei
verfügbar ist. Offensichtlich kann der Server aber den Inhalt der Seite
trotzdem gleich im 1. Paket mitsenden wenn er zusammen mit dem Header in
selbiges passt.
Sascha
>>>> Was ist eigentlich ein HTTP-HEAD-Request? ;-)> Damit forderst du nur den Header an - um mal zu schauen ob die Datei> verfügbar ist.
Ja, ganz genau. Und in dem Header steht dann was? Richtig: der gesuchte
Zeitstempel mit Datum, Uhrzeit, und einer Zeitzone.
> Offensichtlich kann der Server aber den Inhalt der Seite> trotzdem gleich im 1. Paket mitsenden wenn er zusammen mit dem Header in> selbiges passt.
Ja, das ist dann ein HTTP-GET-Request. Aber warum sollte man den Inhalt
der Seite laden, wo man doch nur an einer Headerzeile interessiert ist?