1

我有一个 ESP8266 设备,我正在用 Arduino/C++ 编程。

如果有可能以某种方式发现与我的 ESP8266 在同一网络上的设备,我很感兴趣。在笔记本电脑上,我只会收听 ARP 广播,但我不知道是否可以使用 ESP8266 SDK (或任何其他“hacky”方式)

4

1 回答 1

2

如果您对低级数据包感兴趣,您确实可以挂钩网络接口的输入和输出功能。这取决于您希望如何完成设备发现。应该是

  1. 主动 ping 扫描 ( nmap -sn 192.168.0.0/24)
  2. 主动端口扫描 ( nmap -sS -p0-65000 192.168.0.0/24)
  3. 被动 ARP 扫描
  4. 所有的结合?

我假设您将使用被动 ARP 扫描技术。

我在 esp-open-rtos SDK 项目中已经做的是挂钩网络接口(esp_interface.c和)的输入low_level_output()和输出函数。我还根据您在这些函数中获得的数据编写了一个数据包嗅探器(它在闪存中ethernetif_input()写出一个文件)。.pcap由于整个 lwIP 堆栈在 esp-open-rtos 中是开源的,因此连接到 IP 堆栈(尤其是 ARP 数据包功能,请参阅lwip/src/netif/etharp.c!)非常容易,我建议使用它如果您想快速获得结果,请使用 SDK。

对于专有的 Espressif SDK,您可以将您的 ESP 置于混杂模式,并wifi_promiscuous_rx_cb为所有接收到的数据包提供一个回调函数(一个函数)。然后,您可以根据需要分析这些数据包。重要的函数是wifi_promiscuous_enable(bool enable)wifi_set_promiscuous_rx_cb(wifi_promiscuous_rx_cb)。这些记录在https://espressif.com/sites/default/files/documentation/20b-esp8266_rtos_sdk_api_reference_v1.4.0_0.pdf的官方 ESP-RTOS 文档中(第 72 和 73 页)。但是,使用此 SDK,您无法连接到其 IP 堆栈,因此您必须预先进行数据包分析。

这两件事都很hacky,但鉴于“我想听ARP广播”的性质,没有其他办法。其他方法可能是主动 ping 扫描,为此您必须使用 esp-open-rtos 中的 lwIP 或专有espconnEspressif SDK 中的其他功能。

于 2016-12-10T21:27:34.473 回答