如何仅在我不在家(电话不在局域网上)时运行网络摄像头软件?

end*_*ith 6 automation cron arp motion-detection motion

目前,当我通常去上班时,我的用户 cron在计时器上启动Motion,然后在我通常回家时杀死它,这样我就可以看我的猫/窃贼/等:

0 9 * * * killall motion ; motion
30 18 * * * killall motion
Run Code Online (Sandbox Code Playgroud)

使用的配置文件是~/.motion/motion.conf并且具有daemon on.

但是,如果它能够检测到我何时真正在家并在这些时间禁用网络摄像头,并在其他时间启用它,那就更好了。我在想我的存在可以通过加入 LAN 的 Android 手机检测到。所以像

  1. 每隔几分钟检查我手机的主机名或 MAC 地址当前是否在 LAN 上的脚本
  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
Run Code Online (Sandbox Code Playgroud)

所以 cron 或我开始运动的方式有问题。

我试图运行/etc/init.d/motion start而不是运行它并以用户身份杀死它,但该方法不起作用:

 * Not starting motion daemon, disabled via /etc/default/motion
Run Code Online (Sandbox Code Playgroud)

所以我编辑/etc/default/motionstart_motion_daemon=yes并再次尝试:

 ~> /etc/init.d/motion start
mkdir: cannot create directory `/var/run/motion': Permission denied
Run Code Online (Sandbox Code Playgroud)

我什至不知道那是什么意思。

dse*_*t0x 5

在您的计算机上运行脚本比设置一个等待电话与之通话的网络服务器要容易得多,而且绝对更干净。因此,我将采用您的第一个想法。

假设:

  • 你有根访问权限。
  • /etc/init.d/motion用于启动和停止motion
    • systemctl start|stop motion.service 为了 systemd
  • 您使用 连接到与手机相同的网络eth0
  • 您的 cron 实现使用该crontab命令。

获取MAC地址:

获取arp-scanarp-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自己是否正在运行。服务脚本在内部执行此操作。


end*_*ith 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
Run Code Online (Sandbox Code Playgroud)

(MAC 地址、主机名和用户名需要替换。)它检查电话是否在网络上,使用电话的主机名android避免扫描不相关的地址。它会检查运动是否已经在运行,因此它不会在工作时启动多个实例或重复杀死它。

然后运行sudo crontab -e编辑root用户的cron,添加如下一行:

*/5 * * * * /home/username/phone_webcam/phone_webcam.sh >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)

这将每 5 分钟运行一次脚本,记录输出以便您可以调试它。运行命令tail -f /var/log/cron.log以确保它正常工作。确认它有效后,从 crontab 中删除日志记录行:

*/5 * * * * /home/username/phone_webcam/phone_webcam.sh
Run Code Online (Sandbox Code Playgroud)