Pokud chcete svého domácího mazlíčka odnaučit, aby chodil na pohovku, křeslo nebo podobně, můžete zkusit využít následující věc. Jedná se o neinvazivní opatření, při kterém svému pejskovi, nebo kočce nezkřivíte ani chlup a přitom je tato metoda účinná - navíc nemusíte přestavovat nábytek.
Princip je následující - na jednu stranu pohovky, nebo křesla umístíte wifi AP a na druhou stranu anténu wifi klienta (nebo celý notebook). Pokud mazlíček vstoupí na pohovku, mezi AP a klienta, tak se sníží zisk wifi klienta, který na základě toho přehraje předem zaznamenaný (trýznivý) zvuk. Ten mazlíčka z pohovky vyžene. Po několika pokusech to zvíře vzdá.
Měření zisku klienta je jednoduchým způsobem matematicky zpracováno, aby byl eliminován šum. Měření probíhá ve dvou fázích:
K realizaci budete potřebovat následující:
Několik různých zvuků budete potřebovat k odehnání mazlíčka z pohovky - proto by se mělo jednat o zvuky, na které výrazně reaguje. Osobně jsem zvolil kombinaci několika zvuků: cinkání klíčů, zvuk otevírání vstupních dveří, zvonění domovního zvonku, osobní domlouvání. To se setkalo s úspěchem a psa z pohovky vyžene. Zvuky nahrajte například pomocí mobilního telefonu a uložte do jednoho adresáře na klientském PC.
Wifi router restartujte a vytvořte na něm nový přístupový bod s WEP zabezpečením (tento druh šifrování jsem použil proto, že se ze shellu neumím připojit na WPA - pokud umíte vytvořte bezpečnější variantu). Zapište si heslo a umístěte router na jednu stranu pohovky. Anténu umístěte tak, aby pokud možno vyzařovala směrově ke klientovi. Mě postačilo pouze 5dB anténu položit do horizontální polohy.
Na PC klienta si vytvořte nový BASH skript, který je uveden níže a změňte hodnoty v části nastavení, na jeho začátku. Jedná se o základní podobu skriptu, která zajišťuje hlavní funkčnost. Rozšířené funkce jsou uvedeny v další kapitole. Konkrétní funkce jednotlivých částí jsou popsány v poznámkách. Kvůli zastavení služby Network Managera a dalším částem, je potřeba skript spouštět jako ROOT. Skript je otestován na Linuxové distribuci Fedora 20.
#!/bin/bash # NASTAVENÍ - změňte na vlastní hodnoty WIFI_ZARIZENI="wlp0s29f7u3" # Ozančení použitého wifi zařízení. SSID="wifi-scan" # SSID wifi AP. HESLO_WIFI="heslo" # Heslo na wifi. UZIVATEL="franta" # Jméno neprivilegovaného uživatele (kvůli pulse audio). ZVUKY_ADR="/home/franta/zvuky/" # Absolutní cesta do adresáře s trýznivými zvuky. # Definice dalších proměnných M_START=300 # Počet jednotlivých měření, ze kterých se počítá medián hranice. M=17 # počet jednotlivých měření při kontrole. ROZDIL=5 # Hodnota, která se přidává k naměřené hranici mediánu, a která musí být překročena. M_NASTAVENE=$M_START clear systemctl stop NetworkManager.service && echo "NM stop OK" # Vypne Network Managera sleep 1 rfkill unblock all && echo "rfkill OK" # Zapne wifi sleep 1 ip link set $WIFI_ZARIZENI up && echo "Link UP" # Zapne wifi sleep 1 iw $WIFI_ZARIZENI connect $SSID keys 0:$HESLO_WIFI && echo "Připojení k wifi OK" # Připojí k wifi AP sleep 1 echo "Zesiluju na max." su $UZIVATEL -c "pactl set-sink-volume 0 -- 90000" # Zesílí na max zvuk echo "Začínám počítat hranici - "$M_START" cyklů." while true; do # Hlavní cyklus, kde jeden průběh se rovná jedné hodnotě mediánu DB_P="" for c in $(seq $M_NASTAVENE); do # Cyklus, který se stará o nasbírání jednotlivých měření, ze kterých se později počítá medián. DATA_POLE=( $(cat /proc/net/wireless | grep "$WIFI_ZARIZENI") ) DB=${DATA_POLE[3]} DB=${DB:1:2} DB_P="$DB_P$DB\n" sleep 0.05 # Hodnota je nastavena na nejnižší možnou, kdy se ještě síla naměřeného zisku mění. done # Výpočet mediánu z naměřených a sebraných hodnot z předešlého for cyklu. # K výpočtu se využívá program awk, do kterého se pošlou hodnoty z proměnné BD_P, oddělené enterem. # V prvním průchodu se vypočte medián hranice (dlouhé měření prázdné pohovky) a v dalších medián kontroly vstupu. DP="$(echo -e -n $DB_P | sort -n | awk ' { a[g++]=$1; } END { print a[int(g/2)]; }')" if [ "$M_NASTAVENE" == "$M_START" ]; then # Pokud se jedná o první průchod.. echo "Změřený medián je: "$DP HRANICE=$((DP+ROZDIL)) # K naměřenému mediánu z dlouhého měření se přičte další hodnota. Součet musí být překročen, aby.. echo "Medián + rozdíl je: "$HRANICE M_NASTAVENE=$M echo $(date +"%d.%m.%y %H:%M:%S")" Začínám skenovat." elif [ $DP -ge $HRANICE ]; then # Pokud je naměřená HRANICE překročena, tak se provede následující. echo $(date +"%d.%m.%y %H:%M:%S")" Překročeno! "$DP # Přehrání zvuku s právy neprivilegovaného uživatele z adresáře (náhodně jeden zvuk z adresáře). su $UZIVATEL -c "mplayer $ZVUKY_ADR'$(ls -1 $ZVUKY_ADR | shuf -n1)' &> /dev/null" fi done exit 0
Nyní máme vše připravené - umístíme tedy anténu klienta na druhou stranu pohovky a zatížíme proti posunutí (v takovém případě hrozí neplánované spuštění). Spusťte skript a po vypsání aktuálního času a hlášky „Začínám skenovat“ můžete vyzkoušet, zda vše funguje. Položte ruku na pohovku, mezi antény - měl by se ozvat vámi nahraný zvuk. Na obrazovce se také vypíše hláška o překročení limitu.
Pokud vše funguje správně, tak by to mělo vypadat jako na následujícím videu:
Z vlastní zkušenosti vím, že stačí pomocí toho nástroje přistihnout psa na pohovce 2x a už si na pohovku netroufne. Na stejném principu se při správném vyladění dá postavit univerzální závora. Jde o to, že signál je dobře pohlcován živou tkání.
Když je zajištěna hlavní funkce „odchytu“, můžeme si skript rozšířit o další zajímavé věci. Pro své potřeby jsem zařadil následující funkce:
Rozšířený okomentovaný skript ke stažení naleznete níže. Předpokládá, že máte zprovozněný web server na klientském PC a zajištěnou konektivitu přes veřejnou IP (nastavený forwarding na routeru atp.). Opět platí, že si musíte přepsat proměnné v části nastavení. Log si přesměrujte pomocí tee do souboru přístupného web serverem.
#!/bin/bash # Nastavení - změňte na vlastní hodnoty WIFI_ZARIZENI="wlp0s29f7u3" # Ozančení použitého wifi zařízení. SSID="wifi-scan" # SSID wifi AP. HESLO_WIFI="heslo" # Heslo na wifi. UZIVATEL="franta" # Jméno neprivilegovaného uživatele (kvůli pulse audio). ZVUKY_ADR="/home/franta/zvuky/" # Absolutní cesta do adresáře s trýznivými zvuky. FOTKY_ADR="/var/www/html/fotky/" # Absolutní cesta k adresáři, kam se budou ukládat fotky. Adresář musí existovat. POZOR - všechny jpg soubory budou zde smazány. # Definice dalších proměnných M_START=300 # Počet jednotlivých měření, ze kterých se počítá medián hranice. M=17 # počet jednotlivých měření při kontrole. ROZDIL=5 # Hodnota, která se přidává k naměřené hranici mediánu, a která musí být překročena. POJISTKA=30 # Pojistka proti šílenství. Maximální počet poplachů - pojistka proti posunu. Pokud je překročeno, vypne se zvuk. POPLACHU=0 M_NASTAVENE=$M_START # Definice funkcí function funkce_nahravani () { # Každou půlhodinu udělá fotku nezávisle na následujícím. while true; do fswebcam -d V4L2:/dev/video0 -r 640x480 -i 0 -p YUYV --jpeg 95 -S 3 -q "$FOTKY_ADR"$(date +"%y%m%d_%H%M%S").jpg &> /dev/null sleep 30m done } clear cd "$FOTKY_ADR" systemctl start httpd && echo "Start HTTP serveru OK" # Zapne appache server sleep 1 systemctl stop NetworkManager.service && echo "NM stop OK" # Vypne Network Managera sleep 1 rfkill unblock all && echo "rfkill OK" # Zapne wifi sleep 1 ip link set $WIFI_ZARIZENI up && echo "Link UP" # Zapne wifi sleep 1 iw $WIFI_ZARIZENI connect $SSID keys 0:$HESLO_WIFI && echo "Připojení k wifi OK" # Připojí k wifi AP sleep 1 echo "Zesiluju na max." su $UZIVATEL -c "pactl set-sink-volume 0 -- 90000" # Zesílí na max zvuk rm -rf "$FOTKY_ADR"*.jpg && echo "Mažu staré fotky." # Smaže všechny staré fotky. echo "Začínám počítat hranici - "$M_START" cyklů." while true; do # Hlavní cyklus, kde jeden průběh se rovná jedné hodnotě mediánu. DB_P="" for c in $(seq $M_NASTAVENE); do # Cyklus, který se stará o nasbírání jednotlivých měření, ze kterých se později počítá medián. DATA_POLE=( $(cat /proc/net/wireless | grep "$WIFI_ZARIZENI") ) DB=${DATA_POLE[3]} DB=${DB:1:2} DB_P="$DB_P$DB\n" #DC=$((DB-50)) # Odstraňte poznámky a skript bude vykreslovat změřené hodnoty. #for i in $(seq $DC); do # echo -n '▬'; #done #echo " -"$DB" "$(date +%S) sleep 0.05 # Hodnota je nastavena na nejnižší možnou, kdy se ještě síla naměřeného zisku mění. done # Výpočet mediánu z naměřených a sebraných hodnot z předešlého for cyklu. # K výpočtu se využívá program awk, do kterého se pošlou hodnoty z proměnné BD_P, oddělené enterem. # V prvním průchodu se vypočte medián hranice (dlouhé měření prázdné pohovky) a v dalších medián kontroly vstupu. DP="$(echo -e -n $DB_P | sort -n | awk ' { a[g++]=$1; } END { print a[int(g/2)]; }')" if [ "$M_NASTAVENE" == "$M_START" ]; then # Pokud se jedná o první průchod.. echo "Změřený medián je: "$DP HRANICE=$((DP+ROZDIL)) echo "Medián + rozdíl je: "$HRANICE M_NASTAVENE=$M echo $(date +"%d.%m.%y %H:%M:%S")" Začínám skenovat a nahrávat." funkce_nahravani & # Průběžně se dělají znímky pomocí připravené funkce. elif [ $DP -ge $HRANICE ]; then # Pokud je naměřená HRANICE překročena, tak se provede následující. POPLACHU=$((POPLACHU+1)) wait %2 &> /dev/null fswebcam -d V4L2:/dev/video0 -r 640x480 -i 0 -p YUYV --jpeg 95 -S 2 -q $FOTKY_ADR$POPLACHU.jpg & echo $(date +"%d.%m.%y %H:%M:%S")" Překročeno! "$DP" po: "$POPLACHU # Přehrání zvuku s právy neprivilegovaného uživatele z adresáře (náhodně jeden zvuk z adresáře). Ale pouze pokud počet poplachu nepřekročil pojistku. [ $POPLACHU -lt $POJISTKA ] && su $UZIVATEL -c "mplayer $ZVUKY_ADR'$(ls -1 $ZVUKY_ADR | shuf -n1)' &> /dev/null" fi done exit 0