Forum: PC-Programmierung Automatischer videodownload mit raspberry pi


von Phillip Hommel (Gast)


Lesenswert?

Hallo
Es sollen unterschiedliche Raspberry Pi's von einer Website automatisch 
regelmäßig config Dateien und Videos herunterladen.
Das ganze  "webseitig"  per php mit get-parameter eindeutige ID evtl + 
Passwort. Also jedes Pi ruft mit seiner eigenen Kennung das Script auf 
der Seite auf und bekommt eine individuelle config zum download 
angeboten. Darin steht der Dateiname des Videos und von wann bis wann es 
laufen soll. Daraus wird per shell ein Cronjob erzeugt und das Video 
ggf. heruntergeladen, falls nicht schon vorhanden.
Ich muss beide Enden, die Website und das Pi aufbauen.
Jetzt habe ich diverse Möglichkeiten gefunden, entweder per wget, per 
ftp, per url-aufruf...
Wie würdet ihr das ganze aufbauen?
Viele Grüße
Phillip

von Noch einer (Gast)


Lesenswert?

> Dateiname des Videos

Die Config Datei soll vom PHP-Script erzeugt werden, die Videodatei 
liegt fertig in einem Verzeichnis, das der Webserver ausliefern kann - 
Ist das so richtig?

> Daraus wird per Shell ein Cronjob erzeugt

Soll die gesamte Client-Seite als Cronjob und Shell-Script geschrieben 
werden? Alles als Cronjob ist einfacher als /etc/init Script.

Wget bzw. curl dürfte dann das einfachste sein. Arbeit macht der 
Kleinkram. Configdatei mit sed und grep auswerten. Fehlerbehandlung bei 
Verbindungsabbruch...

von Phillip Hommel (Gast)


Lesenswert?

Zu 1. Ja, richtig.
2. Auf dem Pi bin ich noch nicht so richtig weit. Die Dinger liegen 
nachher grob gesagt irgendwo in nem Schaufenster und hängen an nem 
surfstick. (Datenvolumen etc. ist kein Thema und nicht mein Problem, für 
mich gilt:"so viel Internet wie ich brauche per surfstick ist da! ") 
dadurch sind so aber nicht von außen erreichbar und müssen selbst aktiv 
werden. Idee ist, daß sie in" Auslieferungszustand" jede Minute schauen 
ob es auf der Website eine neue config für "nicht initialisierte" gibt 
und diese runterladen. Diese enthält eine ID,  Dateinamen des Videos und 
Start und Endzeit für die Wiedergabe. Dann wird das Video gezogen und 
ein cronjob erzeugt. Von da an wird das Video entsprechen gestartet und 
gestoppt und einmal täglich geschaut, ob es eine neue  config gibt, die 
ggf wieder gezogen und der cronjob geändert wird. So können alle Pi's 
mit dem selben klon der sd Karte bestückt werden und alles an Setup 
geschieht via Website per config.

von Noch einer (Gast)


Lesenswert?

Da sehe ich keine echten Probleme. Ob du auf dem Raspi Bash, Python oder 
sonst irgendeine Scriptsprache nimmst - der Aufwand bleibt in Summe so 
ziemlich gleich. wget oder curl als Programm aufrufen geht einfacher, 
als sich in eine Python Library einarbeiten.

Wenn keiner was dagegen hat - in der Config Datei noch eine Anweisung 
zum Aufbau eines Reverse-Ssh-Tunnels vorsehen. Dann kann man Bugfixes 
auch nach Auslieferung noch installieren.

von Joachim B. (jar)


Lesenswert?

Noch einer schrieb:
> wget ..... als Programm aufrufen geht einfacher,

echt, ich habs aufgegeben,

mal kamen nur 10 Byte von meiner Weseite, mal die gesamte Webseite,

ich habe solange versucht zu laden mit wget bis die richtige Größe im 
download war, sobald ich es skriptete gings wieder nicht, nach dutzenden 
Versuchen mit allen Parameter habe ich das aufgegeben.

Kein Browser, IE oder FF hat derlei Probleme, klar ist mein Webserver 
lahm AVR mega 1284p aber normal geht es immer, nur gelegentlich 
brrauchts ein reload.

: Bearbeitet durch User
von Phillip Hommel (Gast)


Lesenswert?

Das mit dem ssh Tunnel klingt interessant, danke für den Tipp.
Habe mich mal etwas eingelesen bzgl. der Cronjobs. Soweit ich das 
verstehe ist es einfacher, jedes mal eine neue Datei mit allen Jobs zu 
erzeugen, dann alle löschen und die neue Datei zu  laden oder wie wird 
das normalerweise gemacht?

von Noch einer (Gast)


Lesenswert?

Normalerweise mit
crontab -l | mein-script | crontab -

Aber in deinem Fall weiß dein Script sowieso, was crontab -l liefert.

von Phillip H. (philharmony)


Lesenswert?

Noch eine Frage zum download: mit wget - N kann ich den download ja auf 
neue Dateien beschränken. Wenn du Datei aber per php vom Server 
angeboten wird, funktioniert das dann? Oder anders gefragt: womit prüft 
wget wie alt die Datei auf dem Server ist, und kann ich diese 
Information beeinflussen?
Lg

von Noch einer (Gast)


Lesenswert?

Im Http-Header kann der Server ein Last-Modified senden. Weiß jetzt 
nicht, ob wget ein Http-Head-Request sendet oder bei einem 
Http-Get-Request die Verbindung abbricht, sobald es Last-Modified 
bekommen hat. Lässt sich mit Wireshark herausfinden.

Im Prinzip kann dein PHP Script den Header selbst setzen. Aber ist der 
Aufwand wirklich erforderlich? Warum nicht nur das Config mit PHP 
zusammenbauen und die Videodatei direkt mit dem Webserver ausliefern?

von Karl Käfer (Gast)


Lesenswert?

Hallo Phillip,

Phillip Hommel schrieb:
> Noch eine Frage zum download: mit wget - N kann ich den download ja auf
> neue Dateien beschränken. Wenn du Datei aber per php vom Server
> angeboten wird, funktioniert das dann? Oder anders gefragt: womit prüft
> wget wie alt die Datei auf dem Server ist, und kann ich diese
> Information beeinflussen?


Habe ich Dich richtig verstanden: da soll ein Haufen Raspis (mit 
Monitoren) in einem Schaufenster stehen, in einer Endlosschleife Videos 
abspielen, und wenn über einen zentralen Webserver neue Videos 
bereitgestellt werden, sollen diese heruntergeladen und abgespielt 
werden? Wozu denn dann die Konfigurationsdateien, was wird damit 
konfiguriert? Und warum möchtest Du unterdessen die Cron-Konfiguration 
manipulieren?

Liebe Grüße,
Karl

von Phillip Hommel (Gast)


Lesenswert?

Die Video dürfen nicht den ganzen Tag laufen sondern, je nach Standort 
von x bis. Was sich auch mal ändern kann. Im Moment laufen die Videos 
von uralten CF Playern und jeden Morgen fährt einer die Runde und 
schaltet alle an, abends das gleiche wieder aus. Da das ganze aber auch 
langsam expandiert wird das etwas viel und  ich habe als 
Freundschaftsdienst eine bedienerfreundliche Lösung versprochen, sprich 
Chef kann alles vom Büro aus machen und Hiwi muss nur einmal das ganze 
aufstellen oder a-/umbauen.

von Phillip H. (philharmony)


Lesenswert?

Hat jemand noch eine Antwort zu meiner Frage? Mir ist noch nicht ganz 
klar, was genau passiert wenn wget auf eine PHP zugreift die dann eine 
Datei zum download erstellt bzw. anbietet. Ich nehme an da wird erstmal 
der Dateiheader angeschaut und daraus das File Datum gelesen? Aber wie 
schaut das aus wenn eben die php die Datei anbietet, was steht dann im 
Header? Auf diesem Gebiet bin ich leider völlig neu...

von Noch einer (Gast)


Lesenswert?

Am besten du installierst Wireshark und schaust dir an, was wget und 
Webserver ohne/mit PHP hin und her senden.

Im PHP gibt es eine Funktion, mit der du zusätzliche Http-Header senden 
kannst. Ich glaube, die hieß sogar header().

Wenn es sich irgendwie machen lässt, solltest du aber die Videos direkt 
vom Webserver ausliefern lassen. PHP ist nicht wirklich für so große 
Datenmengen konzipiert.

Erinnere ich mich noch an ein Problem: Wollte einzelne Videos als ein 
großes Video zusammengesetzt ausliefern - Das Script war schneller als 
das Netzwerk - Speicher voll - Rechner langsam - zufällig irgendwelche 
Programme abgestürzt. Hatte ich nicht gelöst bekommen, stattdessen dann 
eine Playlist ausgeliefert.

P.S. wget und Webserver haben einen Mechanismus, der nach einem 
Netzwerkfehler nur den fehlenden Teil der riesigen Datei überträgt.

von Phillip Hommel (Gast)


Lesenswert?

Geht auch viel einfacher, manchmal hilft es, wenn ein Freund einfach 
nicht so nah mit der Nase im Projekt steckt:

In der Cfg steht einfach der jeweils aktuelle Dateiname (Videodatei + 
Timestamp oder Version). In Intervallen wird die neue Cfg runtergeladen 
(sind nur ja nur inige Zeilen mehr als der Header alleine). Die 
Videodateien bekommen eine fortlaufende Kennung am Ende und die Aktuell 
gültige steht jeweils in der Config. Wenn nicht vorhanden wird dann 
einfach per wget die Aktuelle version gezogen.

von Huratz (Gast)


Lesenswert?

Was in deinem Projekt noch fehlt ist eine Sicherung gegen 
Übertragungsfehler.
Mach noch ein Prüfsumme über das Video und sende es mit der CFG.
Falls fehlt schlägt CFG und Video noch mal.

von rogger (Gast)


Lesenswert?

Man kann auch einfach die videos auf den server schmeißen und rsync über 
ssh (mit passwortlosem schlüssel) lädt von sich aus nur die neuen videos 
vom server, die noch nicht da sind oder löscht die videos auf den pi's, 
die nicht mehr auf dem server sind (rsync option --delete )

also ne chron machen die den server-ordner auf den pi synchronisiert.


wenn also auf den PIs mehrere videos vorgehalten werden sollen, dann 
könte man dem chron job sagen, welches gestartet werden soll, indem 
chron immer den dateinamen "video" abspielt. und auf dem server erstellt 
man dann einen symlink names video auf das video was gerade gespielt 
werden soll...



wer angst vor hackern hat kann den schlüssel auch restricten:
http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/


bin kein Fan von Chron-gefrickel, aber wers mag...

von Phillip Hommel (Gast)


Lesenswert?

Vielen Dank erstmal für die Zahlreichen Tipps.
Die ersten Sachen laufen bereits, jetzt setze ich mich gerade mit den 
Dateiheadern auseinander.
Dort kann ich ja optional auch ein lastmodified-Datum angeben. Ist das 
dann auch das Datum, was auf dem Zielrechner als Lastmod in der Datei 
übernommen wird? Ich nehme an wget mit -N (falls ich das für die 
Config-Files nutzen sollte) checkt diesen Header und vergleicht mit der 
Lokalen datei?
Oder macht es das über diesen MD5 hash?

von Karl Käfer (Gast)


Lesenswert?

Hallo rogger,

rogger schrieb:
> bin kein Fan von Chron-gefrickel, aber wers mag...

Das Gesuchte heißt eigentlich "Cron" und ist ein bereits seit 
Jahrzehnten etablierter Standard zur zeitgesteuerten Ausführung von 
Hintergrund-Jobs unter unix-artigen Betriebssystemen. Wie kommst Du bloß 
darauf, daß das "Gefrickel" sei?

Liebe Grüße,
Karl

von Noch einer (Gast)


Lesenswert?

>Ist das dann auch das Datum, was auf dem Zielrechner als Lastmod in der
>Datei übernommen wird?

Ja, mtime kommt vom Server, für ctime wird des jetzige Datum genommen.
1
pi@heizung /var/www/rrd $ ls -l rubber.js 
2
-rw-rw-r-- 1 pi pi 8228 Aug  9  2014 rubber.js
3
4
pi@heizung /var/www/rrd $ ls -lc rubber.js 
5
-rw-rw-r-- 1 pi pi 8228 Aug  9  2014 rubber.js
6
7
8
eg@ibm:~$ echo -e "GET http://heizung/rrd/rubber.js HTTP/1.1\r\n\r\n" | nc heizung 80
9
...
10
Last-Modified: Sat, 09 Aug 2014 08:11:05 GMT
11
...
12
Date: Thu, 07 May 2015 11:24:19 GMT
13
...
14
15
16
eg@ibm:~/tmp$ wget -N http://heizung/rrd/rubber.js
17
18
eg@ibm:~/tmp$ ls -l rubber.js 
19
-rw-rw-r-- 1 eg eg 8228 Aug  9  2014 rubber.js
20
21
eg@ibm:~/tmp$ ls -lc rubber.js 
22
-rw-rw-r-- 1 eg eg 8228 Mai  7 13:26 rubber.js

Weiß nicht, was man da als Lehrbuch empfehlen kann - wenn du so was 
machen willst, musst du dich sowieso in diese Tools zur Fehlersuche 
einarbeiten.

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.