Forum: Mikrocontroller und Digitale Elektronik FTP Client (Dateien auf Webspace hochladen)


von Pete K. (pete77)


Lesenswert?

Hallo,
hat jemand schon einmal von einem AVR oder STM32 Board Messdaten per 
FTP-Client auf einen Webspace übertragen?

Ich wollte mit einem STM32F107 Messwerte sammeln und dann alle 5 Minuten 
auf einen öffentlichen Webspace hochladen.

Ich finde allerdings kein Beispiel für so etwas. Hat jemand vielleicht 
einen Tipp für mich?

Viele Grüße,
Pete

von g457 (Gast)


Lesenswert?

> Hat jemand vielleicht einen Tipp für mich?

[0]

HTH

[0] http://tools.ietf.org/rfc/rfc354.txt

von Pete K. (pete77)


Lesenswert?

Ich dachte mehr an ein paar Codeschnipsel für AVR, Cortex o.ä.

von Andreas B. (andreasb)


Lesenswert?

Pete K. schrieb:
> Hallo,
> hat jemand schon einmal von einem AVR oder STM32 Board Messdaten per
> FTP-Client auf einen Webspace übertragen?

Warum FTP?
Eine TCP Implementierung findest du ja sicher, dann machst du dir ein 
PHP Skript für den Webspace, und sendest deine Daten als HTTP GET 
Request (für ein paar Messwerte)
Oder als HTTP Post Request, wenn du wirklich daten hast (> 4kByte).

Das ist ziemlich einfach...
http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol

[EDIT]: Diesen String musst du noch selbst zusammensetzten, und ggf. 
ecodieren.
> GET /wiki/Spezial:Search?search=Katzen&go=Artikel HTTP/1.1
> Host: de.wikipedia.org

Post gibt etwas mehr zu tun, ist aber auch noch simpel.

Sag was du genau machen willst, was du schon hast etc. dann wir dir ggf. 
geholfen, deine Frage ist viel zu unpräzise.


mfg Andreas

von Pete K. (pete77)


Lesenswert?

@Andreas: Da ich per Google wenig über einen FTP-Client auf einem µC 
finden konnte muss es wohl auch anders besser gehen...

Bisher habe ich einen STM32F107RC mit OneWire TempSensoren und einer 
Photodiode für einen EHZ Stromzähler am Laufen.

Der nächste Schritt ist die Anbindung des DP83848 sowie eines Displays.
Auf den DP83848 warte ich zurzeit noch.

Die Messdaten sollen dann irgendwie auf meinen Webspace bei einem 
öffentl. Provider hochgeladen werden, damit sie von überall verfügbar 
sind.

Die Grafik der Messwerte wird mit den google chart tools in der 
erzeugten HTML-Datei beim Aufruf visualisiert:
1
<html>
2
<head>
3
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
4
<script type="text/javascript">
5
google.load("visualization", "1", {packages:["corechart"]});
6
google.setOnLoadCallback(drawChart);
7
function drawChart() {
8
var data = new google.visualization.DataTable();
9
data.addColumn('timeofday', 'time');
10
data.addColumn('number','0');
11
data.addColumn('number','1');
12
data.addColumn('number','2');
13
data.addColumn('number','3');
14
data.addRows([[[12,49,28],24.8,24.8,25.0,24.5
15
],
16
[...]

von Andreas B. (andreasb)


Lesenswert?

Pete K. schrieb:
> @Andreas: Da ich per Google wenig über einen FTP-Client auf einem µC
> finden konnte muss es wohl auch anders besser gehen...
>
> Bisher habe ich einen STM32F107RC mit OneWire TempSensoren und einer
> Photodiode für einen EHZ Stromzähler am Laufen.

Ok, also definitiv wenig Daten, kannst du per HTTP GET machen.

> Der nächste Schritt ist die Anbindung des DP83848 sowie eines Displays.
> Auf den DP83848 warte ich zurzeit noch.

Keine Ahnung, ich habe bisher nur einemal einen ENC28J60 verwendet, und 
da habe ich eintlich nichts selbst gemacht, war alles "geklaut"

> Die Messdaten sollen dann irgendwie auf meinen Webspace bei einem
> öffentl. Provider hochgeladen werden, damit sie von überall verfügbar
> sind.

Ich (Informatiker) nehm für sowas immer HTTP, Serverseitig machst du ein 
kleines PHP Skript, wenn du viele Daten hast am einfachsten mit einer 
Datenbank, z.B. MySQL. (hast du ja warscheinlich zur Verfügung)

Ansonsten bietet sich in deinem Falle auch ein Logfile an, also alle 
Daten einfach Zeilenweise in ein File schreiben.

(Kannst du PHP?)

> Die Grafik der Messwerte wird mit den google chart tools in der
> erzeugten HTML-Datei beim Aufruf visualisiert:
>
>
1
> <html>
2
> <head>
3
> <script type="text/javascript"
4
> src="https://www.google.com/jsapi"></script>
5
> <script type="text/javascript">
6
> google.load("visualization", "1", {packages:["corechart"]});
7
> google.setOnLoadCallback(drawChart);
8
> function drawChart() {
9
10
--> Diesen Teil hier generierst du aus der Datenbank / dem File.
11
12
> ],
13
> [...]
14
>

HTTP Funktioniert ganz einfach, du öffnest eine Verbindung zur 
IP-Adresse des Servers auf Port 80, dafür findest du sicher eine TCP 
Lib.

Danach sendest du als String deinen HTTP Request.

> GET /stromzaeler/log.php?wert=%i&key=Geheim HTTP/1.1
> Host: meinedomain.de <-- Ganz wichtig, sonst landest du nicht auf deinem 
Webspace
> (2 * \r\n) dann sollte der Webserver antworten

Die erste Zeile kannst du z.B. mit sprintf aufbereiten, ich würde noch 
ein "Passwort" oder sowas mitliefern, damit nicht jeder einfach 
manipulieren kann. Sicher ist das ganze jedoch so nicht.

Danach sollte der Webserver mit
> HTTP/1.1 200 OK
antworten

Testen kannst du das ganz einfach mit telnet auf der Konsole.

Viel Spass!


mfg Andreas

von MaWin (Gast)


Lesenswert?

> Warum FTP?

Weil FTP so einfach ist, ein wesentliche einfacheres Protokoll als http, 
und entsprechend weniger Software zu programmieren ist.
Wenn man schin einen TCP/IP Stack hat und einen Socket öffnen kann (das 
braucht man für http sowieso), ist FTP sehr simpel, simpel wie print. 
Allerdings gibt es bei FTP (wie bei jeder Kommunikation) Wartezeiten, 
und die andere Seite kann auch mal gar nicht mehr antworten. Daher 
sollte man die Anfragen mit time out versehen. Auf einem uC kann man wie 
in ienem eigenen thread einfach Häppchenweise in der 
Programm-Hauptschleife machen: Wenn (vom FTP Transfer) was anliegt, mach 
was. Denn die Einzelaktionen sind kurz.

von Andreas B. (andreasb)


Lesenswert?

MaWin schrieb:
>> Warum FTP?
>
> Weil FTP so einfach ist, ein wesentliche einfacheres Protokoll als http,
> und entsprechend weniger Software zu programmieren ist.

Ich habe oben das komplette HTTP GET Beispiel gepostet, 2 Zeilen (incl. 
Platzhalter) und 2 Leerzeilen.

Poste doch einfach das einfachere FTP Beispiel, würde den TO sichere 
interessieren, und mich auch!



mfg Andreas

von MaWin (Gast)


Lesenswert?

> Ich habe oben das komplette HTTP GET Beispiel gepostet

Nein, du hast in beiden Beispielen einen gigantischen Unterbau 
vorausgesetzt.

Ein FTP-Get funktioniert quasi identisch, man liefert noch username und 
Password und type und mode mit, und holt dann einfach x Byte ab bzw. 
sendet sie.

socket=open(unc,21); // FTP port ist 21
send(socket,"USER username\r\nPASS Password\r\nMODE S\r\nTYPE A\r\n")
send(socket,"RETR /directory/filename.ext\r\n")
do { n = recv(sock, buf, len, 0); buf+=n; len-=n; } whule ( n>0 );

von helga (Gast)


Lesenswert?

Hallo Pete,

könntest Du bitte die vollständige HTML Datei (bis <\HTML>) 
hereinstellen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Natürlich ist FTP nicht einfacher als HTTP. Schon einfach, weil man min. 
2 offene Sockets benötigt für Command und Data.

von Viktor N. (Gast)


Lesenswert?

FTP ist viel gefaehrlicher, denn es beinhaltet einen zugriff auf das 
Filesystem. Waehrend ein Http request von einem haendler in eine 
datenbank geschrieben wird. Quasi mit den Plastikhandschuhen wie eine 
Giftflasche angefasst wird.

von g457 (Gast)


Lesenswert?

> Natürlich ist FTP nicht einfacher als HTTP.

Sagenwersmalso: Die sind beide dermaßen einfach, dass sich ein 
Komplexitätsvergleich gar nicht erst lohnt.

Ergo nimmt man das was auf der Gegenseite eh schon da ist.

von Pete K. (pete77)


Angehängte Dateien:

Lesenswert?

helga schrieb:
> Hallo Pete,
>
> könntest Du bitte die vollständige HTML Datei (bis <\HTML>)
> hereinstellen.

Ja, gerne :-)

Auf den Webserver habe ich keinen Zugriff, das sperrt der Provider. 
Daher müssen die Dateien in ein bestimmtest Verzeichnis beim Server 
hochgeladen werden.

von SummerWilli (Gast)


Lesenswert?

Ich hatte mal ein Projekt mit TFTP gesehen. Windows hat zum Beispiel 
einen TFTP Client on Board. Wenn ein Webserver auch TFTP kann, wäre das 
vielleicht ein einfacherer Weg.

von Stefan R. (srand)


Lesenswert?

Viktor N. schrieb:
> FTP ist viel gefaehrlicher, denn es beinhaltet einen zugriff auf das
> Filesystem.

Das muß nicht das "echte" Dateisystem sein, das kann man ganz trivial 
ebenso auf eine Datenbank abbilden. Der Unterschied zu HTTP existiert 
wirklich nur in deiner Fantasie.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

SummerWilli schrieb:
> Wenn ein Webserver auch TFTP kann, wäre das
> vielleicht ein einfacherer Weg.

TFTP ist ein Minimal-FTP ohne Authentifizierung etc.
Nicht sehr sinnvoll für einen weltweiten Zugriff.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Stefan Rand schrieb:
> Das muß nicht das "echte" Dateisystem sein, das kann man ganz trivial
> ebenso auf eine Datenbank abbilden. Der Unterschied zu HTTP existiert
> wirklich nur in deiner Fantasie.

Aber nur, wenn man vollen Zugriff auf den Server hat. In 99,99999% aller 
Fälle greift man direkt auf den Webspace zu. Man schickt sogar meist 
sein Adminpasswort mit, weil es keine Nutzerverwaltung gibt.

Viel einfacher ist ein PHP-Skript, welches auf ein GET entsprechend 
regiert.

von Pete K. (pete77)


Lesenswert?

Christian H. schrieb:
> Viel einfacher ist ein PHP-Skript, welches auf ein GET entsprechend
> regiert.

Und wie willst Du das PHP-Skript auf dem Websever von, sagen wir mal, 
1&1 zum Laufen bekommen? Cronjobs sind da nicht zugänglich.

Hier noch einmal der gewünschte Anwendungsfall:

STM32(Daten)--(upload)-->Webspace(1&1)<--(http-request)--Browser

von Simon K. (simon) Benutzerseite


Lesenswert?

Pete K. schrieb:
> Christian H. schrieb:
>> Viel einfacher ist ein PHP-Skript, welches auf ein GET entsprechend
>> regiert.
>
> Und wie willst Du das PHP-Skript auf dem Websever von, sagen wir mal,
> 1&1 zum Laufen bekommen? Cronjobs sind da nicht zugänglich.
Sind auch nich nötig.

> Hier noch einmal der gewünschte Anwendungsfall:
>
> STM32(Daten)--(upload)-->Webspace(1&1)<--(http-request)--Browser

STM32 -> HTTP GET/POST -> Webspace Skript (Mit Datenbank) <- HTTP GET <- 
Browser

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.