乐鑫技术交流
直播中

李静

7年用户 1017经验值
私信 关注
[问答]

esp8266使用etharp_request() 的ARP请求异常怎么解决?

这是关于 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);


我在这个william hill官网 和谷歌上搜索了很长时间,以寻找这个问题的答案,但都失败了。有没有人有线索(甚至更好的是,一些有效的示例代码)可以帮助我做我所追求的事情?

回帖(1)

爱与友人

2024-7-10 17:41:42
要解决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);
}
```


举报

更多回帖

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