6

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

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

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

4 ответа4

5

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

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

  • У вас есть 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 самостоятельно. Сервисный скрипт делает это внутренне.

5

Ответ 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
3

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

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

У меня есть скрипт 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .