【问题标题】:Arduino Wifi rev2 lost UDP packet mitigationArduino Wifi rev2 丢失 UDP 数据包缓解
【发布时间】:2021-05-28 10:30:56
【问题描述】:

嗨,我有一个简单的 arduino wifi 程序,它等待 python 脚本发送的 UDP 命令。当 python 脚本发送一个命令包时,它需要一个确认包(在某些情况下还有一些返回的数据包)。所以基本上有两种命令。只需要一个确认包的 SET 命令,以及需要一个确认包 + 一个或多个数据包的 GET 命令。现在,从 python 脚本的角度来看,当命令包丢失时,会引发超时,python 脚本会在一小段延迟后再次尝试。目前,这不会对 GET 命令造成任何问题,因为更糟糕的是,arduino 会回复两次,而我会收到数据。但这可能会导致 SET 命令出现问题。 IE。 arduino 可以得到命令来切换 LED 两次(打开关闭)。我能做些什么来解决这个问题。我是否应该在 udp 数据包命令结构中添加一些帧,例如数据包计数器?接收方 arduino 需要知道是否丢失了圆顶数据包,并告诉 python 脚本重新启动它尝试执行的任何操作。

【问题讨论】:

    标签: arduino udp


    【解决方案1】:

    数据包可能会丢失或重复,这是 UDP 的本质。基本上,您有三个选择。

    1. 如果您需要可靠的数据传输,请使用提供它的协议。在您需要 TCP 提供的所有功能的情况下,使用 UDP 是一个糟糕的选择。所以切换到 TCP。

    2. 重新设计协议,使您不需要可靠的数据传输。例如,您的“切换 LED”命令可能包含一个序列号,如果切换序列与前一个匹配,则它会被忽略。所以你一遍又一遍地发送“toggle LED, sequence 2”,直到你得到确认,然后在你的下一个请求中,它是“toggle LED, sequence 3”。请注意,不仅数据包可能会丢失、重复或交错,响应也可能会丢失。这很容易搞砸。

    3. 实现可靠的数据传输。例如,每个请求可能包含一个序列号,并且您重复它,直到您获得具有相同序列的确认。只有这样才能进入下一个序列。也可以使用多数据报回复来执行此操作。这很痛苦,但这就是为您提供 TCP 的原因——因此您不必每次需要可靠的数据传输时都重新发明它。

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      相关资源
      最近更新 更多