Jak si poradí RouterStation s webkamerou

Před 11 měsíci

webkamera-na-streseEmbedded 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.

pohled-z-webkamery

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
Email
Web
Komentář

TOPlist