发现网络上的设备

Discovering devices on the network

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

如果有可能以某种方式发现与我的 ESP8266 在同一网络上的设备,我很感兴趣。 在笔记本电脑上,我只是简单地收听 ARP 广播,但我不知道 ESP8266 SDK (或任何其他 'hacky' 方式).[=10 是否可行=]

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

  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() and ethernetif_input()). I also wrote a packet sniffer based on the data you get inside these functions (it writes out a .pcap file in flash). Since the entire lwIP stack is open-source inside esp-open-rtos, hooking into the IP stack (and especially the ARP packet functions, see 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(第 72 和 73 页)的官方 ESP-RTOS 文档中。但是,使用此 SDK 您无法连接到其 IP 堆栈,因此您确实必须预先进行数据包分析。

这两个东西都是 hacky,但考虑到 "I want to listen to ARP broadcasts" 的性质,没有其他办法。其他方法可能是主动 ping 扫描,为此您必须在 esp-open-rtos 中使用 lwIP 或在专有的 Espressif SDK 中使用其他 espconn 函数。