为什么我的 wifi 路由器延迟广播 UDP 数据包?

为什么我的 wifi 路由器延迟广播 UDP 数据包?

我在 Raspberry Pi 上运行了一个 Python 程序,该程序打开一个套接字来接收广播数据包(实际上是 ArtNet 照明协议)。Raspberry Pi 使用其内置的 wifi 连接到 D-link 无线路由器,我的 Mac 也连接到该路由器。路由器未连接到互联网或任何其他设备。它专用于此应用程序。

Pi <-> D-link 路由器 <-> Mac

一切都在物理上几米之内,所以信号强度很好。

树莓派代码:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("192.168.1.255", 6454))

问题是数据包(照明命令)有时会明显延迟。我认为 70% 的情况下似乎没有延迟,但其他时候延迟大约为半秒到 5-10 秒。

看起来路由器可能以某种方式丢弃数据包或延迟数据包。

我尝试使用家用互联网路由器,延迟频率和严重程度都大大降低。不确定那台路由器的品牌,因为它在另一所房子里。

我尝试通过以太网交换机切换到有线网络,问题完全消失。

然后我尝试通过 wifi 切换到单播,问题也消失了!通过 wifi 完美运行。但我有多个设备,无法在最终应用程序中使用单播。

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("192.168.1.101", 6454))

我查看了路由器中的设置,没有发现任何与处理广播数据包相关的内容。导致延迟或丢包的机制是什么?有没有什么方法可以修复它?

注意:已在 stackexchange 上发布,但有人建议我在此处发布,因为这更可能是配置问题:https://stackoverflow.com/questions/65387104/why-is-my-wifi-router-delaying-broadcast-udp-packets

答案1

我们遇到了与您描述的问题完全相同的问题,在同一领域(智能家居控制)。似乎某些 WiFi 路由器有此行为,而其他路由器则没有。这导致 UDP 广播无法用于控制目的。我们已检查,问题与源机器无关,也发生在 macOS 和 ESP32 上。

您的选择是:

  1. 将 WiFi“路由器”更换为其他型号。
  2. 重新配置路由器以消除广播延迟(如果有人了解如何针对特定路由器型号执行此操作,请告诉我们!)
  3. 改用单播。

对于使用单播,如果您 (a) 提前知道目标 IP 地址,或者 (2) 收到对广播数据包的回复或收到来自对等点的其他广播,则此方法可行。在后一种情况下,您可以在发现对等点 IP 时跟踪它们,然后进行循环,向每个对等点发送广播和单播。这假设您的协议 (ArtNet) 中有一些内置的重复数据删除功能,以避免重复操作。

相关内容