FTP-Upload mit der Axis 207W

 Navigation
· Einleitung
· Voraussetzungen
· Bildformat auswählen
· Dateitransfer
· Telnet
   · Telnet aktivieren
   · Telnet ausprobieren
   · Telnet deaktivieren
· Tools ausprobieren
   · Bilder abrufen mit "shttpclient"
   · Bilder hochladen mit "sftpclient"
· Skripting
   · Skript schreiben
   · Skript als Job einbinden
· Abschluss
Version 1.1, Stand: 03.05.2007

Einleitung

Axis 207W NetzwerkkameraDie Axis 207W ist eine Webcam mit einem guten Preis/Leistungsverhältnis und einem (IMHO) sehr guten Bild.

Leider ist die integrierte Software hauptsächlich auf den Betrieb als Live-Bild-Server ausgelegt, und die von mir benötigte Möglichkeit eines zeitgesteuerten Uploads von Bildern via FTP ist dort nicht vorgesehen.

Natürlich könnte man dieses Problem mit einem separaten Programm lösen, das die Bilder bei der Webcam abruft und dann auf einen FTP-Server hochspielt - doch leider konnte (und wollte) ich diesen Weg bei meinem speziellen Projekt nicht gehen.

Erstens sollte die Kamera von außen aus dem Internet nicht erreichbar sein, und zweiten sollte sie autark ohne sonstige Rechner im lokalen Netzwerk ihren Dienst verrichten.

Schließlich habe ich eine (wenn auch nicht ganz simple) Lösung gefunden: da in der Kamera ein kleines Embedded Linux läuft, gibt es dort auch so etwas wie cron (nennt sich dort nur utask und kann nicht ganz so viel) und außerdem die beiden Tools shhtpclient und sftpclient.

Ursprünglich habe ich dieses Tutorial im Juli 2006 im Forum von City-Webcams.de veröffentlicht. Da ich jetzt erneut eine Kamera auf dieselbe Weise einrichten musste, habe ich alle Punkte noch einmal ausführlich nachvollzogen und aufgeschrieben.

Voraussetzungen

Die folgende Beschreibung setzt voraus, dass die Kamera erfolgreich in das lokale Netz eingebunden wurde und unter einer bestimmten IP-Nummer erreichbar ist. Ausprobieren kann man dies über ein ping {IP} auf der Kommandozeile oder indem man die Seite http://{IP}/ im Browser aufruft.

Auch sollte ein NTP-Zeitserver gesetzt sein, so dass die Kamera nach dem booten immer direkt die korrekte Zeit hat. Hier kann man z.B. 0.de.pool.ntp.org oder ptbtime1.ptb.de benutzen. Eintragen kann man es im Setup unter System Options > Date & Time - dort kann man übrigens auch die Zeitzone sowie das Format für Datum und Uhrzeit einstellen, die mit den Parametern clock und date in das Webcam-Bild eingefügt werden können.

Bildformat auswählen

Neben allen anderen Funktionen bietet die Kamera auch die Möglichkeit, über URLs der Art

http://{IP}/axis-cgi/jpg/image.cgi?resolution=640x480&clock=0&date=0&text=0

direkt ein Standbild abzurufen. Das Format dieser URL und die möglichen Parameter werden in der AXIS VAPIX™ API, HTTP - Interface Specification beschrieben.

Hier ein Auszug der wichtigsten Parameter:

Parameter  Beschreibung  Mögliche Werte
resolutionGröße des Bildes (Breite x Höhe)640x480 usw.
compressionKompressionsrate in %
(kleinerer Werte = bessere Qualität aber größere Datei)
2 bis 100
clockUhrzeit einblenden (Schalter)0, 1
dateDatum einblenden (Schalter)0, 1
textText einblenden (Schalter)0, 1
textstringEinzublendender Text (URL-Format)Meine%20Webcam
rotationBildrotation (im Uhrzeigersinn)0, 90, 180, 270

Nur wenn clock, date und text ausgeschaltet sind zeigt das Kamerabild keinen schwarzen Balken am oberen Rand.

Die Parameter werden nach dem "?" alle mit "&" getrennt aufgeführt. Sucht euch das gewünschte Bildformat aus und merkt euch die URL.

Dateitransfer

Für die folgenden Punkte wird es wichtig sein, Dateien zwischen dem Linux-System der Kamera und dem lokalen Rechner auszutauschen.

Dazu könnt ihr z.B. einen grafischen FTP-Client wie FileZilla benutzen, es geht aber auch mit Bordmitteln, nämlich mit dem in Windows eingebauten Kommandozeilen FTP-Client.

Startet dazu eine Kommandozeile und wechselt mit cd in das Verzeichnis, in dem ihr die Dateien hin und her schieben wollt. Danach ruft ihr das Programm ftp mit der IP-Adresse der Webcam auf:

C:\Axis> ftp {IP}
Verbindung mit {IP} wurde hergestellt.
220 AXIS 207W Network Camera 4.40 (Sep 15 2006) ready.
Benutzer ({IP}:(none)): root
331 User name okay, need password.
Kennwort: ***
230 User logged in, proceed.
ftp> cd etc
250 Command successful.
ftp> ascii
200 Command okay.

Bei der Verbindung mit der Kamera muss man sich zunächst mit dem Benutzernamen root und dem dafür vergebenen Passwort authentifizieren. Außerdem sollte man direkt in das Verzeichnis /etc wechseln und den ASCII-Modus einschalten, den wir zum Übertragen von Textdateien brauchen.

Um eine Datei von der Kamera auf den lokalen Rechner zu kopieren benutzt man den Befehl get zusammen mit dem Dateinamen (in diesem Beispiel inittab):

ftp> get inittab
200 Command okay.
150 Opening data connection.
226 Transfer complete.
FTP: ??d Bytes empfangen in ??Sekunden ??KB/s

Um eine Datei vom lokalen Rechner auf die Kamera zu kopieren benutzt man den entsprechenden Befehl put zusammen mit dem Dateinamen (in diesem Beispiel ebenfalls wieder inittab):

ftp> put inittab
200 Command okay.
150 Opening data connection.
226 Transfer complete.
FTP: ??d Bytes gesendet in ??Sekunden ??KB/s

Beendet wird die Verbindung schließlich mit dem Befehl quit:

ftp> quit
221 Goodbye.
C:\Axis> 

Telnet

Telnet aktivieren

Da die Kamera selbst die Bilder hochladen soll ist es von Vorteil, die Kommandozeilen-Befehle direkt auf der Kamera testen zu können. Dazu empfiehlt es sich, für diese Testphase den Zugriff per Telnet freizuschalten.

Eine allgemeine Beschreibung des Shell-Skripting findet man in Scripting-Guide [PDF] bei Axis. Ab Seite 12 wird beschrieben wie man den Telnet-Server aktiviert.

Dazu muss die Datei /etc/inittab per FTP auf den lokalen Rechner heruntergeladen, geändert und dann wieder zur Kamera hochgeladen werden (siehe Dateitransfer).

Zum Ändern solltet ihr die Datei inittab mit einem Texteditor wie z.B. Notepad öffnen. Dies geht nicht mit einem Doppelklick, da die Datei keine Endung hat, sondern ihr müsst zunächst den Editor starten, dann im Menü Datei > Öffnen... auswählen, den Dateityp auf "Alle Dateien" ändern und die Datei inittab öffnen.

In den Zeilen 15 und 16 steht der folgende Text:

# Uncomment the following line to start the telnet server.
# tnet:35:once:/usr/sbin/telnetd

Hier muss man nur einfach das # vor der zweiten Zeile entfernen, es muss also danach so aussehen:

# Uncomment the following line to start the telnet server.
tnet:35:once:/usr/sbin/telnetd

Danach speichert ihr die Datei, verlasst den Editor, geht zurück zum FTP-Client und spielt die Datei wieder zur Kamera hoch.

Abschließend muss die Kamera neu gestartet werden. Dies geht über den einfach Weg, den Stecker herauszuziehen, aber auch über das Setup im Browser (System Options > Maintenance > Knopf Restart oben).

Telnet ausprobieren

Nach dem Neustart kann man via Telnet eine Verbindung zur Kamera aufbauen und erhält eine Linux Kommandozeile (Shell), an der man sich als Benutzer root mit dem bekannten Passwort anmelden kann:

C:\Axis> telnet {IP}

4.40
Linux 2.6.16 on a armv4tl (00:00:33)
axis-00408cXXXXXX login: root
Password: ***
[root@axis-00408cXXXXXX /]586# ls -l
drwxr-xr-x    1 root     root         2404 Sep 15  2006 bin
drwxr-xr-x    1 root     root         1540 Sep 15  2006 dev
lrwxrwxrwx    1 root     root           13 Sep 15  2006 etc -> mnt/flash/etc
drwxr-xr-x    1 root     root         1124 Sep 15  2006 lib
-rwxr-xr-x    1 root     root         1347 Sep 15  2006 linuxrc
drwxr-xr-x    1 root     root           84 Sep 15  2006 mnt
dr-xr-xr-x   76 root     root            0 Jan  1 00:00 proc
drwx------    1 root     root            0 Sep 15  2006 root
drwxr-xr-x    1 root     root          660 Sep 15  2006 sbin
drwxr-xr-x   10 root     root            0 Jan  1 00:00 sys
lrwxrwxrwx    1 root     root            7 Sep 15  2006 tmp -> var/tmp
drwxr-xr-x    1 root     root          120 Sep 15  2006 usr
drwxr-xr-x    9 root     root          180 Jan  1 00:00 var
[root@axis-00408cXXXXXX /]586#

Beenden kann man die Telnet-Session ganz einfach mit dem Befehl exit.

[root@axis-00408cXXXXXX /]586# exit


Verbindung zu Host verloren.

C:\Axis>

Das wollen wir aber jetzt noch nicht...

Telnet deaktivieren

Ein Hinweis für die Sicherheitsbewussten unter euch.

Wenn ihr nach der erfolgreichen Einrichtung den Telnet-Server wieder deaktivieren wollt, so müsst ihr einfach das # in der Zeile 16 der Datei /etc/inittab wiederherstellen und die Datei wieder per FTP zur Kamera hochladen. Nach einem weiteren Neustart sollte der Zugriff per Telnet nicht mehr möglich sein.

Tut das aber nicht jetzt - wir brauchen den Telnet-Zugriff ja noch.

Tools ausprobieren

Bilder abrufen mit "shttpclient"

Im Telnet-Fenster nutzen wir jetzt das Tool shttpclient, um das oben ausgesuchte Bild vom internen HTTP-Server abzurufen. Dazu muss man die IP-Adresse durch 127.0.0.1 ersetzen, jedes "&" mit einem Backslash versehen und auch die Login-Daten mit angeben.

shttpclient -o /tmp/snap.jpg -u www-user -w www-password http://127.0.0.1/axis-cgi/jpg/image.cgi?resolution=640x480\&clock=0\&date=0\&text=0

Wichtig: Das muss alles in einer Zeile eingegeben werden.

-o /tmp/snap.jpg ist der Name der Datei, die erzeugt werden soll. Das Verzeichnis /tmp liegt auf einer Ramdisk, daher sollte man dies immer für solche temporären Daten benutzen.

-u www-user und -w www-password sind die Daten, die man beim Einloggen in die Kamera per Browser angeben muss. Dies kann der Administrator (root) sein, aber da hier das Kennwort im Klartext angegeben werden muss, möchtet ihr euch dafür vielleicht einen neuen User im Setup der Kamera einrichten (unter System Options > Security > Users).

Eine vollständige Liste der Parameter von shttpclient findet man im oben schon genannten Axis Scripting-Guide ab Seite 18.

Zum Modifizieren der Parameter könnt ihr übrigens einfach die "Cursor nach oben"-Taste benutzen, Änderungen vornehmen und mit der Eingabetaste erneut abschicken.

Das Programm shttpclient ist nicht gerade fehlertolerant - gibt man auf der Kommandozeile falsche Parameter an, so verabschiedet es sich meist mit einem Segmentation fault.

Mit dem Programm ls kann man sich Informationen zu der gerade erzeugten Datei anzeigen lassen:

[root@axis-00408cXXXXXX /]586# ls -l /tmp/*.jpg
-rwx------    1 root     root        92238 Jan  1 00:19 /tmp/snap.jpg

Bilder hochladen mit "sftpclient"

Jetzt benutzen wir das Tool sftpclient, um das gerade erzeugte Bild auf unseren FTP-Server hochzuladen.

sftpclient -p ftp-site -s -u ftp-user -w ftp-password -l /tmp/snap.jpg -c . -d snap.jpg

Wichtig: Das muss alles in einer Zeile eingegeben werden.

-p ftp-site ist die Internetadresse eures FTP-Servers, also entweder der Name wie ftp.myname.de oder die IP-Nummer.

-s schaltet den passiven FTP-Modus ein. Probiert einfach aus, ob ihr diese Option benötigt.

-u ftp-user und -w ftp-password sind die Login-Daten für eben diesen FTP-Server.

-l /tmp/snap.jpg ist der Name der Datei, die hochgeladen werden soll. Dieser sollte natürlich dem Dateinamen aus dem vorherigen Beispiel entsprechen.

-c . ist das Verzeichnis, in dem die Datei auf dem FTP-Server gespeichert werden soll. In diesem Fall ist die Angabe eigentlich überflüssig, da "." das aktuelle Verzeichnis bezeichnet, also das Standardverzeichnis des angegebenen Benutzers.

-d snap.jpg ist der Name, den die Datei auf dem FTP-Server erhalten soll. Man kann die Datei also beim hochladen auch gleich umbenennen.

Eine vollständige Liste der Parameter von sftpclient findet man im oben schon genannten Axis Scripting-Guide ab Seite 16.

Jetzt solltet ihr natürlich nachsehen, ob das Bild auch auf dem Server angekommen ist.

Ergänzung: Wenn ihr Dateien mit dynamischen Namen hochladen wollt, dann könnt ihr dazu die Mächtigkeit der Linux Shell nutzen und z.B. den Dateinamen per date erzeugen:

sftpclient ... -d `date +snap_%H%M.jpg`

Die so hochgeladenen Dateien haben dann die Stunde und Minute mit im Dateinamen. Über Backquotes kann man in der Shell die Ausgaben von anderen Programmen in eine neue Zeile einfügen lassen, hier die Ausgabe von date.

Das kann man natürlich vorher ausprobieren, indem man einfach date +snap_%H%M.jpg auf der Kommandozeile aufruft und sich die Ausgabe ansieht.

Skripting

Skript schreiben

Diese beiden Schritte fassen wir nun zu einem Shell-Script zusammen.

Dazu erstellt ihr auf dem lokalen Rechner eine neue Textdatei mit dem folgenden Inhalt:

#!/bin/sh
shttpclient ...
sftpclient ...

Die beiden Zeilen mit den Punkten sind jeweils die, die ihr oben durch ausprobieren festgestellt habt. Diese Datei speichert ihr unter dem Namen snapshot.script ab. Hinweis: die Endung der Datei ist unter Linux egal - ihr könnt sie auch snapshot.txt nennen, wenn sie dadurch für euch einfacher zu bearbeiten ist (Doppelklick).

Diese Datei laden wir per FTP in das Verzeichnis /etc der Kamera (siehe Dateitransfer).

Wechselt jetzt zurück in das Telnet-Fenster, geht in das Verzeichnis /etc und markiert die gerade hochgeladene Datei als ausführbar:

[root@axis-00408cXXXXXX /]586# cd /etc
[root@axis-00408cXXXXXX /]586# chmod 755 snapshot.script

Nun könnt ihr das Skript manuell starten:

[root@axis-00408cXXXXXX /]586# ./snapshot.script

...und dann auf eurem FTP-Server überprüfen, ob das Bild angekommen ist.

Skript als Job einbinden

Der letzte Schritt ist nun, das gerade geschriebene Skript als Job einzubinden, so dass es automatisch in einem bestimmten Zeitintervall ausgeführt wird.

Bei einem Standard-Linux wäre dies die Aufgabe für einen cron-Job. Das kleine Embedded-Linux bietet etwas Vergleichbares, das zwar nicht ganz so mächtig ist wie cron aber für unsere Zwecke reicht: utask. Eine Beschreibung dieses kleinen Programms findet man ebenfalls auf der Axis-Site.

Zunächst laden wir die Datei user.task.list aus dem Verzeichnis /etc auf den lokalen Rechner herunter (siehe Dateitransfer).

Dort fügt ihr am Ende eine Zeile hinzu in der Form:

time(h(0-23)m(0-59)s(0)) once immune % /etc/snapshot.script;

Dies weist utask an, das Skript /etc/snapshot.script einmal pro Minute auszuführen.

Danach müssen wir die Datei wieder zur Kamera hochladen. Damit die neuen Einstellungen benutzt werden, kann man utask in der Telnet-Session das Signal 10 schicken (wohl eher was für UNIX/Linus-Profis) oder einfach das Gerät neu starten.

Auch andere Zeitintervalle sind möglich. Die Zeile

time(h(8-16)m(0,10,20,30,40,50)s(0)) once immune % /etc/snapshot.script;

führt das angegebene Skript von 8:00 Uhr bis 16:50 Uhr alle 10 Minuten aus. Eine genaue Beschreibung findet sich im o.g. Dokument.

Abschluss

Das war's - ich hoffe es war nicht zu kompliziert.

Hier noch einmal die referenzierten Dokumente:

Feedback welcome! Fragen und Anregungen (auch Tippfehler) bitte einfach per Mail an mich.

 
 
 
Alle genannten Marken- und Produktbezeichnungen sind Warenzeichen der entsprechenden Inhaber.

Zusätzliche Suchbegriffe

Axis 207, Axis 207-W, Axis 207MW, Axis 207-MW.

Flocke's Garage
Valid HTML 4.01 Transitional Valid CSS!
(C) 2005-2013 Volker Siebert.
Creative Commons-LizenzvertragDer gesamte Inhalt dieser Webseite steht unter einer Creative Commons-Lizenz (sofern nicht anders angegeben).