Aggancia questa barra allo schermo |  Disattiva gli effetti grafici


Sistema di sorveglianza


 

Un semplice sistema di video sorveglianza

Ecco che la bash ci viene in aiuto anche per realizzare un semplice sistema di video sorveglianza molto economico.

script

Questo script scatta una foto dalla webcam impostata nella variabile DEV con mplayer, ne fa una copia con la data corrente come nome del file per conservare una copia di tutte le foto scattate e per sapere a prima vista a quando risalgono. Dopodiché carica entrambe le copie della foto sul server ftp impostato nella variabile HOST. Attenzione alla variabile USRPWD in cui bisogna mettere nome utente e password così come nell'esempio, nella stessa variabile separati da uno spazio.

La copia col nome originale viene sovrascritta ogni 7 secondi e verrà visualizzata nella pagina web riportata più avanti.

Affinché il caricamento sul server vada a buon fine è necessario creare una cartella "foto" sul server, nel caso tale nome sia già utilizzato per altri contenuti basta sostituire "foto" alla riga 21 dello script e alla riga 16 della pagina html (nell'indirizzo dell'immagine) col nome desiderato.

cam.sh

#!/bin/bash
# (C) 2012-2014, Andrea Peluso.

DEV="/dev/video0"
HOST="ftp.nomehost.it"
USRPWD="utente password"

cam_start() {
  mkdir -p foto
  cd foto
  if [ -x /usr/bin/mplayer ]; then
    if [ -r $DEV ]; then
      while [ true ]
      do
        NOMEFILE=$(date +%Y%m%d-%H.%M.%S)
        mplayer tv:// -tv driver=v4l2:device=$DEV:width=640:height=480:fps=1:outfmt=rgb24 -frames 1 -vo jpeg
        cp 00000001.jpg $NOMEFILE.jpeg
        ftp -inv $HOST <<EOF
passive on
user $USRPWD
cd foto
put 00000001.jpg
put $NOMEFILE.jpeg
bye
EOF
        sleep 7
      done
    else
      echo -e "\E[0;31m$DEV non trovato.\E[0;0m"
    fi
  else
    echo -e "\E[0;31mmplayer non trovato.\E[0;0m"
  fi
}

cam_stop() {
  killall cam.sh
}

case "$1" in
'start')
  cam_start
  ;;
'stop')
  cam_stop
  ;;
*)
  echo $"utilizzo: $0 {start|stop}"
esac
Scarica [.sh]    ...scaricato 46 volte, dimensione: 1 KB

È sufficiente eseguirlo in questo modo:

./cam.sh start

o posizionarlo tra gli script di avvio della distribuzione.

Infine questo è un esempio di una semplice pagina web che visualizza l'ultima foto:

cam.html

<!DOCTYPE html>
<html>
  <head>
    <title>Cam</title>
    <meta charset="UTF-8">
    <style>body{text-align:center}</style>
  </head>
  <body>
    <h1>Cam</h1>
    <img src="http://nomehost.it/foto/00000001.jpg" alt="cam" title="cam" id="current">
    <script>
setInterval((function(img) {
	if (img.src.indexOf("?") < 0) img.src += "?";
	return function() {
		img.src = img.src.substring(0, img.src.indexOf("?") + 1) + Date.now();
	}
})(document.getElementById("current")), 10000)
    </script>
  </body>
</html>

In questo esempio la funzione javascript aggiunge la data corrente come indice all'indirizzo dell'immagine per poterla ricaricare ogni 10 secondi senza avere problemi di cache.

Nel caso volessimo visualizzare la data della foto, è necessario ricorrere a php creando un file come il seguente:

data.php

<?php echo date("d/m/Y H:i:s", filemtime("foto/00000001.jpg")); ?>

La pagina html vista prima deve anch'essa diventare un file php per poter includere il file appena creato che stampa la data:

cam.php

<!DOCTYPE html>
<html>
  <head>
    <title>Cam</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style>body{text-align:center}</style>
  </head>
  <body>
    <h1>Cam</h1>
    <img src="foto/00000001.jpg" alt="cam" title="cam" id="current">
    <div id="data"><?php include("data.php"); ?></div>
    <script>
// (C) 2010-2014, Andrea Peluso.
var richiesta = null;
function CreaXmlHttpReq(handler) {
	var xmlhttp = null;
	xmlhttp = new XMLHttpRequest();
	xmlhttp.onreadystatechange = handler;
	return xmlhttp;
}
function handler() {
	if (richiesta.readyState == 4 && richiesta.status == 200) {
		e = document.getElementById("data");
		e.innerHTML = richiesta.responseText;
	}
}
setInterval((function(img) {
		if (img.src.indexOf("?") < 0) {
			img.src += "?";
		}
		return function() {
			img.src = img.src.substring(0, img.src.indexOf("?") + 1) + Date.now();
			richiesta = CreaXmlHttpReq(handler);
			richiesta.open("GET", "data.php");
			richiesta.send(null);
		}
	})
	(document.getElementById("current")), 10000);
    </script>
  </body>
</html>

Questa volta la pagina deve stare per forza sullo stesso server che ospita le foto, per questo motivo era inutile specificare l'url completo dell'immagine.

Scritto da: Andrea Peluso (sya54M), .

Commenti

Nessun commento.

I campi contrassegnati con * sono obbligatori.

Condividi sui tuoi social preferiti!

Facebook Linkedin Twitter Google+
.