1

我已经实现了一个家庭自动化解决方案,使用两个 Amazon Dash 按钮、一个树莓派和类似于这里所做的 python 代码来跟踪我孩子的家务。该解决方案在过去几个月中一直有效。

昨天,这些按钮似乎停止了 ARPing。也就是说,我无法再从他们那里检测到 ARP,我似乎也无法通过嗅探来检测他们的 MAC 地址。我想知道是否还有其他人遇到过这个问题?除了使用scapy的python机制外,我还尝试了“ip neigh”,但无济于事。使用“ip neigh”命令的 bash 脚本示例在这里。我试图检测来自 RaspberryPI 和 Mac 的按钮。所有机器都已成功配置为在同一无线网络上。

一些额外的信息。最初我订购了 3 个按钮,但其中 1 个似乎从来没有 ARP,所以我把它放在一边。当我找到有关此问题的更多信息时,我会更新。

编辑 我曾多次尝试通过使用 Amazon android 应用程序添加新的破折号按钮并重新配置它们来解决此问题。

4

7 回答 7

4

这周我和你有类似的问题。在过去的几个月里,我设置了仪表板按钮来控制和切换我的 LIFX 灯泡并每天使用它们,没有任何问题。突然它停止工作了,所以我检查了检测器脚本(在 Raspberry Pi 上使用 Scapy)并且没有检测到按钮。

我仍然在我的手机上收到通知,说我的按钮已被按下并需要设置,所以我可以告诉他们仍在连接到网络,问题是检测器脚本或 Pi。

这对您来说可能是一个不同的问题,但是将 Pi 上的检测脚本更改为这个替代方案(建议在最初的 5 美元婴儿追踪器媒体帖子中)解决了我的问题。 https://gist.github.com/ibrahima/5e43439eb71066bf891f

我还建议您的路由器可能已将频段或频道更改为破折号按钮无法通信的频段或频道(因此无法连接到路由器)。我以前的灯泡也发生过这种情况(路由器自动切换到通道 13,但 LIFX 仅通过 1-11/12 进行通信)。我还必须使用我的路由器设置来让按钮首先检测我的网络(但如果你可以很好地完成整个设置过程,那么情况可能并非如此)。路由器软件更新或安全设置更改可能导致检测失败?

于 2016-05-22T16:30:59.650 回答
3

似乎 Dash-Buttons 不再“ARP”。

您可以使用这个漂亮的脚本来收听 DHCP 请求: https ://gist.github.com/mr-pj/75297864abef5c8f2d5c134be2656023#file-dashbutton-py

于 2016-09-02T18:11:40.867 回答
3

似乎“新”模型 Dash 按钮(它们终于在英国发布,我在发布当天正在玩一个)在连接到网络时的行为与以前的模型不同。这破坏了许多通过监视源主机的 ARP 请求来检测它们的代码0.0.0.0

相反,这些新按钮似乎首先发出DHCP 请求0.0.0.0然后使用分配给其他网络设备(例如网关)的 IP 地址发出 ARP 请求。

检测这种新行为相当简单。例如,通过更改 中的过滤器规范,可以使dash-button 节点模块适用于两种类型的按钮,从:libpcapbuild/ArpProbes.js

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提出了这个问题。

于 2016-10-06T21:58:35.450 回答
2

我有两个全新的破折号按钮,而不是为 0.0.0.0 执行 arp,而是执行 bootp 请求以获取 dhcp 地址,这导致正在寻找 arp 0.0.0.0 的常用脚本忽略它们。

您可以修改脚本以监视 bootp,而不是监视 arp 0.0.0.0,或者只是跳过脚本中测试 0.0.0.0 的 arp 的第一次检查

于 2016-07-16T01:45:51.543 回答
2

我为解决这个问题所做的就是为它们连接的无线路由器上的按钮分配固定的 IP 地址(因为我可以在 DHCP 表中看到它们的 MAC 地址)。然后我重写了脚本以简单地检测对已分配按钮的 ipAddress 的成功 ping。我注意到按钮会在网络上保留一段时间(可能是 15-20 秒),所以我在检测之间增加了一点等待时间(有点像物理开关上的去抖过滤器)以确保相同的按钮按下两次都没被发现。这成功了。

首先,我找到了ping的纯 Python 实现(我将 lock、stock 和 bucket 复制到 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")
于 2016-07-19T20:28:16.587 回答
2

我使用 WireShark 来缩小问题范围。这是解决任何类型的网络相关问题的好工具。

就像palerider说的那样,我的破折号按钮似乎每次连接时都在做一个DHCP请求,而不是标准的ARP,源IP为“0.0.0.0”(因为它没有)。我更新了我的侦听器应用程序以查找来自源 IP“0.0.0.0”的 DHCP 请求,并且我能够看到哪些 MAC 地址正在发出这些类型的请求(不是很多),然后再次更新我的应用程序以专门查找此 MAC 地址一旦它收到来自源 IP“0.0.0.0”的 DHCP 请求。

于 2016-08-31T03:47:57.837 回答
1

您是否碰巧从您的亚马逊帐户中停用了 Dash 按钮?我发现如果 Dash 按钮已经被停用(意味着不再出现在您的帐户中),那么下次 Dash 按钮调用 Mothership。它会告诉 Dash 它不再被激活。从现在开始,按下 Dash 按钮只会发出红灯,并且不会启动 Wi-Fi 连接,因此不会进入 ARP。也可能是亚马逊从末端停用了 Dash 按钮以节省电池(因为您显然没有为最后 n 次按下订购任何东西)。

如果它与您的场景匹配,您可以通过再次注册 Dash 按钮来解决此问题。只是不要选择任何要订购的东西。

于 2016-05-19T23:03:41.583 回答