Autore Topic: Video sorveglianza con openwrt motion su VS  (Letto 10768 volte)

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Video sorveglianza con openwrt motion su VS
« il: Settembre 22, 2010, 10:09:51 pm »
Stasera ho realizzato un semplice impianto di videosorveglianza wireless del mio eremo con openwrt una Vodafone station, una webcam creative vista (per ora), un allarme sonoro (lo fa partire la solita centralina gpio collegata alla scheda rele), e apoggiandomi al "mio" asterisk, la possibilit? di gestirlo oltre che ricevere una chiamata in caso di allarme. Ho integrato il tutto nella centralina gpio gi? funzionante sulla vs, attraverso la quale, in locale o remoto, si pu? gestire, oltre agli altri comandi, anche l'allarme.
Prima di tutto bisogna installare la webcam usb, la vs dispone di porte usb e di diversi driver ma occhio a scegliere una webcam compatibile, mi sono sfinito a far "quasi" andare 'sta creative e ci sono ancora un bel po' di problemi che spero si risolvano all'allrivo di una "nuova" gi? ordinata.
Per gestirla ho usato "motion", anche lui presente negli opk.
Dopo aver caricato motion, configurare /etc/motion.conf  nella riga riportata (ha molte opzioni, per ora l'ho lascito "tranquillo")...

Codice: [Seleziona]

# Command to be executed when a motion frame is detected (default: none)
on_motion_detected /usr/sbin/allarme.sh

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
#target_dir /motion


... e creare la cartella /motion. (ho preferito mettere l? per ora le immagini ma sarebbe importante registrarle su un supporto esterno o ancora meglio in remoto con wput o scp)

bene, ora motion ? a posto...

Visto che non sono ancora riuscito a far andare la key come gateway gsm sulla vs per gli allarmi mi sono appoggiato ad un asterisk esterno. per fare questo invio un file che sar? processato da asterisk e far? la chiamata e ,chiamando un numero registrato su asterisk, si pu? gestire motion da remoto. Qui il problema nasce perch? per trasferire il file, usando scp, viene richiesta una password dal server e quindi bisogna creare le chiavi di autenticazione privata/pubblica per bypassare il problema. Openwrt utilizza dropbear e quindi utilizziamo i suoi tool per creare le chiavi. Spostiamoci in /etc/dropbear sulla vs...

Codice: [Seleziona]
dropbearkey -t rsa -f id_rsa

che dar? a video qualcosa del genere...

Codice: [Seleziona]
Will output 1024 bit rsa secret key to 'id_rsa'
Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwCagAvA7/EdxINoRzHoIYDUf4sE24VZZG4N+VHFVDKDrekvCtKDkdmUnbyP8bZqLtH6rSFyLeI1qAeU/cREQcwhsnOTwxesfe1dvZthUnbSfQ9nm7MVRZCUPZO4lAQZ+tW2vFHaoSPE3fSYA3B+ObkygKP8CxzvOsmN4AHklXB0YbRD root@openwrt
Fingerprint: .....................

copiamo la chiave pubblica (da ssh-rsa a root@openwrt compresi) in un file di testo nominandolo "authorized_keys" e andiamo a copiarlo sul server con asterisk in /root/.ssh/ usando uno strumento per trasferirlo come scp o ftp o...

nella cartella ora troveremo pure un file nominato "id_rsa" che rinomineremo in "dropbear_rsa_host_key".


diamo un...
Codice: [Seleziona]
dbclient -f -N -K 60 -L 3306:127.0.0.1:3306 -y -i /etc/dropbear/dropbear_rsa_host_key root@ipserver -p numero_eventuale_porta

ora scp potr? trasferire i file senza passare una pass.

Ho creato poi due file in (usr/sbin con permessi di esecuzione naturalmente, uno per getire motion (motion.sh) da shell e uno (allarme.sh)che manda il file all'asterisk sul server remoto quando motion lo invoca..

Codice: [Seleziona]
root@OpenWrt:/usr/sbin# cat motion.sh
#!/bin/sh
case $1 in
start)
/usr/bin/motion
;;
stop)
PID=`pidof motion`
kill $PID
killall allarme.sh
gpioctl dirin 12
;;
esac

il "gpioctl dirin 12" lo capirete dopo.

Codice: [Seleziona]
root@OpenWrt:/usr/sbin# cat allarme.sh
#!/bin/sh
cat << EOF > /motion/allarme.call
Channel: SIP/202
Callerid: ALLARME
MaxRetries: 2
RetryTime: 20
WaitTime: 20
Context: allarme
Extension: s
Priority: 1
EOF
scp -i /etc/dropbear/dropbear_rsa_host_key /motion/allarme.call root@ip_server:/var/spool/asterisk/outgoing
gpioctl dirout 12
sllep 180
gpioctl dirin 12
exit

Il primo script ? chiaro, "motion.sh start" attiva motion, e "motion.sh stop lo disattiva". "gpioctl dirin 12" spegne la "sirena" collegata alla centralina gpio sul gpio 12.

Il secondo script crea il file "/motion/allarme.call" con il contenuto tra i due EOF e poi lo trasferisce con scp utilizzando le chiavi create prima in "/var/spool/asterisk/outgoing" dove asterisk processa i file che vi trova. il "Channel: SIP/202" corrisponde ad un mio interno, naturalmente si pu? mettere un altro channel che corrisponde ad un vostro numero. "Callerid: ALLARME" ? quello che comparir? sul vostro telefono come mittente della chiamata.

Vediamo ora l'asterisk sul server, ho inserito in extension.conf queste parti...

Codice: [Seleziona]
[macro-allarme]
   exten => s,1,Answer()
   exten => s,n,Read(INPUT|agent-pass|0||3|10)
   exten => s,n,SayDigits(${INPUT})
   exten => s,n,AGI(allarme.sh,${INPUT})
   exten => s,n,Hangup()

exten => numerodachiamare,1,Macro(allarme,205)

[allarme]
   exten => s,1,Set(LANGUAGE()=IT)
   exten => s,n,Answer
   exten => s,n,Wait(2)
   exten => s,n,Playback(allarme)
   exten => s,n,Wait(1)
   exten => s,n,Playback(allarme)
   exten => s,n,Wait(1)
   exten => s,n,Playback(allarme)
   exten => s,n,Wait(1)
   exten => s,n,Playback(allarme)
   exten => s,n,Wait(1)
   exten => s,n,Playback(allarme)
   exten => s,n,Wait(1)
   exten => s,n,Hangup

dove [macro-allarme] chiede una pass (si pu? scegliere tra due codici uno per attivare motion sulla vs e uno per disabilitarlo ) che passa a "allarme.sh" sul server con asterisk (nella cartella /var/lib/asterisk/agi-bin del vostro asterisk). "exten => numerodachiamare,1,Macro(allarme,205)" ? il numero da chiamare sull'asterisk (dev'essere naturalmente registrato) per gestire motion sulla vs. Il file "allarme" chiamato da "Playback" ? quello che una volta creato sentirete alla chiamata.
il file "allarme.sh"...

Codice: [Seleziona]
#!/bin/sh
lynx http://ip_della_vs/cgi-bin/gesallarme.sh?pass=$1
exit

ok sull'asterisk ? tutto. Ritorniamo sulla vs e creiamo il file "/www/cgi-bin/gesallarme.sh" che deve contenere..
Codice: [Seleziona]
root@OpenWrt:/www/cgi-bin# cat gesallarme.sh
#!/usr/bin/webif-page

<?

. /usr/lib/webif/webif.sh
 
#header

file=/etc/centralina/allarme
righe=$(wc -l /etc/centralina/allarme | awk '{print $1}')
passon="$(echo "$riga" | awk '{split ($0, a, " ");print a[1]}')"
passoff="$(echo "$riga" | awk '{split ($0, a, " ");print a[2]}')"

#attiva allarme
if equal $FORM_pass "$passon";then
/usr/bin/motion
fi
#Disattiva allarme
if equal $FORM_pass "$passoff";then
PID=`pidof motion`
kill $PID
killall allarme.sh
gpioctl dirin 12
fi
exit
?>

che va a leggere il file "/etc/centralina/allarme" che contiene i codici per attivare e disattivare motion e se corrispondono a quelli passati dalla telefonata esegue.
Codice: [Seleziona]
root@OpenWrt:~# cat /etc/centralina/allarme
 1111  2222
root@OpenWrt:~#

il primo numero ? il codice di attivazione e il secondo quello di disattivazione.

Ora provo a integrare lo streaming sulla webif....

Consigli??
« Ultima modifica: Settembre 22, 2010, 10:15:32 pm da truthahn »

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Video sorveglianza con openwrt motion su VS
« Risposta #1 il: Settembre 22, 2010, 11:13:50 pm »
Funziona!! :-D
« Ultima modifica: Settembre 22, 2010, 11:24:52 pm da truthahn »

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Video sorveglianza con openwrt motion su VS
« Risposta #2 il: Settembre 23, 2010, 11:18:38 pm »
Non riesco a far partire motion dalla webif, cio? se inserisco in una pagina il comando "motion" s'impalla la pagina che vedete sopra e non compare lo steaming... vado a vedere con "ps" i processi e lo trovo attivo, poi vado a vedere lo steaming alla porta 8081 e la schermata del video ? grigia. Se lo faccio partire da shell invece funziona.
Anche a spegnerlo da webif ? un problema: con il tasto che vedete sopra che comanda un"killall motion" o un kill 'pidof motion' (con le virgolette giuste)  funziona una volta su 100. Che sia un conflitto del server web? :|

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Video sorveglianza con openwrt motion su VS
« Risposta #3 il: Settembre 28, 2010, 12:58:41 pm »
Risolto tutto!! :-D
Ragazzi funziona alla grande!!! :-D :-D :-D

Allora nella pagina comandi della webif...

Codice: [Seleziona]
if equal $FORM_motion1 "ATTIVA" ; then
/usr/sbin/gsmotion.sh start > /dev/null
sleep 5
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/comandi.sh\"',"1000")
</script>
EOF
exit
fi

if equal $FORM_motion1 "DISATTIVA" ; then
/etc/init.d/gesmotion stop > /dev/null
sleep 5
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/comandi.sh\"',"100")
</script>
EOF
exit
fi

/usr/sbin/gsmotion.sh
Codice: [Seleziona]
oot@OpenWrt:~# cat /usr/sbin/gsmotion.sh
#!/bin/sh
case $1 in
start)
/usr/bin/motion &
;;
stop)
PID=`pidof motion`
kill $PID
killall allarme.sh
;;
esac
root@OpenWrt:~#

e la pagina video.sh della webif...

Codice: [Seleziona]
root@OpenWrt:~# cat /www/cgi-bin/webif/centralina/video.sh
#!/usr/bin/webif-page
<?
. /usr/lib/webif/webif.sh
############################################################################
#
# Descrizione:
# Mostra lo streaming video
#
#
#               truthahn - Nabuk Family - vonkosta@gmail.com
#############################################################################
header "Info" "System" "<img src=\"/images/telecamera.jpg\">@TR<< Telecamera>>"

indirizzo="$(uci get network.lan.ipaddr)"
if equal $FORM_motion1 "DISATTIVA" ; then
elinks http://$indirizzo:8080/0/detection/pause > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/video.sh\"',"100")
</script>
EOF
fi
if equal $FORM_motion1 "ATTIVA" ; then
elinks http://$indirizzo:8080/0/detection/start > /dev/null
cat <<EOF
<script language="JavaScript" type="text/javascript">
setTimeout('top.location.href=\"/cgi-bin/webif/centralina/video.sh\"',"100")
</script>
EOF
exit
fi
pidmotion=`pidof motion`
if ! equal $pidmotion "";then
cat <<EOF
<form method="get" action="video.sh">
<center><img src="http://$indirizzo:8081" ><br>
EOF
status=$(elinks http://$indirizzo:8080/0/detection/status)
stato="$(echo $status | sed -n '/status/p'| awk '{ print $7 }')"
if  equal $stato "ACTIVE"; then
cat <<EOF
<center>
Il videocontrollo ? attivo.<p>
<input type="submit" name="motion1" value=DISATTIVA></form>
EOF
else
cat <<EOF
<center>
Il videocontrollo funziona solo in streaming.<br>
Per attivare la cattura delle immagini clicca sotto.<p>  
<input type="submit" name="motion1" value=ATTIVA></form>
EOF
fi
else
cat <<EOF
<center>
Nessuna videocamera collegata.<br>
Per attivare la videocamera vai alla pagina COMANDI.<p>
EOF
fi
footer
?>
root@OpenWrt:~#

La pagina comandi fa partire motion o lo arresta, la pagina video.sh lo mette in pausa (quindi funziona lo streaming ma non cattura le immagini) o lo attiva.
Le immagini le salvo su una key usb e le trasferisco automaticamente su un server remoto con wput..

nel file motion.conf..

Codice: [Seleziona]
# Command to be executed when a picture (.ppm|.jpg) is saved (default: none)
# To give the filename as an argument to a command append it with %f
on_picture_save wput ftp://username:pass@ip_server/motion/ %f

Sul server poi ho creato uno script, dopo aver installato "mencoder" che trasforma le immagini in avi e lo pone nella dir del server web per poterlo vedere. Questo pu? essere attivato con cron ogni giorno o in altro modo (naturalmente anche a mano).

Codice: [Seleziona]
#!/bin/bash
DATA=`date +%d-%m-%s`
FOLDER="/home/truthahn/motion"
cd ${FOLDER}
ls ${FOLDER}/*.jpg >tmplist_$DATA
mencoder "mf://${FOLDER}/*.jpg" -ovc lavc -o motion${DATA}.avi
cat $FOLDER/tmplist_$DATA|xargs rm --
rm tmplist_$DATA
mv motion${DATA}.avi /var/www/motion
chmod a+r /var/www/motion/motion${DATA}.avi


« Ultima modifica: Settembre 28, 2010, 11:29:09 pm da truthahn »

Avatar

  • Sr. Member
  • ****
  • Post: 798
    • Mostra profilo
    • my Netbuk server
    • E-mail
Re: Video sorveglianza con openwrt motion su VS
« Risposta #4 il: Settembre 28, 2010, 11:39:12 pm »
Bel lavoro Truthahn   :-)

Ho fatto un lavoro simile ma con serverino atom330
Installato Asterisk, Motion, e gestione dei relay via rs232
come gi? parlato in altro post  :wink:




questa ? la pagina che uso per comandare serranda e luci dal Nokia N95
poi ho sviluppato una pagina + complessa per le altre 2 webcam interne
e alcune altre cosucce :)

Per non impegnare troppa cpu qnando non serve ho fatto 2 script
start.sh e stop.sh che comandano motion e che partono all'inizio e alla fine della sessione.


« Ultima modifica: Settembre 28, 2010, 11:46:21 pm da Avatar »
Considerate la vostra semenza: fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Video sorveglianza con openwrt motion su VS
« Risposta #5 il: Settembre 28, 2010, 11:54:49 pm »
Grazie. Si mi ricordo il tuo post, anch'io ho per le mani una main itx ma devo ancora metterci le mani... ci lavorer? nel lungo inverno che ci attende. :-D
Intanto volevo integrare la video sorveglianza nel centro comunale e non pensavo che la vs si prestasse cos? bene :-)
Domande (se hai voglia di rispondere):
1. Asterisk lo usi per comandare anche la videosorveglianza? Hai usato qualcosa simile a quello che ho fatto io o altro?
2. trasferisci in remoto le immagini (per evitare un furto anche di quelle :|)? Se s? come?

Avatar

  • Sr. Member
  • ****
  • Post: 798
    • Mostra profilo
    • my Netbuk server
    • E-mail
Re: Video sorveglianza con openwrt motion su VS
« Risposta #6 il: Settembre 29, 2010, 12:23:27 am »
Citazione
Domande (se hai voglia di rispondere):

e quale sarebbe il problema :D

Citazione
1. Asterisk lo usi per comandare anche la videosorveglianza? Hai usato qualcosa simile a quello che ho fatto io o altro?
per giochicchiare sul telefono, guardo le immagini e se nessuno ? appoggiato alla serranda alzo/abbasso :)
Nel dialplan ho configurato anche un ivr per accendere/spegnere luci e aprire/chiudere serranda
Ho 2 numerazioni Eutelia, 1 la uso per lavoro, l'altra dedicata ai giochini :D
Arriva la chiamata
inserire password
1 per avere lo stato degli apparati ( ti elenca: serranda chiusa/aperta, luce scrivania accesa/spenta ecc)
2  per chiudere serranda fare 2  (controlla lo stato e cambia il messaggio a seconda se aperto/chiuso)
3  per accendere luce scrivania fare 3
4  ecc..

Citazione
2. trasferisci in remoto le immagini (per evitare un furto anche di quelle )? Se s? come?
Uso un dvr professionale per le telecamere di sorveglianza ;)
salvataggio su hd interno e email e upload su ftp in caso di motion detect nelle ore prestabilite.
Dvr Avtech che di sicuro ha un cuore linux :D
Considerate la vostra semenza: fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Video sorveglianza con openwrt motion su VS
« Risposta #7 il: Settembre 29, 2010, 11:19:29 pm »
L'eseguibile video.sh perch? possa funzionare anche da remoto e quindi con un ip di classe diversa da quella nattata e rediretta in entrata dal firewall dev'essere cambiato... soatituire la riga

indirizzo="$(uci get network.lan.ipaddr)"

con

indirizzo="$(echo $HTTP_REFERER | awk 'BEGIN { FS="/" } { print $3 }')"

cos? funziona sia in locale che da remoto prendendo l'indirizzo richiesto, dividendo i campi tra i "/" e andando a prendere il terzo...

ad esempio... http://79.145.166.23/cgi-bin/webif/centralina/video.sh (che corrisponde alla variabile della webif $HTTP_REFERER... simile al php  :wink:)
estrae 79.145.166.23.
sul firewall poi bisogna reindirizzare anche le porte 8080 e 8081 (che usa motion) sempre sull'ip della vs.


@kidy ... cambia la stessa variabile anche nel file swich.sh per lo stesso motivo... scusa ma ci son venuto su ora :roll:
« Ultima modifica: Settembre 29, 2010, 11:21:14 pm da truthahn »

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Video sorveglianza con openwrt motion su VS
« Risposta #8 il: Ottobre 01, 2010, 12:33:09 pm »
cambiato un po' anche lo script sul server remoto che crea il filmato dalle immagini trasferite da wput..

Codice: [Seleziona]
#!/bin/bash
numero=`ls /home/truthahn/motion | wc -l`
if [ "$numero" -gt "100" ]; then
DATA=`date +%d-%m-%Y-%H-%M`
FOLDER="/home/truthahn/motion"
cd ${FOLDER}
ls ${FOLDER}/*.jpg >tmplist_$DATA
#mencoder "mf://${FOLDER}/*.jpg" -ovc lavc -o motion${DATA}.avi
mencoder "mf://${FOLDER}/*.jpg" -mf type=jpg:fps=2 -o motion${DATA}.avi -ovc l$
cat $FOLDER/tmplist_$DATER|xargs rm --
rm tmplist_$DATA
mv motion${DATA}.avi /var/www/motion
chmod a+rw /var/www/motion/motion${DATA}.avi
fi
exit

Controlla la cartella e se ci sono pi? di 100 immagini mi crea il file avi, l'opzione di mencoder fps=2 lo crea usando 2 immagini per secondo, uguali a quelle impostate su motion, cos? il filmato ? leggibile e non corre come un missile. :-D

Lo script si avvia ogni mezz'ora da cron

Codice: [Seleziona]
*/30 * * * * /usr/local/bin/creamovie


kidy

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1668
  • Kidy
    • Mostra profilo
    • E-mail
Re: Video sorveglianza con openwrt motion su VS
« Risposta #9 il: Gennaio 05, 2011, 10:16:30 pm »
Noooo daii mi fate sentire scemo + scemo :cry:
truthahn io vengo a dormire a casa tua per un paio di anni per imparare giusto le basi!!!!!!!!! :-D :-D
Che spettacolo!!!!!!!
.................\\\//..................
                / _ _ \
              (|(.)(.)|)
------.OOOo--()--oOOO.-------
Twitter: @kidysy

truthahn

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1546
    • Mostra profilo
Re: Video sorveglianza con openwrt motion su VS
« Risposta #10 il: Gennaio 05, 2011, 10:33:40 pm »
b?, un letto l'ho sempre per gli ospiti... certo che due anni :?  :-D
Niente di speciale Kidy, solo che da 10 anni non ho pi? la tv.

kidy

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1668
  • Kidy
    • Mostra profilo
    • E-mail
Re: Video sorveglianza con openwrt motion su VS
« Risposta #11 il: Gennaio 05, 2011, 10:59:57 pm »
Ecco lo vedi!! Io invece dovrei eliminare il pc per concentrarmi meglio!!!! :-D :-D :-D :-D

.................\\\//..................
                / _ _ \
              (|(.)(.)|)
------.OOOo--()--oOOO.-------
Twitter: @kidysy

marco1979

  • Novellino
  • *
  • Post: 34
    • Mostra profilo
    • E-mail
Re: Video sorveglianza con openwrt motion su VS
« Risposta #12 il: Gennaio 23, 2011, 11:31:33 pm »
1 per avere lo stato degli apparati ( ti elenca: serranda chiusa/aperta, luce scrivania accesa/spenta ecc)

@Avatar
 ...puoi spiegarmi come hai fatto a far leggere ad asterisk lo stato degli apparati?

Avatar

  • Sr. Member
  • ****
  • Post: 798
    • Mostra profilo
    • my Netbuk server
    • E-mail
Re: Video sorveglianza con openwrt motion su VS
« Risposta #13 il: Gennaio 24, 2011, 01:29:26 pm »
1 per avere lo stato degli apparati ( ti elenca: serranda chiusa/aperta, luce scrivania accesa/spenta ecc)

@Avatar
 ...puoi spiegarmi come hai fatto a far leggere ad asterisk lo stato degli apparati?

tramite script legge lo stato del PLC su porta seriale e setto le variabili.
Considerate la vostra semenza: fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

marco1979

  • Novellino
  • *
  • Post: 34
    • Mostra profilo
    • E-mail
Re: Video sorveglianza con openwrt motion su VS
« Risposta #14 il: Gennaio 25, 2011, 09:19:10 pm »
Ok grazie, ma ? proprio questo che mi sfugge,... Puoi riportarmi un esempio dello script che fa questo lavoro?...