这是关于 esp8266 的 ARP 的问题。我意识到这可能是一个相当低级的 SDK 问题,所以我将解释一下我试图实现的目标。
如果我们假设我有一个已知的MAC地址或IP地址,我想知道有问题的设备是否连接到网络。ESP8266处于 STA
tiON 模式,因此设备可能在 WiFi 上或可能在以太网上,但这并不重要。我正在使用 ESP07 和 Arduino SDK/平台。
My understanding is that the ARP table in the ESP needs to have sent/received a packet from a device for the MAC and IP pair to be stored. If I do an ARP lookup for a known IP address using etharp_find_addr(STATION_IF, &_ip, &_arp_mac, &_arp_ip), then assuming the device is know, I get the index of the result and the associated MAC address.
搜索 IP 的 ARP 记录
int8_t result = etharp_find_addr(STATION_IF, &_ip, &_arp_mac, &_arp_ip)
我让流量被“看到”的一种方法是对设备执行 ping(使用内置的 ping.h)——这似乎对结果的准确性有很大帮助。事实上,如果我不执行 ping,那么大多数时候我都不会得到任何结果。我认为这遵循以下理论:只有在看到流向 IP/MAC 的流量时才会填充 ARP 表。到目前为止一切都很好。
但是,并非所有设备都响应 ping(如果它们处于休眠状态等),因此这并不总是可靠的。相当可靠,但不是防弹的。
Other tools for desktop systems can use ARP to force a request to the network / device to get a reply. Using such tools gives a much more reliable answer to the question "is device with IP address active?". There appears to be some functionality within etharp.h, but if I even think about using them, such as etharp_request(STATION_IF, &_ip), then I get an exception and the ESP reboots.
测试 IP 地址
ip_addr_t test_ip;
IP4_ADDR(&test_ip, 192,168,0,111);
进行搜索
int8_t result = etharp_request(STATION_IF, &test_ip);
我在这个
william hill官网
和谷歌上搜索了很长时间,以寻找这个问题的答案,但都失败了。有没有人有线索(甚至更好的是,一些有效的示例代码)可以帮助我做我所追求的事情?