Zřizujeme webkameru s OpenWRT

18. 9. 2009
Doba čtení: 5 minut

Sdílet

Dnešní díl se nebude točit ani tak kolem OpenWRT jako takového, ale kolem jednoho balíčku, který nám velmi jednoduše umožní nakonfigurovat webovou kameru tak, aby byla přístupná pro naše přátele na síti. V minulém díle jsme si představili RouterStation s USB portem, tak proč toho teď nevyužít.

Postup, který níže uvedu, je s malými obměnami platný pro všechny distribuce. Tahle činnost je ale pro OpenWRT a pro malé desky jako stvořená, takže by byla škoda si o ní neříct.

Nabízí se otázka, proč monitorovat okolí domu nebo třeba i vnitřek. Lidé, včetně mě, k tomu mají svoje důvody. Pro linuxáky by mělo stačit „protože můžu“, ale existují i jiné důvody jako „soused mi krade dříví“, „chci se podívat, jaké je doma počasí“, „moje manželka asi s někým spí“ a samozřejmě velmi populární „kdo mi v noci objel klíčem auto“. Využití je spousta a dostat se k požadované funkčnosti není tak složité.

Jestli se vám myšlenka líbí a chcete si něco podobného vytvořit, tak musíte splňovat následující podmínky:

  • Funkční OpenWRT na HW s USB portem
  • Podporovanou webkameru
  • Program Motion

Pokud jste seriál sledovali dobře a vyzkoušeli si nastavit OpenWRT, měli byste mít na stole vše pro splnění první podmínky. Druhá podmínka se vyplňuje hůře. Já měl se svou MSI StarCam Clip štěstí a stačilo nainstalovat balíčky kmod-video-core a kmod-video-sn9c102. Tím přidáme do OpenWRT podporu pro Video for Linux a ovladač pro web kameru. Pokud máte funkční ovladač, tak zbývá nainstalovat program Motion.

Nyní přejdeme k HW části. Zmíněná kamerka je určená k použití v pohodlí rámu monitoru. Pokud jste na tom stejně jako já a chcete si dát kamerku ven, mělo by stačit ji dát do nějaké průhledné krabičky a zaizolovat silikonem. Tři týdny mi takhle kamerka funguje bez jediného problému a prošla již i několikrát deštěm. Použití venku se přímo nabízí, protože routery často bývají někde pod střechou.

webcam

Motion

Pro detekci pohybu, záznam obrazu a provozování webkamery jako takové se nejvíce hodí multifunkční program Motion. Obsahuje webový server, přes který se dá dívat na aktuální obraz nebo částečně ovlivňovat konfiguraci. Motion také umí jednou za čas uložit jeden snímek a tím zaznamenávat, co se děje v okolí.

Motion nainstalujeme jednoduše z balíčku.

$ opkg install motion 

Nainstaluje se nám trošku okleštěnější Motion, kterému budeme muset upravit konfigurační soubor tak, aby se nesnažil nastavovat, co v něm není zakompilované. Abychom se dostali až k webovému serveru, musíme nastavit několik hodnot v konfiguračním souboru /etc/motion.conf. Jde o tyto hodnoty:

daemon on # daemon mód
process_id_file /var/run/motion/motion.pid # PID
videodevice /dev/video0 # cesta ke kameře
width 640 # šířka videa
height 480 # výška videa
quality 75 # kvalita obrazu
text_right %Y-%m-%d\n%T-%q # text v pravo dole
text_left Lanskroun - Housti # text v levo dole
target_dir /tmp/cam/ # kam ukládat snímky
webcam_port 8081 # port, na kterém má běžet webserver s obrazem kamery
webcam_quality 70 # kvalita obrazu
webcam_motion on # zvýšit framerate při detekování pohybu
webcam_maxrate 3 # maximální počet snímků za sekundu
webcam_localhost off # povolit přístup i z jiných strojů než localhostu
control_port 8080 # konfigurační stránka
control_localhost on # povolit konfiguraci jen z lokálního stroje
control_html_output on # používat HTML

Dále je potřeba odstranit několik hodnot, které sice konfigurační soubor obsahuje, ale patří vlastnostem, které nejsou v Motionu zkompilované. Jde o všechny parametry začínající na ffmpeg, sql a ještě parametry movie_filename a timelapse_filename.

U ostatních parametrů necháváme výchozí hodnoty. Co znamenají, se dá najít v manuálu.

Po nastartování programu Motion se už můžeme podívat na obraz zadáním IP adresy routeru a portu 8081 do prohlížeče, např. 10.0.0.1:8081. Parametrem webcam_macrate nastavíme počet snímků za sekundu a pokud máte rychlou linku, dostanete se na relativně plynulý obraz.

Motion

Motion není náročný a na RouterStation zatěžuje procesor přibližně na 30 %, když se na video někdo dívá při třech snímcích za sekundu, přičemž změna počtu snímků za sekundu se výrazně nepodepisuje na zatížení. Co je trochu více limitující, je velikost flash paměti. Pokud si chcete ukládat každých XX sekund snímky, připravte si externí nebo síťový disk, na kterém to bude možné realizovat.

Bohužel má Motion v OpenWRT malé nedostatky. Nedokáže se samo spustit jako daemon, i když mu to uživatel řekne jak v konfiguračním souboru, tak parametrem. Daemon také nereaguje na některé parametry, např. na snapshot_interval. Tím se nastavuje interval mezi ukládáním snímků na disk. Když do něj nastavíte nějakou hodnotu, bude Motion stejně ukládat snímky, jak se mu zlíbí. Oba problémy by pravděpodobně vyřešila nová verze programu.

První problém můžeme obejít např. přes pythoní skript:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os,sys

if __name__ == "__main__":
        # do the UNIX double-fork magic, see Stevens' "Advanced
        # Programming in the UNIX Environment" for details (ISBN 0201563177)
        try:
                pid = os.fork()
                if pid > 0:
                        # exit first parent
                        sys.exit(0)
        except OSError, e:
                print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
                sys.exit(1)

        # decouple from parent environment
        os.chdir("/")   #don't prevent unmounting....
        os.setsid()
        os.umask(0)

        # do second fork
        try:
                pid = os.fork()
                if pid > 0:
                        # exit from second parent, print eventual PID before
                        #print "Daemon PID %d" % pid
                        open("/var/run/pythondm",'w').write("%d"%pid)
                        sys.exit(0)
        except OSError, e:
                print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
                sys.exit(1)

        os.system("motion -c /etc/motion.conf")

Tomu ještě musíme doplnit init skript /etc/init.d/motion:

bitcoin_skoleni

#!/bin/sh /etc/rc.common

start() {
        echo "Starting motion"
        /opt/daemon.py
}

stop() {
        echo "Stopping motion"
        killall motion
}

Skript by se dal nahradit programem daemon, který je napsaný v C, a tak nevyžaduje nainstalovaný Python. Ten ale není v repositáři OpenWRT.

Závěr

Takto provozovaná webkamera jede stabilně a bez náznaku potíží. Rozchodit ji je trochu kostrbaté, ale můžeme doufat, že se to v budoucnu změní.

Odkazy

Seriál: OpenWRT

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.