IP camera
Is er iemand die ervaring heeft met IP camera's; Ik heb 2 nas'en die elk 2 camera's ondersteunen.
QNAP TS-415 en synology 415play.
hieraan zou ik de 2 camera's willen laten opnemen. De connectie zal via Wi-Fi moeten op de Telenet router en de resolutie HD.
Vragen:
Waar moet ik op letten.
Wat is een goed merk/model
...
Jan
Kijk eens bij een elektronica winkel of een specialzaak zou ik zeggen ;)
Iedereen heeft zo zijn hobbies. Toch ?
Gewijzigd op 14/06/2015 10:54:14 door Paco de Wulp
Hoi, ik heb een Synology nas met een IP camera alleen ik heb niet gekeken welke merken mijn nas ondersteunde waardoor het moeilijker was om het werkend te krijgen wat uiteindelijke wel gelukt is. Dus ik zou een merk nemen die jouw nas ondersteunt.
Maar nog steeds neem ik op via mijn eerste oplossing: mbt PHP op de webserver.
Er draait een continue cronjob. Deze start om 0:00 en eindigt zodra de datum verandert. (dus na 24 uur).
Gedurende de loop van het script start hij een commando waarmee middels wget de stream van de camera wordt uitgelezen.
Om de grootte van de file te beperken, en om gericht een opname te kunnen terugvinden, wordt na 1 kwartier de opname gestopt en een nieuwe gestart. (kan uiteraard ook met een andere periode)
In principe zou de cronjob ook eenmalig kunnen starten en niet meer afbreken.
Maar mocht om een of andere reden het proces crashen of de server restarten oid. dan zouden mijn opnamen permanent stoppen.
Nu heb ik in elk geval de zekerheid dat uiterlijk om 0:00 opnieuw gestart wordt met opnemen.
aanroep middels
/usr/bin/php /path/record.php cam1
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
$dateStart = new DateTime();
$dateEnd = (new DateTime())->modify('+1 day');
$dateNow = new DateTime();
$cam = $argv[1];
switch($cam)
{
// config van de camera's:
case 'cam1':
$camnr = 1;
$port = 999;
$user = '....';
$password = '*****';
$server = 'some.url.nl';
$pathserver = 'videostream.cgi?resolution=64';
$saveto_ext = 'mjpg';
break;
}
$path = '/data/secucam/';
$file = 'cam%d-%s.'. $saveto_ext;
$command_mask = "/usr/bin/wget -b -o /dev/null --user=%s --password=%s -O %s 'http://%s:%d/%s'";
while($dateNow < $dateEnd)
{
set_time_limit(100);
$saveto = $path . sprintf($file, $camnr, date('Y-m-d-Hi'));
$command = ('/usr/bin/nohup ' . sprintf($command_mask, $user, $password, $saveto, $server, $port, $pathserver) . ' & echo $!');
echo $command .'<br>';
$response = shell_exec($command);
$response = str_replace(PHP_EOL, ' ', $response);
// echo '#' . $response . '#';
$pid = preg_replace('#^.*pid (\d+)\..*#', '$1', $response);
// echo '@'.$pid .'@';
sleep(15 * 60);
$killcommand = '/bin/kill ' . (int) $pid;
echo $killcommand . PHP_EOL;
shell_exec($killcommand);
$dateNow = new DateTime();
}
?>
$dateStart = new DateTime();
$dateEnd = (new DateTime())->modify('+1 day');
$dateNow = new DateTime();
$cam = $argv[1];
switch($cam)
{
// config van de camera's:
case 'cam1':
$camnr = 1;
$port = 999;
$user = '....';
$password = '*****';
$server = 'some.url.nl';
$pathserver = 'videostream.cgi?resolution=64';
$saveto_ext = 'mjpg';
break;
}
$path = '/data/secucam/';
$file = 'cam%d-%s.'. $saveto_ext;
$command_mask = "/usr/bin/wget -b -o /dev/null --user=%s --password=%s -O %s 'http://%s:%d/%s'";
while($dateNow < $dateEnd)
{
set_time_limit(100);
$saveto = $path . sprintf($file, $camnr, date('Y-m-d-Hi'));
$command = ('/usr/bin/nohup ' . sprintf($command_mask, $user, $password, $saveto, $server, $port, $pathserver) . ' & echo $!');
echo $command .'<br>';
$response = shell_exec($command);
$response = str_replace(PHP_EOL, ' ', $response);
// echo '#' . $response . '#';
$pid = preg_replace('#^.*pid (\d+)\..*#', '$1', $response);
// echo '@'.$pid .'@';
sleep(15 * 60);
$killcommand = '/bin/kill ' . (int) $pid;
echo $killcommand . PHP_EOL;
shell_exec($killcommand);
$dateNow = new DateTime();
}
?>
Er zitten nog wat overbodige zaken in:
$dateStart lijkt overbodig,
set_time_limit() is alleen zinnig in combinatie met apache, niet als je een script via php aanroept
en de echo heeft ook geen zin.
Maar mogelijk krijg je hier een idee van de werking van.
het commando videostream.cgi blijkt bij veel camera's te werken. Kennelijk hebben veel merken toch min of meer dezelfde firmware, danwel bestaat er toch een soort standaard in.
Varianten:
'videostream.cgi?rate=0&user=admin&pwd='
'cgi/mjpg/mjpeg.cgi'
'videostream.cgi'
Als je via firebug meekijkt wat je webinterface naar de camera stuurt, kun je zien welke commando's allemaal gestuurd kunnen worden.
Een ander script zorgt voor de draai van de camera elke x tijd. Daar moest ik wel uitzoeken wat precies de commando regel voor de camera was.
Als de webserver zich buiten je netwerk bevindt (datacenter) dan is het nodig dat je camera's van buiten bereikbaar zijn.
Je moet de betreffende poort dus via NAT forwarden naar de juiste poort intern en het juiste ip-adres intern
Ivo P op 15/06/2015 10:11:19:
Er draait een continue cronjob. Deze start om 0:00 en eindigt zodra de datum verandert. (dus na 24 uur).
[...]
In principe zou de cronjob ook eenmalig kunnen starten en niet meer afbreken.
Maar mocht om een of andere reden het proces crashen of de server restarten oid. dan zouden mijn opnamen permanent stoppen.
[...]
In principe zou de cronjob ook eenmalig kunnen starten en niet meer afbreken.
Maar mocht om een of andere reden het proces crashen of de server restarten oid. dan zouden mijn opnamen permanent stoppen.
Voor dit soort scripts kun je beter inittab gebruiken (of systemd in recente CentOS/Fedora-versies). Dat heeft als voordeel dat zodra een proces om wat voor reden dan ook stopt, het meteen weer wordt gestart.
Alternatief (maar minder elegant) is om via cron je script elk kwartier of zo te starten en in je code te checken of er al een proces loopt.
Overigens: via crontab kun je ook jobs starten bij een reboot door de 5 datum/tijdvelden die aan het begin van de regel staan te vervangen door de alias @reboot.