c - 发现网络上的设备

标签 c networking esp8266 arduino-esp8266

我有一个 ESP8266 设备,我正在使用 Arduino/C++ 对其进行编程。

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

最佳答案

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

  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 项目中已经完成的工作是 Hook 网络接口(interface)的输入和输出函数( esp_interface.clow_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/

相关文章:

c - ESP-WROOM-02D 无法使用 AT 命令进行通信

c - 为什么直接给出字符串和读取字符串时strlen返回不同的值?

sql - C 语言的 DB2 包

c - 读取访问中断: tree was 0xAE0A74BF

android - android中的局域网调用

mysql - 在 ESP8266 上使用 LUA 连接到 LAN 上的 MySQL 数据库

javascript - 谁能告诉我是否可以在 wemos d1 mini 上刷新 javascript 代码?

c - 在函数中使用两次时 strtol 函数的异常行为

python - 通过 localhost 访问时无法通过 ip 地址访问 django 应用程序

networking - 如何使用多项式/CRC在此二进制消息上运行错误检测?