Как запускать программное обеспечение веб-камеры только когда меня нет дома (телефон не находится в локальной сети)?

9172
endolith

В настоящее время у меня есть пользовательский cron, который запускает Motion по таймеру, когда я обычно ухожу на работу, а затем убиваю его, когда я обычно возвращаюсь домой, чтобы я мог наблюдать за своим котом / грабителями / etc:

0 9 * * * killall motion ; motion 30 18 * * * killall motion 

Используемый файл конфигурации есть ~/.motion/motion.confи имеет daemon on.

Но было бы лучше, если бы он мог определить, когда я на самом деле дома, отключить веб-камеру в это время и включить ее в другое время. Я думал, что мое присутствие может быть обнаружено моим телефоном Android, присоединяющимся к локальной сети. Так что-то вроде

  1. Сценарий, который проверяет каждые несколько минут, находится ли имя моего телефона или MAC-адрес в данный момент в локальной сети.
  2. Tasker скрипт на моем телефоне, который контактирует с домашним компьютером в некотором роде (простой веб - сервер?), Когда он присоединяется определенный SSID
  3. Сочетание вышеперечисленного
  4. ...

Есть лучшие идеи или советы о том, как реализовать один из них? 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 

Я даже не знаю, что это значит.

6

4 ответа на вопрос

5
dset0x

Запуск сценария на вашем компьютере намного проще и определенно более понятен, чем настройка веб-сервера, который будет ждать, пока телефон начнет с ним разговаривать. Поэтому я собираюсь пойти с вашей первой идеей.

Предположения:

  • У вас есть root-доступ.
  • /etc/init.d/motionиспользуется для запуска и остановки motion.
    • systemctl start|stop motion.service за systemd
  • Вы подключаетесь к той же сети, что и ваш телефон, используя eth0.
  • Ваша реализация cron использует crontabкоманду.

Получение MAC-адреса:

Получить arp-scanи запустить arp-scan -I eth0 -l -r 10от имени пользователя root. (Я обнаружил, -r 10что важно всегда обнаруживать мой телефон на Android)

Это вернет список устройств в вашей сети. Третий столбец должен облегчить идентификацию вашего телефона. Допустим, мы получили 01:01:01:01:01:01.

Сценарий это:

Запуск arp-scan -I eth0 -l -r 10 | grep -q '01:01:01:01:01:01'от имени пользователя root. Это вернется, 0только если телефон подключен.

Запустите crontab -eс правами root и добавьте эту строку, чтобы проверить, подключен ли ваш телефон к сети каждую минуту:

* * * * * 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

Сохраните файл и выйдите из редактора.

Имейте в виду, что нам не нужно проверять, motionработает ли мы сами. Сервисный скрипт делает это внутренне.

похоже, что `sudo arp-scan -i eth0 -r 10 android` быстрее. когда я пытаюсь запустить `/etc/init.d/motion start` от имени пользователя root, я получаю` * Не запускающий демон движения, отключенный через / etc / default / motion`. Обычно я просто запускаю его как `motion` моего пользователя без полномочий root, который использует мои настройки в` ~ / .motion / motion.conf` endolith 12 лет назад 0
Я настоятельно рекомендую использовать демон. Если вы все еще хотите работать как пользователь, хотя; у вас есть два варианта: (a) Заменить `/etc/init.d/motion start` на` su -c 'motion' username '. (b) Позвольте вашему пользователю запускать `motion` без пароля в / etc / sudoers (если вы его используете) и добавляете запись в crontab пользователя с проверками PID файла init.d (лучше всего сделать небольшой скрипт, который будет иметь ту же функциональность, что и файл init.d, и вместо этого вызывать этот скрипт из вашего crontab). dset0x 12 лет назад 1
Кажется, это создает множество случаев движения каждую минуту. Я запустил демон, запустив в качестве пользователя `motion`. Есть ли способ использовать метод `init.d start`, но при этом использовать файл конфигурации в моем домашнем каталоге пользователя и записывать файлы в мой домашний каталог пользователя с разрешениями пользователя? endolith 11 лет назад 0
`/etc/init.d/motion stop` убивает все экземпляры, если я запускаю его в командной строке, но он ничего не делает внутри crontab endolith 11 лет назад 0
Вы можете открыть скрипт `/ etc / init.d / motion` и скопировать оттуда функциональность проверки / уничтожения процесса в свой скрипт. Кстати, он должен работать внутри crontab (должен быть в crontab root, если он работает от имени root); проверьте ваши журналы cron. dset0x 11 лет назад 0
5
endolith

zmode's answer is helpful, but didn't work for me. After a lot of reading, I came up with this solution:

#!/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 

(The MAC address, hostname, and username need to be replaced.) It checks if the phone is on the network, using the phone's hostname android to avoid scanning unrelated addresses. It checks if motion is already running, so it doesn't start multiple instances or kill it repeatedly while it's working.

Then run sudo crontab -e to edit the root user's cron, and add a line like this:

*/5 * * * * /home/username/phone_webcam/phone_webcam.sh >> /var/log/cron.log 2>&1 

This will run the script every 5 minutes, logging the output so you can debug it. Run the command tail -f /var/log/cron.log to make sure it's working. After confirming that it works, remove the logging line from crontab:

*/5 * * * * /home/username/phone_webcam/phone_webcam.sh 
3
astryk

Взяв вышеуказанный ответ за основу, вы можете настроить его так, чтобы он работал немного лучше.

#!/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 без проблем, как только вы покинете (со своим телефоном) свой дом. Безупречный!

0
user2165245

У меня есть скрипт 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 - $) 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 '' | sed 's/[()]//g') if [[ "$" != "" ]]; then echo "$" >/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 "$" > /home/pi/motion/IPhoneBluetoothCheck.txt 

Похожие вопросы