我有一个 ESP8266 设备,我正在使用 Arduino/C++ 对其进行编程。
我很感兴趣是否可以以某种方式发现与我的 ESP8266 位于同一网络上的设备。 在笔记本电脑上,我只是简单地收听 ARP 广播,但我不知道是否可以使用 ESP8266 SDK(或任何其他“hacky”方式)。
最佳答案
如果您对低级数据包感兴趣,您确实可以 Hook 网络接口(interface)的输入和输出功能。这取决于您希望如何完成设备发现。应该是吗
- 主动 ping 扫描 (
nmap -sn 192.168.0.0/24
) - 主动端口扫描 (
nmap -sS -p0-65000 192.168.0.0/24
) - 被动 ARP 扫描
- 所有的组合?
我假设您会采用被动 ARP 扫描技术。
我在 esp-open-rtos SDK 项目中已经完成的工作是 Hook 网络接口(interface)的输入和输出函数( esp_interface.c 、 low_level_output()
和 ethernetif_input( )
)。我还根据您在这些函数中获得的数据编写了一个数据包嗅探器(它在闪存中写出一个 .pcap
文件)。由于整个 lwIP 堆栈在 esp-open-rtos 内是开源的,因此 Hook IP 堆栈(尤其是 ARP 数据包功能,请参阅 lwip/src/netif/etharp.c!)非常容易,如果您想获得很快就能得到结果。
对于专有的 Espressif SDK,您可以将 ESP 置于混杂模式,并为其提供所有接收到的数据包的回调函数(wifi_promiscously_rx_cb
函数)。然后您可以根据需要分析这些数据包。重要的函数是 wifi_promiscously_enable(bool enable)
和 wifi_set_promiscously_rx_cb(wifi_promiscously_rx_cb)
。这些记录在官方 ESP-RTOS 文档中:https://espressif.com/sites/default/files/documentation/20b-esp8266_rtos_sdk_api_reference_v1.4.0_0.pdf (第 72 和 73 页)。然而,使用此 SDK,您无法连接到其 IP 堆栈,因此您确实必须预先进行数据包分析。
这两件事都很hacky,但是考虑到“我想听ARP广播”的本质,没有其他办法。其他方法可能是主动 ping 扫描,为此您必须使用 esp-open-rtos 中的 lwIP 或专有 Espressif SDK 中的其他 espconn
函数。
关于c - 发现网络上的设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41078982/