Jak si poradí RouterStation s webkamerou
Embedded zařízení většinou nemají bůhví jak silný procesor, ale RouterStation je hezkou výjimkou. Jinde sice máte kompletní zařízení i s integrovanou WiFi kartou a krabičkou, většinou v nich ale najdeme pouze nějaký 200MHz šunt, který sotva zvládne routovat natož shapovat nějaký větší provoz. Jsou to taky krabky, co strčíme doma pod stůl a nějakej čas o nich nevíme... dokud se nezahryznou a nevyžadují reset. V takových krabičkách jsou často nastaveny i krvavé limity třeba na NAT tabulku. Neomezený torrent pak udělá s připojením své. Často je problém ADSL routerů právě zde a ne v samotné ADSL lince. RouterStation má v sobě rychlíka, tikajícícho na 680 MHz. Za tuto cenu na něj nemá žádná z u nás dostupných desek.
Výkonu je třeba využít, takže jsem se rozhodl pro pokus. Pomocí programu motion jsem vytvořil webkameru dostupnou z webu a pomocí collectd a htop sledoval zatížení systému. Výsledky jsou slibné. Obraz kamery je totiž zpracováván, i když se zrovna nikdo nedívá. Router routuje jen domácí provoz, takže bez kamery se procesor drží u prvních několika procent a load atakuje nulu. S kamerou se čísla trochu hnula. Když se nikdo nedívá, tak běží procesor mezi 17-20 % a load je na 0.30, 0.19 a 0.16. Když se někdo dívá tak je to 30 % a roste to s každým novým spojením. Load se po několika minutách zvedne na 0.61, 0.30 a 0.20.
Výsledky samozřejmě ovlivňuje nastavení kvality obrazu. I tak ale mohu prohlásit, že je RouterStation připraven i na zpracování obrazu z webkamery a ještě hodně výkonu zbude.
Kamera v OpenWRT
A teď jak na webkameru v OpenWRT. Potřebujeme k tomu podporu pro v4l a balíček s naším ovladače. Pro mě to byli:
- kmod-video-core
- kmod-video-sn9c102
U vaší kamerky to bude pravděpodobně jinak. Chce to hledat chip a zkoušet drivery.
Druhá věc, kterou potřebujeme, je nějaký program, který z kamerky vysaje obraz. Já zvolil program motion. Ten nejenže vysaje obraz, ale také spustí webový server, kde plus mínus jednou za sekundu (podle nastavení) zobrazí snímek. Výsledek posuďte sami.
Jediné co jsem pro to musel v OpenWRT udělat, bylo:
opk install motion
A pak upravit konfigurační soubor /etc/motion.conf. Ten má hromadu voleb, já změnil tyto:
[...]
# Image width (pixels). Valid range: Camera dependent, default: 352
width 640
# Image height (pixels). Valid range: Camera dependent, default: 288
height 480
[...]
# Make automated snapshot every N seconds (default: 0 = disabled)
snapshot_interval 30
[...]
# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /tmp/cam/
[...]
# Maximum framerate for webcam streams (default: 1)
webcam_maxrate 3
# Restrict webcam connections to localhost only (default: on)
webcam_localhost off
Tohle ještě není všechno. Po spuštění "motion -n" se ukáže, že konfigurační soubor obsahuje několik voleb, které motion nezná. Pravděpodobně nejsou zakompilovaný. Jde o všechny ffmpeg* a sql* volby plus dvě další. Stačí je v konfiguračním souboru zakomentovat.
Další problém se kterým jsem se setkal, byl ten, že motion nechce startovat sám jako daemon. Pomohl jsem mu tedy následujícím skriptem.
#!/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")
Nejde ale o moc dobré řešení, protože vyžaduje balíček python-mini a ten si sežere 2 MB na flashce. Proto v příštích dnech zkusím vytvořit balíček aplikace daemon, která tohle dokáže také a s menšími požadavky na systémové prostředky.
Motion taky nemá vlastní init skript, ten může vypadat nějak takto:
#!/bin/sh /etc/rc.common
start() {
echo "Starting motion"
/opt/daemon.py
}
stop() {
echo "Stopping motion"
killall motion
}
Poté pomocí "cd /etc/rc.d;ln -s ../init.d/motion S60motion" řekneme systému, aby motion startoval při bootu.
To by mělo být všechno. Kamera je dostupná na portu 8081. Na portu 8080 je k dispozici lokální rozhraní, ale abyste se tam dostali ze svého stroje, musíte to povolit volbou control_localhost a nežádoucí uživatele filtrovat firewallem. Motion toho umí hodně, tak se nezapomeňte porozhlédnout po konfiguračním souboru.
| Jméno | |
|---|---|
| Web | |
| Komentář | |



