从有线设备检测网络上的无线设备

时间:2014-09-07 01:56:51

标签: android linux networking automation home-automation

我正在尝试一些家庭自动化。我的目标是在我的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网络上(好吧,我没有告诉它至少断开它并且它有一个强烈的信号)。

所以,我目前的解决方案并不可靠。当我走进或走出时,我偶尔会通过电子邮件发送自己的照片。增加使用-carping指定的计数通常不会对提高手机检测的可靠性产生影响,此外,如果我将其设置为荒谬的高,它将开始导致问题因为cron工作每分钟运行一次。

如果需要花几分钟时间观察手机离开家,我真的不介意,但是当我的手机实际重新加入Wifi到我的网络摄像头运动检测被撤防时需要花费一分钟或更短的时间我不会对自己发出警报。当我在家时,网络摄像头不能被错误地武装起来,当我离家时也不能被错误地解除武装。

我考虑过的其他一些方法但不知道如何实施:

  • 每分钟通过SNMP查询我的路由器(运行Tomato)以查看设备是否仍在网络上,而不是使用arping
  • 在路由器上配置dnsmasq,以便在手机连接到Wifi时向手机发出DHCP租约时运行脚本。但是,我不知道这对于手机从网络中掉落的相反情况会如何。手机有一个静态的DHCP地址,因此虽然分配给手机的IP永远不会改变,但它仍然会通过DHCP请求一个。
  • 使用Llama处理状态检测。我已经使用Llama根据我的位置成功地在手机上自动完成某些操作。当手机加入Wifi时发送请求没问题,但是当它离开Wifi时没有,因为两个 HTTP请求必须在LAN上发送:它们包含敏感数据。现在,我可以选择使用Apache作为代理。我有一台Linux服务器运行面向公众的受SSL保护的Apache实例,如果需要,我可以(通过帮助)将其配置为允许在Internet上通过SSL进行请求,然后转发到网络摄像头局域网。这样,HTTP请求可以通过Internet发送,但是没有猜测URL,没有人能够访问它们,因为请求将被加密。

那么,您建议我采取什么方法来可靠地处理这种情况?同样,高级目标:当我的手机离开家时发送一个HTTP请求,并在它回到家时发送另一个HTTP请求。


感谢您提出的建议。以下是一些更新:

  • 我的手机无法正常响应正常的ICMP ping。有时它会立即回复,有时会超时。
  • 番茄确实有wl但似乎非常不准确。特别是,它认为在几个月内没有在我的局域网上的设备仍然存在并且具有良好的信号强度。这似乎不太可能,因为它已经拆除了电池架子。
  • 我对使用IFTTT没有任何问题(虽然我最初更喜欢完全本地化的东西)。然而,虽然它可以轻松处理地理围栏方面,但我不知道它是如何实际执行必要的触发器来布防和撤防网络摄像头警报,这需要发送这两个HTTP请求。
  • 感谢Java类的建议,但除非事情变得非常绝望,否则我不必编写整个Android应用程序来处理这种情况。此外,使用Llama和IFTTT,已经有几种方法可以解决地理围栏问题。当连接或断开Wifi时,Llama还可以执行各种操作。

我认为我确实找到了一种显着提高当前arping方法可靠性的方法。我关掉了" Wi-Fi优化"在Android的设置中。从那时起,我在过去的8小时内只在我的日志中出现了一个误报,而通常每小时约有一个。我将此设置禁用一段时间以查看它是否真的有帮助。我的理论是它使Wifi连接保持更可靠,因此手机更有可能响应任何Wifi流量。

我还能够为这两个请求设置Apache SSL代理(一个用于设置网络摄像头警报,另一个用于解除警报),因此,如果需要,我现在可以通过Internet安全地发送这些请求。


经过几天观察日志后,看起来现在完全可靠后关闭了#34; Wifi优化"在我的手机上。我猜测Wifi连接偶尔会睡觉,如果手机上没有程序或服务在一段时间后使用它就会从网络上掉线。

2 个答案:

答案 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,因为这些设备连接都是关闭的,即使它们没有移动一英寸。

希望这有帮助。