完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是关于 esp8266 的 ARP 的问题。我意识到这可能是一个相当低级的 SDK 问题,所以我将解释一下我试图实现的目标。
如果我们假设我有一个已知的MAC地址或IP地址,我想知道有问题的设备是否连接到网络。ESP8266处于 STAtiON 模式,因此设备可能在 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); 我在这个论坛和谷歌上搜索了很长时间,以寻找这个问题的答案,但都失败了。有没有人有线索(甚至更好的是,一些有效的示例代码)可以帮助我做我所追求的事情? |
|
相关推荐
1个回答
|
|
要解决ESP8266使用etharp_request()的ARP请求异常问题,请按照以下步骤操作:
1. 确保您的ESP8266模块已正确连接并配置。检查电源、TX、RX和GND引脚是否正确连接到Arduino或其他微控制器。 2. 确保您使用的Arduino IDE和ESP8266开发板插件是最新版本。这有助于确保SDK和库文件是最新的,从而减少兼容性问题。 3. 在代码中,确保您已经包含了所需的库文件,例如`ESP8266WiFi.h`和`lwip/etharp.h`。 4. 在编写代码时,确保您已经初始化了ESP8266的WiFi功能。使用以下代码片段初始化WiFi: ```cpp #include void setup() { Serial.begin(115200); WiFi.begin("yourSSID", "yourPassword"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("Connected to WiFi"); } ``` 5. 在发送ARP请求之前,确保ESP8266已经连接到网络。您可以使用`WiFi.status()`函数检查连接状态。 6. 使用etharp_request()函数发送ARP请求。以下是一个示例代码片段: ```cpp #include void loop() { uint8_t ip[] = {192, 168, 1, 100}; // 目标IP地址 etharp_request(ip); delay(1000); } ``` |
|
|
|
只有小组成员才能发言,加入小组>>
179个成员聚集在这个小组
加入小组440 浏览 1 评论
1398 浏览 1 评论
608浏览 6评论
506浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
487浏览 5评论
489浏览 4评论
472浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 07:08 , Processed in 0.783737 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号