Webcam

Automatischer FTP-Upload mit der Axis 207MW

 
Ich habe mir die Axis 207MW eigentlich zum automatischen Upload von Bildern für meine Website zugelegt. Nach dem Kauf habe ich allerdings festgestellt, dass die Software der Cam von Haus aus gar keine solche Funktion bietet...

Nach kurzer Google-Konsultation wusste ich, dass auf der Cam ein Embedded Linux läuft und es mit den bordeigenen Mitteln trotzdem möglich sein sollte, einen solchen automatischen Upload einzurichten. "shttpclient", "sftpclient" und eine art cron-job namens "utask" sind dafür vorhanden und warten darauf, eingesetzt zu werden.

Grundlage war in erster Linie das Tutorial von Volker Siebert. Vielen Dank an dieser Stelle für die ausführlichen Infos.

Also, legen wir los! ;-)

Als erstes muss die IP-Cam korrekt im LAN eingerichtet werden. Es ist dabei egal, ob dies nun per LAN oder W-LAN gemacht wird.

In meinem Fall wurde die Cam mit der Firmware 4.44 ausgeliefert. Im LAN funktionierte alles einwandfrei, aber im W-LAN-Betrieb verlor ich alle paar Sekunden die Verbindung zum Access-Point. Nach ewiger Rumprobiererei habe ich dann mal ein FW-Upgrade auf die Version 4.44.1 gemacht und siehe da, seitdem funktioniert auch der Betrieb im W-LAN zuverlässig.

Dateizugriff per FTP


Man kann mit einem beliebigen FTP-Client (z.B. FileZilla) auf das Dateisystem der Axis-Cam zugreifen. Als Host muss die IP-Adresse der Cam angegeben werden. Die Anmeldung erfolgt mit dem Benutzer "root" und dem entsprechenden Passwort.

Telnet aktivieren


Standardmässig ist Telnet deaktiviert. Um Telnet zu aktivieren muss per FTP das File "inittab" im Verzeichnis /etc auf den lokalen Rechner kopiert werden. Anschliessen kann die Datei (lokal) mit einem Texteditor (in meinem Fall PSPad) geöffnet und bearbeitet werden.

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

Mit dem # wird eine Zeile auskommentiert, also muss zum aktivieren von Telnet einfach das # vor der zweiten Zeile gelöscht werden. Danach kann die Datei gespeichert und mit dem FTP-Client wieder auf die Kamera hochgeladen werden (bestehende Datei überschreiben).

Zum Schluss muss die Cam noch neu gestartet werden. Am einfachsten über das Webinterface (System Options > Maintenance > Button "Restart").

shttpclient

 
Nun greift man wie folgt per Telnet auf die Kamera zu:

- Öffnen einer DOS-Box mit "cmd.exe"
- Eingabe: telnet <IP-Adresse der Kamera>
- login: root [Enter]
- Passwort: <das entsprechende Passwort für den root-Benutzer> [Enter]

Nun kann man mit folgendem Befehl ein Bild vom internen HTTP-Server abrufen:

shttpclient -o /tmp/snap1.jpg -u root -w passwort http://127.0.0.1/axis-cgi/jpg/image.cgi?resolution=640x480

Beim Passwort muss natürlich das korrekte Passwort für den root-Benutzer eingegeben werden. Mit diesem Befehl wird ein Bild in der Grösse 640x480 im Verzeichnis /tmp (Ram-Disk) abgelegt. Das entsprechende Bild kann man anschliessend wieder mit dem FTP-Client aus dem /tmp-Verzeichnis auf den lokalen Rechner kopieren.

Falscher JPG-Header


Nun stellt man fest, dass das Bild gar nicht angezeigt werden kann. Das rührt daher, dass das Bild einen fehlerhaften Header hat. Keine Ahnung, warum das nun so ist; ich gehe davon aus, dass das ein Fehler in der Firmware der Kamera ist und evtl. wird dies in einer späteren FW-Version behoben sein...

Mit den folgenden beiden Befehlen wird der fehlende Teil des Headers erstellt und anschliessend dem bestehenden Bild hinzugefüg und ein neues/korrektes Bild (snap.jpg) erstellt:

echo -ne 'headr' | tr -s 'headr' '\377\330\377\340\000' > /tmp/header.bin
cat /tmp/header.bin /tmp/snap1.jpg > /tmp/snap.jpg

Dieses Bild kann man nun erneut mit dem FTP-Client auf den PC laden; und dieses sollte nun auch korrekt angezeigt werden.

Upload per sftpclient


Das korrekte Bild kann nun mittels sftpclient auf einen Webserver hochgeladen werden:

sftpclient -p <webserver> -s -u <benutzer> -w <passwort> -l /tmp/snap.jpg -c /httpdocs/webcam/ -d snap.jpg

Webserver, Benutzer, Passwort und auch der Pfad auf dem Server (in meinem Fall "/httpdocs/webcam/") müssen natürlich angepasst werden.

Skript erstellen


Die obigen Schritte können nun in einem Shell-Script zusammengefasst werden. Der Inhalt schaut dann in etwa so aus:

#!/bin/sh
shttpclient -o /var/tmp/snap1.jpg -u root -w passwort http://127.0.0.1/axis-cgi/jpg/image.cgi?resolution=640x480
echo -ne 'headr' | tr -s 'headr' '\377\330\377\340\000' > /tmp/header.bin
CAT=/bin/cat
cat /tmp/header.bin /tmp/snap1.jpg > /tmp/snap.jpg
sftpclient -p <webserver> -s -u <benutzer> -w <passwort> -l /tmp/snap.jpg -c /httpdocs/webcam/ -d snap.jpg

Das Script speichere ich unter dem Namen "snapshot.script" ab (die Dateierweiterung ist eigentlich egal) und lade es per FTP-Client auf die Kamera ins Verzeichnis /etc. Damit das Script auch ausgeführt werden kann muss die Berechtigung auf den Wert 755 (chmod) gesetzt werden. Mit FileZilla kann das per rechter Maustaste und Eigenschaften gemacht werden.

Anschliessend kann das Script natürlich per Telnet getestet werden, einfach anmelden und "/etc/snapshot.script" eingeben.

Automatisieren per utask


utask ist eine Art cron-Job im Embedded-Linux. Es ist nicht ganz so umfangreich, aber für unsere Zwecke bestens geeignet. Dazu laden wir wieder per FTP die "user.task.list" aus dem Verzeichnis /etc auf den lokalen Rechner und bearbeiten sie mit dem Editor. Es sind bereits einige Beispiele (auskommentiert) im File enthalten, diese kann man einfach stehen lassen und bspw. am Schluss den gewünschten "Task" hinzufügen:

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

Damit wird das Script nun zwischen 6.00 und 21.50 Uhr alle 10 Minuten automatisch ausgeführt.

Anschliessend kann das File einfach wieder per FTP auf die Kamera übertragen werden (altes File überschreiben).

Damit der Task aktiv wird muss entweder die Kamera neu gestartet werden oder man kann auch nur utask mit folgendem Befehl neu starten (in Telnet):

killall -usr1 utask

Problembehebung


Ich habe leider nicht gross Ahnung von Linux-Systemen. Bei mir hat eigentlich soweit alles geklappt bis auf die Automatisierung per utask. Ich habe alles wie oben Beschrieben durchgeführt, aber das Script wurde einfach nicht automatisch ausgeführt... Nach stundenlangem rumtesten habe ich dann gemerkt, dass ich im PSPad vor dem abspeichern der Files immer das Format auf "UNIX (LF)" umstellen muss. Wenn die Files anschliessend mit dem Editor/Notepad geöffnet werden, müssen alle Zeilenumbrüche verschwunden sein! Mit dieser Erkenntnis hat anschliessend alles einwandfrei funktioniert.

Kommentar


Grundsätzlich sind die Axis-Kameras qualitativ sicher ihr Geld wert. Im Fall der 207MW finde ich es Schade, dass ein "einfacher" Taskplaner für obige Funktion im Admin-Bereich fehlt. Ich bin der Meinung, dass sowas einfach zur Grundausstattung einer IP-Cam gehören sollte. OK, "man kann's ja trotzdem einrichten" mögen jetzt einige behaupten, aber wer nicht wirklich ein Minimum an Ahnung hat und auch nicht unendlich Zeit aufwenden mag, dem wird's einfach nicht gelingen... Aber vielleicht hilft mein Tutorial ja mal jemandem weiter ;-)

Quellen


- Tutorial von Volker Siebert
- Dokumentation der Axis API
- Axis Scripting-Guide
- Dokumentation utask