Amazon Dash 按钮停止了 ARPing?
Amazon Dash Button stopped ARPing?
我已经实施了一个家庭自动化解决方案,使用两个 Amazon Dash 按钮、一个 raspberry pi 和 python 代码来跟踪我孩子的家务,这与 here 所做的类似。此解决方案在过去几个月一直有效。
昨天,按钮似乎已停止 ARPing。也就是说,我无法再从他们那里检测到 ARP,我似乎也无法通过嗅探检测到他们的 MAC 地址。我想知道是否还有其他人遇到过这个问题?除了使用scapy的python机制,我也试过"ip neigh"也没有用。使用 "ip neigh" 命令的 bash 脚本的示例是 here。我试图从 RaspberryPI 和 Mac 检测按钮。所有机器都已成功配置到同一无线网络中。
一些附加信息。本来我订了 3 个按钮,但是其中 1 个好像从来没有 ARP,所以我把它放在一边了。当我发现有关此问题的更多信息时,我会进行更新。
编辑
我已经多次尝试通过使用亚马逊 android 应用程序添加一个新的破折号按钮并重新配置它们来解决这个问题。
您是否碰巧从您的亚马逊帐户中停用了 Dash 按钮?我发现如果 Dash 按钮已停用(意味着不再出现在您的帐户中),下次 Dash 按钮会调用 mothership。它会告诉 Dash 它不再被激活。从现在开始,按下 Dash 按钮只会发出红灯,不会启动 Wi-Fi 连接,因此不会有 ARP 条目。也可能是亚马逊从他们的末端停用了 Dash 按钮以节省电池(因为您显然没有在最后 n 次按下时订购任何东西)。
如果它符合您的情况,您可以通过重新注册您的 Dash 按钮来解决这个问题。只是不要 select 订购任何东西。
这周我遇到了与您类似的问题。我已经设置了我的破折号按钮来控制和切换我的 LIFX 灯泡,并且在过去几个月里每天都使用它们,没有任何问题。突然间它就停止工作了,所以我检查了检测器脚本(在 Raspberry Pi 上使用 Scapy)并且没有检测到按钮。
我的 phone 上仍然收到通知,提示我的按钮已被按下并需要设置,因此我可以知道它们仍在连接到网络,问题出在检测器脚本或Pi.
这对您来说可能是一个不同的问题,但将 Pi 上的检测脚本更改为这个替代方案(建议在最初的 5 美元婴儿追踪器介质 post 上使用)解决了我的问题。
https://gist.github.com/ibrahima/5e43439eb71066bf891f
我还建议您的路由器可能已将频段或频道更改为破折号按钮无法通过其进行通信的频段或频道(因此无法连接到路由器)。我的灯泡之前也发生过这种情况(路由器自动切换到频道 13,但 LIFX 仅通过 1-11/12 通信)。我还必须首先调整我的路由器设置,以获得检测我的网络的按钮(但如果你可以很好地完成整个设置过程,那么情况可能并非如此)。可能是路由器软件更新或安全设置更改导致检测失败?
我有两个全新的破折号按钮,它们没有为 0.0.0.0 执行 arp,而是通过 bootp 请求获取 dhcp 地址,这导致正在寻找 arp 0.0.0.0 的通用脚本忽略他们。
您可以修改脚本以监视 bootp,而不是监视 arp 0.0.0.0,或者只是跳过测试 0.0.0.0 的 arp 的脚本中的第一次检查
我为解决这个问题所做的就是为它们所连接的无线路由器上的按钮分配固定的 IP 地址(因为我可以在 DHCP table 中看到它们的 MAC 地址) .然后我重写了脚本,以简单地检测对已分配按钮的 ipAddress 的成功 ping。我注意到按钮在网络上保留了一小段时间(可能是 15-20 秒),所以我在检测之间添加了一点等待时间(有点像物理开关上的去抖动过滤器)以确保按下相同的按钮两次都没有被发现。这成功了。
首先我找到了 ping 的纯 python 实现(我将 lock、stock 和 barrel 复制到 python 脚本中),然后我写了这段代码:
#!/usr/bin/python
from scapy.all import *
import requests
import time
import os, sys
import subprocess
import re
import platform
import datetime
BUTTON_A = "<assigned IP address to Button A>"
BUTTON_B = "<assigned IP address to Button B>"
last_button_push_A = datetime.datetime(2013,12,30,23,59,59)
last_button_push_B = datetime.datetime(2005,12,30,1,1,1)
waittime_sec = 20
while (True):
try:
delta = (datetime.datetime.now() - last_button_push_A).seconds
print (delta > 20)
if (do_one(BUTTON_A, 1) is not None) and delta > waittime_sec:
last_button_push_A = datetime.datetime.now();
logfile.write("<Child 1> Completed a Chore: "+time.strftime("%Y-%m-%d %H:%M")+"\n")
logfile.flush()
play_sound_child_1()
delta = (datetime.datetime.now() - last_button_push_B).seconds
if (do_one(BUTTON_B, 1) is not None) and delta > waittime_sec:
last_button_push_B = datetime.datetime.now()
logfile.write("<child 2> Completed a Chore: "+time.strftime("%Y-%m-%d %H:%M")+"\n")
logfile.flush()
play_sound_child_2()
except BaseException as e:
logfile.write("EXCEPTION: {}\n".format(e))
logfile.write("Loop Rest at "+time.strftime("%Y-%m-%d %H:%M")+"\n")
我使用 WireShark 缩小了问题范围。这是解决任何类型的网络相关问题的好工具。
就像 palerider 所说的那样,我的破折号按钮似乎每次连接时都在执行 DHCP 请求,而不是标准的 ARP,源 IP 为“0.0.0.0”(因为它没有)。我更新了我的侦听器应用程序以查找来自源 IP“0.0.0.0”的 DHCP 请求,我能够看到哪些 MAC 地址正在发出这些类型的请求(不多),然后再次更新我的应用程序以具体查看对于此 MAC 地址,一旦它收到来自源 IP“0.0.0.0”的 DHCP 请求。
似乎 Dash 按钮不再 "ARP"。
您可以监听 DHCP 请求,而不是使用这个漂亮的脚本:
https://gist.github.com/mr-pj/75297864abef5c8f2d5c134be2656023#file-dashbutton-py
似乎 "new" 型号的 Dash 按钮(它们终于在英国发布,发布当天我正在玩一个)在连接到网络时的行为与以前的型号不同.这破坏了很多代码,这些代码通过监视源主机 0.0.0.0
.
的 ARP 请求来检测它们
这些新按钮似乎首先从 0.0.0.0
发出 DHCP 请求,然后使用 IP 地址向其他网络设备(例如网关)发出 ARP 请求他们已被分配。
检测这种新行为相当简单。例如,通过更改 build/ArpProbes.js
中的 libpcap
过滤器规范,可以使 dash-button node module 适用于两种类型的按钮:
const ARP_PROBE_FILTER = 'arp src host 0.0.0.0';
到
const ARP_PROBE_FILTER = '(arp or (udp and src port 68 and dst port 67)) and src host 0.0.0.0';
我也提交了这个 dash-button
问题 here。
我已经实施了一个家庭自动化解决方案,使用两个 Amazon Dash 按钮、一个 raspberry pi 和 python 代码来跟踪我孩子的家务,这与 here 所做的类似。此解决方案在过去几个月一直有效。
昨天,按钮似乎已停止 ARPing。也就是说,我无法再从他们那里检测到 ARP,我似乎也无法通过嗅探检测到他们的 MAC 地址。我想知道是否还有其他人遇到过这个问题?除了使用scapy的python机制,我也试过"ip neigh"也没有用。使用 "ip neigh" 命令的 bash 脚本的示例是 here。我试图从 RaspberryPI 和 Mac 检测按钮。所有机器都已成功配置到同一无线网络中。
一些附加信息。本来我订了 3 个按钮,但是其中 1 个好像从来没有 ARP,所以我把它放在一边了。当我发现有关此问题的更多信息时,我会进行更新。
编辑 我已经多次尝试通过使用亚马逊 android 应用程序添加一个新的破折号按钮并重新配置它们来解决这个问题。
您是否碰巧从您的亚马逊帐户中停用了 Dash 按钮?我发现如果 Dash 按钮已停用(意味着不再出现在您的帐户中),下次 Dash 按钮会调用 mothership。它会告诉 Dash 它不再被激活。从现在开始,按下 Dash 按钮只会发出红灯,不会启动 Wi-Fi 连接,因此不会有 ARP 条目。也可能是亚马逊从他们的末端停用了 Dash 按钮以节省电池(因为您显然没有在最后 n 次按下时订购任何东西)。
如果它符合您的情况,您可以通过重新注册您的 Dash 按钮来解决这个问题。只是不要 select 订购任何东西。
这周我遇到了与您类似的问题。我已经设置了我的破折号按钮来控制和切换我的 LIFX 灯泡,并且在过去几个月里每天都使用它们,没有任何问题。突然间它就停止工作了,所以我检查了检测器脚本(在 Raspberry Pi 上使用 Scapy)并且没有检测到按钮。
我的 phone 上仍然收到通知,提示我的按钮已被按下并需要设置,因此我可以知道它们仍在连接到网络,问题出在检测器脚本或Pi.
这对您来说可能是一个不同的问题,但将 Pi 上的检测脚本更改为这个替代方案(建议在最初的 5 美元婴儿追踪器介质 post 上使用)解决了我的问题。 https://gist.github.com/ibrahima/5e43439eb71066bf891f
我还建议您的路由器可能已将频段或频道更改为破折号按钮无法通过其进行通信的频段或频道(因此无法连接到路由器)。我的灯泡之前也发生过这种情况(路由器自动切换到频道 13,但 LIFX 仅通过 1-11/12 通信)。我还必须首先调整我的路由器设置,以获得检测我的网络的按钮(但如果你可以很好地完成整个设置过程,那么情况可能并非如此)。可能是路由器软件更新或安全设置更改导致检测失败?
我有两个全新的破折号按钮,它们没有为 0.0.0.0 执行 arp,而是通过 bootp 请求获取 dhcp 地址,这导致正在寻找 arp 0.0.0.0 的通用脚本忽略他们。
您可以修改脚本以监视 bootp,而不是监视 arp 0.0.0.0,或者只是跳过测试 0.0.0.0 的 arp 的脚本中的第一次检查
我为解决这个问题所做的就是为它们所连接的无线路由器上的按钮分配固定的 IP 地址(因为我可以在 DHCP table 中看到它们的 MAC 地址) .然后我重写了脚本,以简单地检测对已分配按钮的 ipAddress 的成功 ping。我注意到按钮在网络上保留了一小段时间(可能是 15-20 秒),所以我在检测之间添加了一点等待时间(有点像物理开关上的去抖动过滤器)以确保按下相同的按钮两次都没有被发现。这成功了。
首先我找到了 ping 的纯 python 实现(我将 lock、stock 和 barrel 复制到 python 脚本中),然后我写了这段代码:
#!/usr/bin/python
from scapy.all import *
import requests
import time
import os, sys
import subprocess
import re
import platform
import datetime
BUTTON_A = "<assigned IP address to Button A>"
BUTTON_B = "<assigned IP address to Button B>"
last_button_push_A = datetime.datetime(2013,12,30,23,59,59)
last_button_push_B = datetime.datetime(2005,12,30,1,1,1)
waittime_sec = 20
while (True):
try:
delta = (datetime.datetime.now() - last_button_push_A).seconds
print (delta > 20)
if (do_one(BUTTON_A, 1) is not None) and delta > waittime_sec:
last_button_push_A = datetime.datetime.now();
logfile.write("<Child 1> Completed a Chore: "+time.strftime("%Y-%m-%d %H:%M")+"\n")
logfile.flush()
play_sound_child_1()
delta = (datetime.datetime.now() - last_button_push_B).seconds
if (do_one(BUTTON_B, 1) is not None) and delta > waittime_sec:
last_button_push_B = datetime.datetime.now()
logfile.write("<child 2> Completed a Chore: "+time.strftime("%Y-%m-%d %H:%M")+"\n")
logfile.flush()
play_sound_child_2()
except BaseException as e:
logfile.write("EXCEPTION: {}\n".format(e))
logfile.write("Loop Rest at "+time.strftime("%Y-%m-%d %H:%M")+"\n")
我使用 WireShark 缩小了问题范围。这是解决任何类型的网络相关问题的好工具。
就像 palerider 所说的那样,我的破折号按钮似乎每次连接时都在执行 DHCP 请求,而不是标准的 ARP,源 IP 为“0.0.0.0”(因为它没有)。我更新了我的侦听器应用程序以查找来自源 IP“0.0.0.0”的 DHCP 请求,我能够看到哪些 MAC 地址正在发出这些类型的请求(不多),然后再次更新我的应用程序以具体查看对于此 MAC 地址,一旦它收到来自源 IP“0.0.0.0”的 DHCP 请求。
似乎 Dash 按钮不再 "ARP"。
您可以监听 DHCP 请求,而不是使用这个漂亮的脚本: https://gist.github.com/mr-pj/75297864abef5c8f2d5c134be2656023#file-dashbutton-py
似乎 "new" 型号的 Dash 按钮(它们终于在英国发布,发布当天我正在玩一个)在连接到网络时的行为与以前的型号不同.这破坏了很多代码,这些代码通过监视源主机 0.0.0.0
.
这些新按钮似乎首先从 0.0.0.0
发出 DHCP 请求,然后使用 IP 地址向其他网络设备(例如网关)发出 ARP 请求他们已被分配。
检测这种新行为相当简单。例如,通过更改 build/ArpProbes.js
中的 libpcap
过滤器规范,可以使 dash-button node module 适用于两种类型的按钮:
const ARP_PROBE_FILTER = 'arp src host 0.0.0.0';
到
const ARP_PROBE_FILTER = '(arp or (udp and src port 68 and dst port 67)) and src host 0.0.0.0';
我也提交了这个 dash-button
问题 here。