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
> 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...
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.
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.
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
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?
Normalerweise mit crontab -l | mein-script | crontab - Aber in deinem Fall weiß dein Script sowieso, was crontab -l liefert.
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
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?
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
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.
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...
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.
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.
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.
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...
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?
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.