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")...
# 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...
dropbearkey -t rsa -f id_rsa
che dar? a video qualcosa del genere...
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...
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..
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.
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...
[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"...
#!/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..
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.
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??