【问题标题】:Detecting a wireless device on the network from a wired device从有线设备检测网络上的无线设备
【发布时间】:2014-10-31 14:53:26
【问题描述】:

我正在尝试一些家庭自动化。我的目标是在我的 Android 手机离开我家的 Wifi 时发送一个 HTTP 请求,并在它重新加入时发送一个不同的 HTTP 请求。目标是当我离开家时 - 更具体地说,当我的手机离开家时 - 我的 IP 摄像机的运动检测已启用。然后,当我回到家时,它就解除了武装。 IP 摄像机有一个 HTTP 接口,可以通过编程方式进行布防和撤防。

这意味着当我不在家时,网络摄像头会在检测到前门有动作时向我发送电子邮件。因为我的手机在我真正进入家前大约一分钟重新加入了 Wifi,所以在我走进门之前,运动检测被解除,因此我没有收到自己进来的警报。这也意味着因为我的手机在 Wifi 上当我走出门时,我也不会因为自己走出门而发出警报。

我当前的方法是在我的 LAN 上 24/7 运行的 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 网络上(好吧,至少我没有告诉它断开连接,而且它有很强的信号)。

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

我真的不介意是否需要多花几分钟来观察手机离开家,但在我的手机真正重新加入 Wifi 到我的网络摄像头运动检测被解除之间需要一分钟或更短的时间,所以我不不要惊动自己。网络摄像头不能在我在家的时候被错误地武装,也不能在我不在家的时候被错误地解除武装。

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

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

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


感谢到目前为止的建议。以下是一些更新:

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

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

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


看了几天的日志,关闭手机上的“Wifi优化”后,现在看起来完全可靠了。如果一段时间后手机上没有任何程序或服务使用它,我猜 Wifi 连接有时会休眠并掉线。

【问题讨论】:

  • 您是否考虑过使用 ConnectivityManager 类。这样,您手机中的应用程序可以检测它是否从 WI-FI 更改为移动,反之亦然。 developer.android.com/training/monitoring-device-state/…
  • 我已经好几年没用番茄了,但是你的路由器有wl命令吗?如果是这样,您可以远程登录到路由器,然后wl rssi <mac-addr-of-phone> 来监控手机的信号强度(或者它是否在那里)。
  • 不确定您对使用其他服务的感觉如何,但 IFTTT.com 有适用于 Android 的触发器 - 您可以在手机加入 wifi 网络时触发,也可以在远离您的适当位置越过地理围栏时触发家。我不确定哪个激活渠道最适合您,但有很多可用的渠道,可以让您轻松收到通知 - ifttt.com/channels
  • 顺便说一句,对于那些根据自己的存在想更多家庭自动化想法的人:我回家后可以使用 WOL 打开我的桌面,虽然我想不出什么对于它们,我还有 Belkin WeMo 开关,它们是 Wifi 可控的电源插座。其中大部分甚至可以直接在我的路由器上运行;你只需要一个 24/7 的 Linux 系统!

标签: android linux networking automation home-automation


【解决方案1】:

刚刚做了一个快速测试,我的安卓手机响应普通的 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 不可靠。

【讨论】:

    【解决方案2】:

    只需我的两分钱,但您可以使用 nmap 查询您的路由器并检查您感兴趣的设备(通过 MAC 或 IP)并定期发送查询以查看它们是否仍然存在。

    您应该为 nmap 工具提供一个 IP 范围以扫描您的网络(例如 192.168.1/255)并获取结果文件,然后只需 解析出来。

    使用这种方法,您可以根据无线网络上是否存在用户进行“存在”检测。小心使用 iOS,因为即使它们没有移动一英寸,这些设备也会打开和关闭。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2018-12-09
      • 2023-02-26
      相关资源
      最近更新 更多