Как запускать программное обеспечение веб-камеры только когда меня нет дома (телефон не находится в локальной сети)?
В настоящее время у меня есть пользовательский cron, который запускает Motion по таймеру, когда я обычно ухожу на работу, а затем убиваю его, когда я обычно возвращаюсь домой, чтобы я мог наблюдать за своим котом / грабителями / и т. Д.
0 9 * * * killall motion ; motion
30 18 * * * killall motion
Используемый файл конфигурации ~/.motion/motion.conf
и имеет daemon on
,
Но было бы лучше, если бы он мог определить, когда я на самом деле дома, отключить веб-камеру в это время и включить ее в другое время. Я думал, что мое присутствие может быть обнаружено моим телефоном Android, присоединяющимся к локальной сети. Так что-то вроде
- Сценарий, который проверяет каждые несколько минут, находится ли имя моего телефона или MAC-адрес в данный момент в локальной сети.
- Сценарий Tasker на моем телефоне, который каким-либо образом связывается с домашним компьютером (простой веб-сервер?), Когда он присоединяется к определенному SSID
- Сочетание вышеперечисленного
- ...
Любые лучшие идеи или советы о том, как реализовать один из них? Tasker прост в использовании, но стоит 6 долларов, поэтому решение, которое от него не зависит, будет полезно для более широкой аудитории.
Моя первая попытка решения arp-scan работает не очень хорошо. Это создает несколько экземпляров motion
и не определяет телефон надежно, вызывая случайное включение и выключение камеры. Так что, может быть, это больше похоже на "проверяйте каждую минуту, если телефон присутствует. Включайте камеру, только если телефон не был замечен в течение 15 минут".
Хорошо, я написал скрипт на python для выполнения arp-сканирования раз в минуту, и он отлично определяет телефон:
2012-11-27 18:29:10.551552 No
2012-11-27 18:30:22.295997 No
2012-11-27 18:31:34.077431 No
2012-11-27 18:32:45.804675 No
2012-11-27 18:33:57.545211 No
2012-11-27 18:35:09.261680 No
2012-11-27 18:36:20.974378 Yes
2012-11-27 18:37:21.901076 Yes
2012-11-27 18:38:22.417423 Yes
2012-11-27 18:39:22.836101 Yes
2012-11-27 18:40:23.463507 Yes
2012-11-27 18:41:23.876693 Yes
Так что что-то не так с cron или с тем, как я начинаю движение, или с чем-то еще
Я пытался бежать /etc/init.d/motion start
вместо того, чтобы запускать его и убивать как пользователя, но этот метод не работает:
* Not starting motion daemon, disabled via /etc/default/motion
Так я отредактировал /etc/default/motion
сказать start_motion_daemon=yes
и попробовал еще раз:
~> /etc/init.d/motion start
mkdir: cannot create directory `/var/run/motion': Permission denied
Я даже не знаю, что это значит.
4 ответа
Ответ zmode полезен, но у меня не сработал. После долгих чтений я придумал это решение:
#!/bin/sh
if arp-scan -I eth0 -r 10 android | grep -q '12:34:56:78:90:ab'
then
echo "Phone present, killing motion"
killall motion
echo "Done killing motion"
else
echo "Phone absent, starting motion"
if ! ps -A | grep -q motion
then
echo "Motion is not running - starting it"
su -c 'motion' - username
echo "Motion started"
else
echo "Motion already running"
fi
echo "Done starting motion"
fi
exit
(MAC-адрес, имя хоста и имя пользователя необходимо заменить.) Он проверяет, находится ли телефон в сети, используя имя хоста телефона. android
чтобы избежать сканирования несвязанных адресов. Он проверяет, запущено ли движение, поэтому не запускает несколько экземпляров и не убивает его несколько раз во время работы.
Тогда беги sudo crontab -e
отредактировать cron пользователя root и добавить строку вроде этой:
*/5 * * * * /home/username/phone_webcam/phone_webcam.sh >> /var/log/cron.log 2>&1
Это будет запускать скрипт каждые 5 минут, регистрируя выходные данные, чтобы вы могли отладить его. Запустите команду tail -f /var/log/cron.log
чтобы убедиться, что это работает. Убедившись, что это работает, удалите строку регистрации из crontab:
*/5 * * * * /home/username/phone_webcam/phone_webcam.sh
Running a script on your computer is much easier and definitely more clean than setting up a webserver that will wait for a phone to talk to it. Therefore I'm going to go with your first idea.
Предположения:
- You have root access.
/etc/init.d/motion
is used to start and stopmotion
,systemctl start|stop motion.service
заsystemd
- You connect to the same network as your phone using
eth0
, - Your cron implementation uses the
crontab
команда.
Getting the MAC address:
Получить arp-scan
и беги arp-scan -I eth0 -l -r 10
как корень. (I found -r 10
to be important for always detecting my Android phone)
This will return a list of devices in your network. The third column should make it easy to identify your phone. Let's say we get 01:01:01:01:01:01
,
Script it:
Бежать arp-scan -I eth0 -l -r 10 | grep -q '01:01:01:01:01:01'
как корень. Это вернется 0
only if the phone is connected.
Бежать crontab -e
as root and append this line to check if your phone is connected to the network every minute:
* * * * * arp-scan -I eth0 -l -r 10 | grep -q '01:01:01:01:01:01' && /etc/init.d/motion stop || /etc/init.d/motion start
Save the file and quit the editor.
Keep in mind that we do not need to check if motion
is running ourselves. The service script does this internally.
Взяв вышеуказанный ответ за основу, вы можете настроить его так, чтобы он работал немного лучше.
#!/bin/sh
if arp-scan -I wlan0 -r 10 android-11111111111111111111 | grep -qi '11:11:11:11:11:11'
then
echo "Phone present, killing motion"
killall motion
echo "Done killing motion"
else
echo "Phone absent, starting motion"
if ! ps -A | grep -q motion
then
echo "Motion is not running - starting it"
su -c 'motion'
echo "Motion started"
else
echo "Motion already running"
fi
echo "Done starting motion"
fi
exit
Как правило, для Wi-Fi интерфейс известен как wlan0. Название устройства Android, как правило, Android - с последующим серийным номером. Добавив -i к команде grep, вы можете запустить поиск без учета регистра (чтобы выяснить это, потребовалось некоторое время). На моей машине для запуска движения правильно требуется root-доступ. Это можно сделать, удалив имя пользователя из команды su.
С этими изменениями и следуя всем вышеприведенным ответам, вы можете получить запуск Motion без проблем, как только вы покинете (со своим телефоном) свой дом. Безупречный!
У меня есть скрипт bash, который запускается каждые 4 минуты. Это работает довольно хорошо. Вот код с некоторыми пояснениями.
#!/bin/bash
############################################################################
## looking for iPhone, 1 if iPhone logged in, else 0
## IPhoneIP.txt contains local IP-adress (also bash-based)
IPhoneIP=$(cat /home/pi/motion/IPhoneIP.txt)
NMAP=$(nmap -sn -oG - ${IPhoneIP})
iPhoneActive=$(echo $NMAP | grep -c "Status: Up")
############################################################################
## alternatively finding iPhone with Bluetooth
if [ "$iPhoneActive" -eq 0 ]; then
#save former value ofiPhoneActive if zero
iPhoneActive=$(cat /home/pi/motion/IPhoneBluetoothCheck.txt)
fi
############################################################################
##if network down do nothing
NetworkDown=$(echo $NMAP | grep -c "Unable to determine any DNS servers")
############################################################################
##now checking whether motion is activ
MotionDetectionActive=$(wget -O - -o /dev/null http://localhost:8086/0/detection/status | grep -c "ACTIVE")
############################################################################
##if iPhone in Wifi and Motion active activate
if [ "$iPhoneActive" -eq 1 ] && [ "$MotionDetectionActive" -eq 1 ]
then
wget -O - http://localhost:8086/0/detection/pause > /dev/null 2>&1
echo "Deactivating motion detection, iPhone entered WLAN" ##logging
fi
if [ "$iPhoneActive" -eq 0 ] && [ "$MotionDetectionActive" -eq 0 ] && [ "$NetworkDown" -eq 0 ]
then
wget -O - http://localhost:8086/0/detection/start > /dev/null 2>&1
echo "Activating motion detection, iPhone left WLAN or other error" ## logging
fi
IPhoneIP обнаруживается еженедельно с использованием
#!/bin/bash
########################################################
#writes iPhoneIP into /home/pi/motion/IPhoneIP.txt / IP-range might be different!!
########################################################
#
IP=$(nmap -sP 192.168.2.100-199 >/dev/null 2>&1 && /usr/sbin/arp -an | grep "01:01:01:01:01:01" | awk '{print $2}' | sed 's/[()]//g')
if [[ "${IP}" != "" ]]; then
echo "${IP}" >/home/pi/motion/IPhoneIP.txt
fi
Обнаружение bluetooth также основано на bash с использованием следующего сценария (также выполняется каждые 3 минуты):
#!/bin/bash
############################################################################
## bash checks whether iPhone is detected via bluetooth
############################################################################
##
############################################################################
BLUET=$(sudo l2ping -c 1 01:01:01:01:01:01 2>/dev/null | grep -c "44 bytes")
echo "${BLUET}" > /home/pi/motion/IPhoneBluetoothCheck.txt