发现网络上的设备
Discovering devices on the network
我有一个 ESP8266 设备,我正在用 Arduino/C++ 编程。
如果有可能以某种方式发现与我的 ESP8266 在同一网络上的设备,我很感兴趣。
在笔记本电脑上,我只是简单地收听 ARP 广播,但我不知道 ESP8266 SDK (或任何其他 'hacky' 方式).[=10 是否可行=]
如果您对低级数据包感兴趣,您确实可以挂钩网络接口的输入和输出函数。这取决于您希望如何完成设备发现。应该是
- 一个活跃的 ping 扫描(
nmap -sn 192.168.0.0/24
)
- 主动端口扫描(
nmap -sS -p0-65000 192.168.0.0/24
)
- 被动 ARP 扫描
- 所有的组合?
我假设您将使用被动 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
函数。
我有一个 ESP8266 设备,我正在用 Arduino/C++ 编程。
如果有可能以某种方式发现与我的 ESP8266 在同一网络上的设备,我很感兴趣。 在笔记本电脑上,我只是简单地收听 ARP 广播,但我不知道 ESP8266 SDK (或任何其他 'hacky' 方式).[=10 是否可行=]
如果您对低级数据包感兴趣,您确实可以挂钩网络接口的输入和输出函数。这取决于您希望如何完成设备发现。应该是
- 一个活跃的 ping 扫描(
nmap -sn 192.168.0.0/24
) - 主动端口扫描(
nmap -sS -p0-65000 192.168.0.0/24
) - 被动 ARP 扫描
- 所有的组合?
我假设您将使用被动 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
函数。