乐鑫技术交流
直播中

王敏

8年用户 1528经验值
私信 关注
[问答]

关于esp8266的ARP的问题求解

这是一个关于 esp8266 的 ARP 的问题。我意识到这可能是一个相当低级的问题(即不那么正常),所以我将稍微解释一下我想要实现的目标。
如果我们假设我有一个已知的 MAC 地址或 IP 地址,我想知道相关设备是否已连接到网络。ESP8266 处于 STAtiON 模式,因此该设备可能在 WiFi 上或可能在以太网上,但这应该无关紧要。我正在使用 ESP07 和 Arduino 平台。
我的理解是 ESP 中的 ARP 表需要从设备发送/接收数据包才能存储 MAC 和 IP 对。如果我使用
,然后假设设备是已知的,我得到结果的索引和关联的 MAC 地址。
代码:全选// search ARP records for IP
int8_t result = etharp_find_addr(STATION_IF, &_ip, &_arp_mac, &_arp_ip)

让流量“可见”的一种方法是对设备执行 ping(使用内置的
)——这似乎对结果的准确性有很大帮助。事实上,如果我不执行 ping,那么大多数时候我都得不到结果。我认为这遵循的理论是,只有在看到到 IP/MAC 的流量时才会填充 ARP 表。到目前为止一切都很好。
但是,并非所有设备都会响应 ping(如果它们处于休眠状态等),因此这并不总是可靠的。相当可靠,但不是防弹的。
桌面系统的其他工具可以使用 ARP 强制向网络/设备发出请求以获得答复。使用此类工具可以更可靠地回答“具有 IP 地址的设备是否处于活动状态?”这个问题。etharp.h 中似乎有一些功能,但如果我什至考虑使用它们,例如
,那么我会得到一个异常并且 ESP 重新启动。
代码:全选// test IP address
ip_addr_t test_ip;
IP4_ADDR(&test_ip, 192,168,0,111);

// do a search
int8_t result = etharp_request(STATION_IF, &test_ip);

......

Exception (28):
epc1=0x4000df2f epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000033 depc=0x00000000

ctx: cont
sp: 3fff1ff0 end: 3fff2230 offset: 01a0

>>>stack>>>
3fff2190:  3f202020 00000000 00000000 00000000
3fff21a0:  4024545b 00000033 3fff1148 40245439
3fff21b0:  00000004 3fff21e0 00000000 00000001
3fff21c0:  6101a8c0 00ffffff fe01a8c0 3fff1208
3fff21d0:  3fffdad0 00000000 3fff1148 4020fa6b
3fff21e0:  6f00a8c0 6101a8c0 3fff1148 40206bb4
3fff21f0:  3fffdad0 3fff0e4c 3fff1148 40211717
3fff2200:  3fffdad0 00000000 3fff1200 4021252d
3fff2210:  3fffdad0 00000000 3fff1200 40208770
3fff2220:  feefeffe feefeffe 3fff1210 4020994c
<<

更多回帖

发帖
×
20
完善资料,
赚取积分