我已经实施了一个家庭自动化解决方案,使用两个Amazon Dash按钮,一个覆盆子pi和类似于已经完成的here的python代码来跟踪我的孩子的家务。这个解决方案在过去的几个月里一直有效。
昨天,按钮似乎已停止ARPing。也就是说,我无法再从它们检测到ARP,也无法通过嗅探来检测其MAC地址。我想知道是否还有其他人遇到过这个问题?除了使用scapy的python机制之外,我还尝试过" ip neigh"无济于事。使用" ip neigh"的bash脚本示例命令是here。我试图从RaspberryPI和Mac上检测按钮。所有计算机都已成功配置为位于同一无线网络上。
一些额外的信息。最初我订购了3个按钮,但其中有1个按钮似乎从未出现过ARP,所以我把它放在一边。当我发现有关此问题的更多信息时,我会更新。
修改 我已经多次尝试通过利用亚马逊Android应用程序添加新的短划线按钮并重新配置它们来解决这个问题。
答案 0 :(得分:4)
本周我和你有类似的问题。我设置了我的破折号按钮来控制和切换我的LIFX灯泡,并且在过去的几个月中每天使用它们都没有问题。它突然停止工作,所以我检查了探测器脚本(在Raspberry Pi上使用Scapy)并且没有检测到按钮。
我仍然在手机上收到通知,我的按钮被按下并需要设置,所以我可以告诉他们仍然连接到网络,问题是检测器脚本或Pi。 < / p>
这对您来说可能是一个不同的问题,但是将Pi上的检测脚本更改为此替代方案(在原来的$ 5婴儿跟踪器中等帖子上建议)修复了我的问题。 https://gist.github.com/ibrahima/5e43439eb71066bf891f
我还建议您的路由器可能已将频段或频道更改为短划线按钮无法通信的频道(因此无法连接到路由器)。这在我之前发生过我的灯泡(路由器自动切换到通道13但LIFX仅通过1-11 / 12进行通信)。我还必须使用我的路由器设置来获取按钮来检测我的网络(但如果你可以完成整个设置过程,那么可能不是这种情况)。潜在的路由器软件更新或安全设置更改导致检测中断?
答案 1 :(得分:3)
似乎Dash-Buttons不再是“ARP”。
您可以使用这个漂亮的脚本来收听DHCP请求: https://gist.github.com/mr-pj/75297864abef5c8f2d5c134be2656023#file-dashbutton-py
答案 2 :(得分:3)
似乎&#34; new&#34;模型Dash按钮(它们最终在英国发布,我在发布当天播放一个)在连接到网络时的行为与以前的模型不同。这打破了很多代码,通过监视源主机为0.0.0.0
的ARP请求来检测它们。
这些新按钮似乎首先从0.0.0.0
发出 DHCP请求,然后使用已分配的IP地址向其他网络设备(例如网关)发出ARP请求。
检测这种新行为非常简单。例如,通过更改libpcap
中的build/ArpProbes.js
过滤规范,可以使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。
答案 3 :(得分:2)
我有两个全新的破折号按钮,而不是为0.0.0.0执行arp,他们正在执行bootp请求以获取dhcp地址,这会导致寻找arp 0.0.0.0的常见脚本忽略它们
你可以修改脚本来监视bootp,而不是观察arp 0.0.0.0,或者只是跳过测试arp为0.0.0.0的脚本中的第一次检查
答案 4 :(得分:2)
我为解决这个问题所做的是将固定IP地址分配给它们所连接的无线路由器上的按钮(因为我可以在DHCP表中看到它们的MAC地址)。然后我重写了脚本,只是根据分配了按钮的ipAddress检测成功的ping。我注意到按钮在网络上停留了一段时间(可能是15-20秒),所以我在检测之间增加了一点等待时间(有点像物理开关上的去抖滤波器),以确保按下相同的按钮没有检测到两次。这就行了。
首先我找到了ping的纯python实现(我将锁,股票和桶复制到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")
答案 5 :(得分:2)
我使用WireShark来缩小问题范围。这是一个很好的工具,可以解决任何类型的网络相关问题。
就像palerider说的那样,我的破折号按钮似乎每次连接而不是标准ARP时都会执行DHCP请求,源IP为&#34; 0.0.0.0&#34; (因为它没有)。我更新了我的监听应用程序以查找来自源IP&#34; 0.0.0.0&#34;的DHCP请求我能够看到哪些MAC地址正在进行这些类型的请求(不是很多),然后再次更新我的应用程序,以便在收到来自源IP&#34; 0.0.0.0&#的DHCP请求后专门查找此MAC地址34。
答案 6 :(得分:1)
您是否恰好已停用亚马逊帐户中的“短划线”按钮?我发现如果Dash按钮已被停用(意味着不再出现在您的帐户中),则下次Dash按钮会调用motherhip。它会告诉Dash它不再被激活。从现在开始,按“Dash”按钮只会发出红灯,并且不会启动Wi-Fi连接,因此不会启用ARP条目。也可能是亚马逊从他们的末端停用了Dash按钮以节省电池(因为你显然没有为最后n次按下订购任何东西)。
如果它符合您的方案,您可以通过再次注册您的Dash按钮来解决这个问题。只是不要选择要订购的任何东西。