Webseite mit mehreren Kameras (aktuelle Standbilder) nur über Port 80?

Hallo,

ich betreibe inzwischen 4 Instar-Kameras. Diese kann ich von extern über Dyndns mit ihren Ports auch ansehen und habe mir eine html-Seite mit den 4 bei Seitenaufruf aktuellen Standbildern gebastelt.

Nun habe ich eine Mobilflat nur für Port 80 und möchte die aktuellen bilder auch auf dem Smartphone sehen. Gibt es eine Möglichkeit, auf meinem Webserver eine Seite zu erstellen, die mir die 4 Bilder bereitstellt, ohne dass ich von extern die vier Ports ansprechen muss?

Dabei möchte ich es gern vermeiden, dass die Kameras dauernd über WLAN Bilder auf den FTP-Server schicken. Ich dachte an eine Lösung, bei der der Webserver die Daten nur bei Bedarf holt und eine Seite generiert. Webserver ist eine Synology DS212j. Geht das damit?

Mojnsen :wink:

das bedarf einiger (Skript)Intelligenz auf Serverseite, damit der Server beim Aufruf der Seite die aktuellen Bilder abfordert. Die einfachste, aber sicher auch teuerste, Variante ist die Nutzung der Synology Surveillance, und der dazugehörigen Mobil-App. Allerdings sind die zusätzlich notwendigen Kameralizenzen brutal teuer.

Cu
Nobi

[QUOTE=NobiMan;6676]Mojnsen :wink:

das bedarf einiger (Skript)Intelligenz auf Serverseite, damit der Server beim Aufruf der Seite die aktuellen Bilder abfordert. Die einfachste, aber sicher auch teuerste, Variante ist die Nutzung der Synology Surveillance, und der dazugehörigen Mobil-App. Allerdings sind die zusätzlich notwendigen Kameralizenzen brutal teuer.

Cu
Nobi[/QUOTE]
Ja, die Surveillance habe ich bereits getestet. Die Lizenzen würde ich kaufen. Allerdings hat das Programm mehrere Nachteile für mich: der Hibernation Mode funktioniert nicht mehr, die Synology würde dauernd aufnehmen (dann könnte ich auch ftp nutzen) und ich habe aus diversen Gründen mehrere Nokia E7 (Anna und Belle). Dafür gibt es dummerweise keine Synology-Apps. Das, was ich täglich benutze, hat eine Vodafone-Live-Flat, die auf die Ports http 80 und 443 beschränkt ist.

Momentan habe ich eine Seite mit den 4 Livebildern und 4 Bildern, die alle 10 Minuten per FTP geschrieben werden. Nicht auf die Synology, sondern auf einen externen Server im weiten Web. Rufe ich diese Seite mit meinen Port 80 Handy auf, bekomme ich logischerweise nur die 4 FTP-Bilder.

Mit php oder so muss es doch gehen, eine Seite mit den 4 Bildern zu erstellen? Leider kenne ich mich damit nicht aus.

[QUOTE=Topfi;6677]
Momentan habe ich eine Seite mit den 4 Livebildern und 4 Bildern, die alle 10 Minuten per FTP geschrieben werden. Nicht auf die Synology, sondern auf einen externen Server im weiten Web. Rufe ich diese Seite mit meinen Port 80 Handy auf, bekomme ich logischerweise nur die 4 FTP-Bilder.

Mit php oder so muss es doch gehen, eine Seite mit den 4 Bildern zu erstellen? Leider kenne ich mich damit nicht aus.[/QUOTE]

Sorry, aber ich verstehe gerade Dein Problem nicht?!?!?! Du hast also eine Webseite, die die 4, per ftp hochgeladenen Bilder darstellt? Was soll dann auf der Seite noch dargestellt werden?

Die anderen vier wirklichen Live-Bilder.

Die über FTP lade ich nur zusätzlich alle 10 Minuten hoch, damit ich auf meinem Handy trotzdem etwas sehe, was dann eben maximal 10 Minuten alt ist. Ich möchte aber eigentlich die Livebilder zum Zeitpunkt des Seitenaufrufs sehen und habe nur Port 80 zur Verfügung.

Okay, Du möchtest also, dass der Server vier Livestreams öffnet und diese Streams dann in vier Videoplayern auf einer WebSeite umleitet?
Hut ab! das ist mal ne Anforderung! Mal ganz davon ab, dass ich nicht glaube, dass Deine Nokias dann noch was brauchbares anzeigen, vermute ich mal, dass Dein WebHoster so eine Aktion nicht besonders witzig finden dürfte :wink:

Ein vernünftiger Ansatz wäre, beim Aufruf der Seite, auf dem WebServer ein Skript zu starten, dass nacheinander einen SnapShot Deiner Kameras abruft und diese auf der Seite anzeigt, dann hättest Du aktuelle Bilder. (wie das mit dem SnapShot geht, steht Hier)

Möglich wäre auch 4 WebSeiten (plus einer IndexSeite) zu bauen und dort jeweils einen Stream, z.B.: mit Cambozola, anzuzeigen. (Wie das geht steht Hier)

Cu
Nobi

Ich wollte schon nur 4 Bilder, keine Videos. :wink: Daran ist nicht zu denken, abgesehen vom Mobilfunk habe ich auch nur knapp 700kbit upload im DSL.

Ansonsten hast Du recht, der Server soll 4 Snapshots holen und in die Webseite basteln. Und das nur, wenn jemand diese Seite aufruft. Mit dem von dir verlinkten Script habe ich das aktuell auch realisiert.

Die Sache hat nur einen Haken: In dem Script kann ich nicht die lokalen IP-Adressen der Kameras nehmen, sondern muss die aus dem Netz erreichbare Adresse eintragen: MEIN_DYNDNS:MEIN_PORT

Und da Port 80 für den Webserver reserviert ist, müssen die Kameras über andere Ports übertragen werden. Diese läßt mein Provider aber nicht durch. Einzig 443 geht noch, aber dahinter steckt mein eigenes WebDAV-Wölkchen.

Verstehe nur Bahnhof! Was hat Deine Portbeschränkung mit dem Webserver zu tun?

Jetzt nochmal für Steinsetzer zu mitmeisseln:

  1. Du hast einen WebServer
    • Der befindet sich in Deinem LAN, oder bei einem WebHoster?
  2. Du benutzt ein Skript?
    • Welches denn?

Danke für Deine Geduld. :wink:

  1. Ich habe einen Webserver zu Hause. Dieser hat eine lokale Adresse, z.B. 10.0.0.10 und liefert auf Port 80. Meine Kamera (betrachten wir mal bloß eine) hat die IP 10.0.0.2 und läuft auf Port 81. Auf beide greife ich natürlich meist von außen zu. Deshalb forwarde ich Port 80 von 10.0.0.10 und Port 81 von 10.0.0.2 über meine Fritzbox nach draußen. Ich und habe einen Dyndns-Account laufen, sagen wir mal: ich.dyndns.org.

Will ich meine Webseite sehen, gebe ich ein: http://ich.dyndns.org. Will ich die Kamera sehen, gebe ich ein: http://ich.dyndns.org:81.

  1. auf meiner Webseite habe ich folgenden Code, um die Kamera einzubinden:
    <A HREF=„http://ich.dyndns.org:81/snapshot.cgi?&resolution=32“><IMG SRC=„http://ich.dyndns.org:81/snapshot.cgi?&resolution=32“ width=„400“ height=„300“ BORDER=„0“></A>

Das funktioniert tadellos, solange der Provider sowohl Port 80 als auch Port 81 durchläßt. Wird jedoch Port 81 geblockt, sehe ich logischerweise die Kamera nicht.

Okay!
Jetzt ist der Groschen gefallen :wink:
Das Problem ist, dass Dein Client (also das Handy) das Skript ausführen muss und somit über die gesperrten Ports stolpert! Der Trick hierbei ist, dass Dein Server dieses Skript ausführen muss und nur das Ergebnis (über Port 80) ausliefert!

Ganz primitiv und quick&dirty zusammengeschustert so:


#!/bin/bash

set -f
pwd=`pwd`
echo "Content-type: text/html"
echo
echo "<HTML><HEAD><TITLE>Kameratest</TITLE></HEAD>"
echo "<BODY>"
curl "http://10.0.0.2:81/snapshot.cgi?user=snap&pwd=&next_url=cam1" >/var/www/httpdocs/img/cam1.jpg 2>/dev/null
curl "http://10.0.0.3:82/snapshot.cgi?user=snap&pwd=&next_url=cam2" >/var/www/httpdocs/img/cam2.jpg 2>/dev/null
curl "http://10.0.0.4:83/snapshot.cgi?user=snap&pwd=&next_url=cam3" >/var/www/httpdocs/img/cam3.jpg 2>/dev/null
curl "http://10.0.0.5:84/snapshot.cgi?user=snap&pwd=&next_url=cam4" >/var/www/httpdocs/img/cam4.jpg 2>/dev/null
echo "<img src=\"/img/cam1.jpg\">"
echo "<br>"
echo "<img src=\"/img/cam2.jpg\">"
echo "<br>"
echo "<img src=\"/img/cam3.jpg\">"
echo "<br>"
echo "<img src=\"/img/cam4.jpg\">"
echo "</BODY></HTML>"
echo

Wenn dieses Skript im cgi-bin Verzeichnis des Web-Servers aufgerufen wird, erzeugt es dynamisch eine Seite mit den 4 aktuellen Kamerabildern.

Wie gesagt: Quick&Dirty, das geht mit php, perl oder Java sicher eleganter :wink:

Suuuper, danke. Genau das hatte ich im Sinn. Leider kenne ich mich mit solchen cgi-scripts nicht aus und muss erst mal sehen, ob meine Synology im Auslieferungszustand das überhaupt kann. Wahrscheinlich muss ich perl-cgi installieren. Momentan habe ich alle Dienste, von denen ich keine Ahnung habe, nicht gestartet. Also php, mysql und so.

Da das Vorhaben mit den Kamras offensichtlich umsetzbar ist, werde ich meinen Kenntnisstand in Sachen cgi-scripts am voraussichtlich verregneten Feiertag auffrischen.

[Edit:] Ich habs gerade mal schnell ausprobiert, er startet das script nicht. Vielleicht stimmen bloß die Rechte nicht, habe hier im Büro keine Konsole und kann nur Dateien raufkopieren. Da muss ich morgen noch ein wenig lesen. Auf jeden Fall danke für Deine Hilfe.

Dass das nicht funktioniert, wundert mich nicht!
Du musst den Pfad auf das Documentroot Deiner Synology anpassen, einen User „snap“ ohne password, auf der Kamera einrichten und unterhalb des Documentroot muss es ein Verzeichnis „img“ geben. Last but not least, ist der apache Webserver sehr empfindlich, was die Zugriffsrechte im cgi-bin Verzeichnis betrifft. Und nein, Du musst das cgi-perl Modul nicht aktivieren, denn es handelt sich hier um ein Shellskript! (Erste Zeile: #!/bin/bash)

Kurze Zwischenmeldung, auch wenn es gar nicht regnet. :wink:

Nach 2 Stunden Basteln habe ich es hinbekommen, dass Scripte überhaupt ausgeführt werden (ash, bash oder Perl). Ich bleibe jetzt bei der Synology-eigenen ash. Zunächst habe ich die notwendigen Verzeichnisse in einem sicheren Bereich erstellt und ein paar config-Dateien angepasst. Es ist mir auch gelungen, ein erstes Script zu schreiben, das mir Bilder aus dem img-Verzeichnis anzeigt. Bitte nicht lachen, ich mache das zum ersten mal, bin bisher mit html ausgekommen. :wink: Nun muss ich nur noch die Kopiererei hinkriegen und mir über eine .htaccess hier und da Gedanken machen. Einen User ohne Passwort erstelle ich sicher nicht, da die Kameras nach draußen freigegeben sind. :wink:

Nochmal danke für die Tips.

[Edit:] Auch das habe ich jetzt mal testweise für 1 Kamera hinbekommen. Ganz vielen Dank.

Sodele, nun habe ich es geschafft. Es gibt zunächst mal eine Übersichtsseite (kameras.cgi) mit den 4 Kamerabildern, die per script abgerufen werden und die ganz normal über Port 80 erreichbar ist.

Meine Webseiten liegen im absoluten Pfad /volume1/web, hier wurde ein Verzeichnis /img erstellt und mit einer .htaccess geschützt. Das bedeutet, nur, wer autorisiert ist, kann die Bilder sehen.

kamera.cgi:


#!/bin/ash

set -f
pwd=`pwd`
echo "Content-type: text/html"
echo
echo "<HTML><HEAD><TITLE>Haus</TITLE>"
echo "<meta http-equiv="Refresh" content="60">"
echo "</HEAD>"

curl "http://10.0.0.81:81/snapshot.cgi?&resolution=32&user=USER&pwd=PASS&" > /volume1/web/img/cam1.jpg 
curl "http://10.0.0.82:82/snapshot.cgi?&resolution=32&user=USER&pwd=PASS&" > /volume1/web/img/cam2.jpg 
curl "http://10.0.0.83:83/snapshot.cgi?&resolution=32&user=USER&pwd=PASS&" > /volume1/web/img/cam3.jpg 
curl "http://10.0.0.84:84/snapshot.cgi?&resolution=32&user=USER&pwd=PASS&" > /volume1/web/img/cam4.jpg 

echo "<br>"
echo "<A HREF="/cgi-bin/kam1.cgi"><img src="/img/cam1.jpg" width="336" height="252" BORDER="0"></A>"
echo "<A HREF="/cgi-bin/kam2.cgi"><img src="/img/cam2.jpg" width="336" height="252" BORDER="0"></A>"
echo "<A HREF="/cgi-bin/kam3.cgi"><img src="/img/cam3.jpg" width="336" height="252" BORDER="0"></A>"
echo "<A HREF="/cgi-bin/kam4.cgi"><img src="/img/cam4.jpg" width="336" height="252" BORDER="0"></A>"
echo "<br>"
echo "<BODY>"
echo "</BODY></HTML>"
echo

Die Bilder selbst verweisen auf die Seiten kam1.cgi - kam4.cgi, in denen ich die Steuerung implementiert habe. Das ist zwar ein wenig aufwendig, funktioniert aber perfekt.

Dazu habe ich zunächst im Ordner /cgi-bin einen Unterordner /control erstellt und auch mit einer .htaccess und der gleichen .htpasswd wie oben versehen. Das ist nötig, damit nur autorisierte Nutzer an den Kameras drehen können.

Die Datei kam1.cgi liegt auch im Verzeichnis /cgi-bin und sieht folgendermaßen aus:


#!/bin/ash

set -f
pwd=`pwd`
echo "Content-type: text/html"
echo
echo "<HTML><HEAD><TITLE>Kamera 1</TITLE>"
echo "<meta http-equiv="Refresh" content="15">"
echo "</HEAD>"

curl "http://10.0.0.81:81/snapshot.cgi?&resolution=32&user=USER&pwd=PASS&" > /volume1/web/img/cam1.jpg 

echo "<br>"
echo "<img src="/img/cam1.jpg">"
echo "<br>"

echo "<A href="/cgi-bin/control/kam1_l.cgi">links</A> &nbsp &nbsp &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_r.cgi">rechts</A> &nbsp &nbsp &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_o.cgi">hoch</A> &nbsp &nbsp &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_u.cgi">runter</A> &nbsp &nbsp &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_home.cgi">home</A> &nbsp &nbsp &nbsp &nbsp"
echo "<br>"
echo "<br>"
echo "<A href="/cgi-bin/control/kam1_p1.cgi">1</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p2.cgi">2</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p3.cgi">3</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p4.cgi">4</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p5.cgi">5</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p6.cgi">6</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p7.cgi">7</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p8.cgi">8</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p9.cgi">9</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p10.cgi">10</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p11.cgi">11</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p12.cgi">12</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p13.cgi">13</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p14.cgi">14</A> &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_p15.cgi">15</A> &nbsp &nbsp"
echo "<BR>"

echo "<BR>"
echo "<A href="/cgi-bin/control/kam1_al1.cgi">Alarm ein</A> &nbsp &nbsp &nbsp &nbsp"
echo "<A href="/cgi-bin/control/kam1_al0.cgi">Alarm aus</A> &nbsp &nbsp"
echo "<BODY>"
echo "</BODY></HTML>"
echo

Die Dateien kam2.cgi … kam4.cgi sehen entsprechend aus.
Wie man sieht, gibt es nun die Schaltflächen links, rechts, hoch, runter, home, Alarm an, Alarm aus sowie die Anwahltasten für die 15 Positionen. Diese Schalter verweisen auf entsprechende Dateien im geschützten Ordner /cgi-bin/control.

Beispiel für das Script kam1_p1.cgi, was die Kamera Position 1 anfahren läßt und dann zurückspringt zu kam1.cgi:


#!/bin/ash

set -f
pwd=`pwd`
echo "Content-type: text/html"
echo
echo "<HTML><HEAD><TITLE>Kam1 Position 1</TITLE>"

echo "<script LANGUAGE="JavaScript">"
echo "   top.location.href='/cgi-bin/kam1.cgi'"
echo "</script>"
echo "</HEAD>"
curl "http://10.0.0.81:81/decoder_control.cgi?user=USER&pwd=PASSWD&command=31"
echo "<BODY>"
echo "</BODY>"
echo "</HTML>"

Hier noch das Beispiel für die Datei, mit der man den Alarm von Kamera1 ausschalten kann. Hier muss man ein Administrator-Login übergeben.

kam1_al0.cgi


#!/bin/ash

set -f
pwd=`pwd`
echo "Content-type: text/html"
echo
echo "<HTML><HEAD><TITLE>Kam1 Alarm aus</TITLE>"

echo "<script LANGUAGE="JavaScript">"
echo "   top.location.href='/cgi-bin/kam1.cgi'"
echo "</script>"
echo "</HEAD>"
curl "http://10.0.0.81:81/set_alarm.cgi?user=ADMINISTRATOR&pwd=PASS&motion_armed=0"
echo "<BODY>"
echo "</BODY>"
echo "</HTML>"

Nochmal zusammengefasst, habe ich dank NobiMan s tatkräftiger Hilfe folgendes realisiert:

  1. Ein script holt bei Aufruf aus dem Netz die aktuellen Standbilder von 4 Kameras im heimischen Netz 10.0.0.0 ab und generiert daraus eine html-Seite. Es ist dazu nicht notwendig, dauernd über den ftp-Client der Kameras Bilddateien auf den Server zu schreiben.
  2. Bei Aufruf der Seite gibt es keinen Verweis auf die globalen Adressen und Ports der einzelnen Kameras. Die gesamte Seite inclusive Bilder ist einfach über den Port 80 erreichbar, so dass die vier Bilder auch von einem auf die Ports 80 und 443 beschränkten Mobilfunkaccount (z.B. Vodafone live!) oder von einem ähnlich abgeschotteten Firmennetz erreichbar sind.
  3. Auf gleiche Weise kann man alle 4 Kameras auch aus dem Netz heraus über einen einzigen Port steuern (also z.B. drehen, oder den Alarm ein und ausschalten).
  4. Das Ansehen der Bilder und das Bedienen aller vier Kameras ist passwortgeschützt. Man muss sich nur genau einmal autorisieren und hat dann Zugriff auf alle Funktionen der 4 Kameras.

Nochmals ganz vielen Dank an NobiMan

Hallo ,
ich benutze gerade Ubuntu 12.04 und möchte ein Shell-Skript zum Ablaufen von 2 Webcams extern (bsp Webcam Landtag) erstellen!
Kann mir Jemand bitte helfen!!

Mojnsen :wink:
was soll Ablaufen? Welcher Landtag?
Im Prinzip steht alles hier im Thread, bis auf das Portforwarding im Router für den externen Zugriff, da hilft aber die Suchfunktion des Forums :wink:

Cu
Nobi

Hi,
wofür benutzt man dem Befehl curl?

Mojnsen :wink:
einfach mal an der Kommandozeile „man curl“ bzw. „info curl“ eingeben :wink:

Und nochmal: Alles, was notwendig ist, um Dein Projekt zu realisieren, steht in diesem Thread! Allerdings zeigen mir Deine Fragen, dass Dir allerlei Basics fehlen (bitte nicht in den falschen Hals bekommen), da solltest Du zunächst mal die einschlägige Fachliteratur und Dokumentation konsultieren, wenn es dann noch klemmt, wird sich hier sicher ein Weg finden, den Schubs in die richtige Richtung zu geben!

Cu
Nobi
P.S.: Es reicht hier im Forum zu schreiben, solche Themen per PN zu besprechen, schliesst andere User des Forums aus, was dem Grundgedanken eines solchen Forums wiederspräche :wink: