Arduino Wifi rev2丢失UDP数据包缓解

Arduino Wifi rev2丢失UDP数据包缓解,arduino,udp,Arduino,Udp,嗨,我有一个简单的arduino wifi程序,它等待python脚本发送UDP命令。当python脚本发送命令包时,它需要一个aknowledge包(在某些情况下还需要一些返回的数据包)。所以基本上有两种命令。设置只需要aknowledge数据包的命令,并获取需要aknowledge数据包+一个或多个数据包的命令。现在,从python脚本的角度来看,当一个命令包丢失时,会引发一个超时,python脚本会在一个小延迟后重试。目前,这不会导致GET命令出现任何问题,因为更糟糕的是,arduino会

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

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

  • 如果您需要可靠的数据传输,请使用提供该数据传输的协议。在需要TCP提供的所有功能的情况下,使用UDP是一个错误的选择。因此,切换到TCP

  • 重新设计协议,这样就不需要可靠的数据传输。例如,您的“切换LED”命令可能包含一个序列号,如果切换序列与上一个匹配,则忽略该序列号。所以你反复发送“切换LED,序列2”,直到你得到确认,然后在你的下一个请求中,它是“切换LED,序列3”。小心,不仅数据包可能丢失、重复或交错,而且响应也可能丢失。这很容易搞砸

  • 实现可靠的数据传输。例如,每个请求可能包含一个序列号,您可以重复该序列号,直到获得具有相同序列的确认。然后才进入下一个序列。对多数据报回复也要这样做。这是痛苦的,但这就是为什么提供TCP的原因——因此,您不必在每次需要可靠数据传输时都重新发明它