乐鑫技术交流
直播中

李伟

8年用户 1629经验值
私信 关注
[问答]

ESP8266收到重传的UDP数据包,则udp接收回调函数会调用两次,怎么解决?

我们使用 esp8266 开发了一个网格系统。

在所有开发完成时,我们发现了一个关键问题。

如果ESP8266收到重传的 UDP 数据包,则 udp 接收回调函数会调用两次。
(*. 收到两个 UDP 数据包的 payload 在回调函数中完全相同)

有几种方法可以解决这个问题。但是我们的应用程序解决方案需要一个大的内存池。

我认为这个问题应该在无线驱动程序中得到解决。


回帖(1)

孙成红

2024-7-18 17:57:31
在这种情况下,我们可以采取一些策略来解决ESP8266接收到重传的UDP数据包时,udp接收回调函数被调用两次的问题。以下是一些建议:

1. **检查数据包的唯一性**:
   在接收到UDP数据包时,我们可以检查数据包的唯一性。例如,我们可以在每个数据包中添加一个序列号或时间戳。在回调函数中,我们可以先检查接收到的数据包是否与上一个数据包相同。如果是相同的数据包,我们可以忽略它,只处理新的数据包。

2. **使用队列管理数据包**:
   我们可以在ESP8266上实现一个队列来管理接收到的UDP数据包。当接收到一个新数据包时,我们将其添加到队列中。在回调函数中,我们可以从队列中取出数据包并处理。这样可以确保每个数据包只被处理一次。

3. **使用定时器避免重复处理**:
   我们可以在回调函数中使用一个定时器来避免重复处理。当接收到一个新数据包时,我们启动一个定时器。如果在定时器超时之前再次接收到相同的数据包,我们可以忽略它。这样可以确保每个数据包只被处理一次。

4. **优化网络协议**:
   如果可能的话,我们可以尝试优化网络协议,以减少数据包重传的可能性。例如,我们可以使用更可靠的传输协议,如TCP,而不是UDP。虽然这可能会增加一些延迟,但它可以减少数据包重传的问题。

5. **调整ESP8266的网络参数**:
   我们可以尝试调整ESP8266的网络参数,以减少数据包重传的可能性。例如,我们可以增加数据包的超时时间,或者减少数据包的发送频率。这样可以减少数据包重传的概率,从而减少回调函数被调用两次的问题。

6. **使用更高级的无线驱动程序**:
   如果可能的话,我们可以尝试使用更高级的无线驱动程序,这些驱动程序可以更好地处理数据包重传的问题。这可能需要一些额外的开发工作,但它可以提供更好的性能和更少的问题。

7. **使用第三方库**:
   我们可以考虑使用一些第三方库来帮助处理数据包重传的问题。这些库可能已经实现了一些优化和解决方案,可以减少数据包重传的问题。

总之,解决ESP8266接收到重传的UDP数据包时,udp接收回调函数被调用两次的问题需要综合考虑多种策略。我们可以根据实际需求和资源限制,选择最适合我们的解决方案。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分