我正在尝试一些家庭自动化。我的目标是在我的Android手机离开我家的Wifi时发送HTTP请求,并在重新加入时发送不同的HTTP请求。我的目标是当我离开家时 - 更具体地说,当我的手机离开家时 - 我的IP摄像机的运动检测装备正在进行。然后,当我回到家时,它被解除了武装。 IP摄像机有一个HTTP接口,可以通过编程方式完成布防和撤防。
这意味着当我离开家时,网络摄像头会在检测到前门的动作时给我发电子邮件。因为我的电话在我实际进入家之前大约一分钟重新加入Wifi,所以在我走进门之前,动作检测已经解除武装,因此我不会报警自己进来。这也意味着因为我的手机是当我走出门时,在Wifi上,我也不会对自己走出去发出警报。
我当前的方法涉及在我的局域网上全天候运行的Linux服务器上每分钟运行一次cron作业。它由两个Bash脚本组成。一个检测到我的手机存在(如果手机存在则返回1
,如果没有,则返回0
):
cat /usr/local/bin/detect-phone.sh
#!/bin/bash
arping -D -c 10 -I eth0 nexus4
...以及脚本执行某些自动化的其他用户。它使用arping
来检测网络上的设备以及/tmp/phone-presence
处是否存在0字节文件。如果有人说电话在场,但另一个没有,那么它就会发送必要的HTTP请求,以便在网络摄像头上布防或撤防动作检测。
cat /usr/local/bin/toggle-webcam-alarm.sh
#!/bin/bash
/usr/local/bin/detect-phone.sh &> /dev/null
IS_HOME_NOW=$?
WAS_ALREADY_HOME=0
if [[ -f '/tmp/phone-presence' ]]; then
WAS_ALREADY_HOME=1
fi
ENABLE_WEBCAM=''
if [[ "$WAS_ALREADY_HOME" -eq 0 && "$IS_HOME_NOW" -eq 1 ]]; then
/usr/bin/logger "Phone just joined network, disarming webcam alarm"
ENABLE_WEBCAM=0
> /tmp/phone-presence
elif [[ "$WAS_ALREADY_HOME" -eq 1 && "$IS_HOME_NOW" -eq 0 ]]; then
/usr/bin/logger "Phone just left network, arming webcam alarm"
ENABLE_WEBCAM=1
rm /tmp/phone-presence
fi
if [[ ! -z "$ENABLE_WEBCAM" ]]; then
/usr/bin/curl "...some URL that accepts $ENABLE_WEBCAM..." &> /dev/null
fi
这确实有效,但存在检测不可靠。我的日志中包含以下条目:
tail /var/log/messages
...
Sep 6 10:37:11 logger: Phone just left network, arming webcam alarm
Sep 6 10:38:01 logger: Phone just joined network, disarming webcam alarm
Sep 6 10:47:11 logger: Phone just left network, arming webcam alarm
Sep 6 10:48:02 logger: Phone just joined network, disarming webcam alarm
这些参赛作品并不是因为我离开了家或因为我触摸了我的手机。我的手机应该一直在Wifi网络上(好吧,我没有告诉它至少断开它并且它有一个强烈的信号)。
所以,我目前的解决方案并不可靠。当我走进或走出时,我偶尔会通过电子邮件发送自己的照片。增加使用-c
为arping
指定的计数通常不会对提高手机检测的可靠性产生影响,此外,如果我将其设置为荒谬的高,它将开始导致问题因为cron工作每分钟运行一次。
如果需要花几分钟时间观察手机离开家,我真的不介意,但是当我的手机实际重新加入Wifi到我的网络摄像头运动检测被撤防时需要花费一分钟或更短的时间我不会对自己发出警报。当我在家时,网络摄像头不能被错误地武装起来,当我离家时也不能被错误地解除武装。
我考虑过的其他一些方法但不知道如何实施:
arping
。dnsmasq
,以便在手机连接到Wifi时向手机发出DHCP租约时运行脚本。但是,我不知道这对于手机从网络中掉落的相反情况会如何。手机有一个静态的DHCP地址,因此虽然分配给手机的IP永远不会改变,但它仍然会通过DHCP请求一个。那么,您建议我采取什么方法来可靠地处理这种情况?同样,高级目标:当我的手机离开家时发送一个HTTP请求,并在它回到家时发送另一个HTTP请求。
感谢您提出的建议。以下是一些更新:
wl
但似乎非常不准确。特别是,它认为在几个月内没有在我的局域网上的设备仍然存在并且具有良好的信号强度。这似乎不太可能,因为它已经拆除了电池架子。我认为我确实找到了一种显着提高当前arping
方法可靠性的方法。我关掉了" Wi-Fi优化"在Android的设置中。从那时起,我在过去的8小时内只在我的日志中出现了一个误报,而通常每小时约有一个。我将此设置禁用一段时间以查看它是否真的有帮助。我的理论是它使Wifi连接保持更可靠,因此手机更有可能响应任何Wifi流量。
我还能够为这两个请求设置Apache SSL代理(一个用于设置网络摄像头警报,另一个用于解除警报),因此,如果需要,我现在可以通过Internet安全地发送这些请求。
经过几天观察日志后,看起来现在完全可靠后关闭了#34; Wifi优化"在我的手机上。我猜测Wifi连接偶尔会睡觉,如果手机上没有程序或服务在一段时间后使用它就会从网络上掉线。
答案 0 :(得分:0)
刚做了一个快速测试,我的Android手机响应普通的ping。
你可以执行一个类似这样的cron作业:
$ ping -c 5 192.168.1.131
PING 192.168.1.131 (192.168.1.131) 56(84) bytes of data.
64 bytes from 192.168.1.131: icmp_seq=1 ttl=64 time=28.6 ms
64 bytes from 192.168.1.131: icmp_seq=2 ttl=64 time=51.4 ms
64 bytes from 192.168.1.131: icmp_seq=3 ttl=64 time=73.9 ms
64 bytes from 192.168.1.131: icmp_seq=4 ttl=64 time=97.4 ms
64 bytes from 192.168.1.131: icmp_seq=5 ttl=64 time=16.0 ms
--- 192.168.1.131 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 16.067/53.491/97.404/29.558 ms
解析输出,如果你至少有三次ping,你的手机就在这里(虽然我预计所有五次ping都会没有任何问题)。不确定为什么ARP ping是不可靠的。
答案 1 :(得分:0)
只需我的两分钱,但您可以使用nmap查询您的路由器并检查您感兴趣的设备(通过MAC或IP)并定期发送查询以查看它们是否仍然存在。
您应该为nmap工具提供一个IP范围来扫描您的网络(类似于192.168.1 / 255)并获取结果文件,然后只是 解析出来。
通过这种方法,你可以拥有"存在"根据无线网络上用户的存在进行检测。小心iOS,因为这些设备连接都是关闭的,即使它们没有移动一英寸。
希望这有帮助。