使用TCP/IP发送短消息的最简单方法

6

我通常使用硬连线的串口连接嵌入式设备,用于自定义命令/响应/状态协议。

在这个应用中,我计划使用Microchip TCP/IP堆栈和Wi-Fi模块没有操作系统来交换短(≤100字节)的命令和响应。

该堆栈已在Microchip以太网开发套件上运行,并且我可以从我的桌面ping它(尚未使用Wi-Fi模块)。

我想我可以入侵ping(Microchip为堆栈提供c源代码)并添加所需的消息,但我正在寻找正确/最简单/最佳的方法。


你好,出于好奇,你正在使用哪些硬件/工具包?因为我也对做类似的事情感兴趣。 - user475353
2个回答

6

正确/最简单/最好并不一定相同。但如果我是你,我会考虑使用UDP而不是TCP。

UDP是一种数据报协议;TCP是面向流的,并且具有更多的开销(和与开销相关的好处)。 但UDP更接近于您今天拥有的当前串行端口字节导向(分组导向)方法。

很可能您有一些更高级别的协议,该协议从UART接收/缓冲/校验/分隔/解析数据流。 如果您使用UDP,则可以使用精简,轻量级的UDP实现来很好地模拟此操作。 使用UDP,您只需射出字节(数据包)并祈祷它们到达另一端(非常类似于串行)。

TCP是一种较重的基于连接的协议,具有内置的重发,确认,按顺序传递,计时器,退避算法等。 在我使用TCP(几个不同的堆栈)的大多数嵌入式系统中,UDP比TCP更轻巧且在代码大小和吞吐量方面表现更佳。

还要记住,TCP用作Internet的骨干网络;一些数据包通过十几个或更多跳(路由器/网关)传递到最终目的地。 很多地方可以丢掉数据包,因此TCP可以透明地处理很多混乱的细节。 我猜在您的系统/情况下,我们正在谈论一个LAN(每个人都在同一条线上),传输将非常可靠...因此TCP开销并不是必需的。

有时TCP的好处使得开销合理,但根据您的写作,我认为您应该考虑基本的UDP数据报设置。 只需搜索“简单的UDP示例”,您就会看到基本结构。 例如,这里是一个简单的UDP客户端/服务器示例,只使用43行(服务器)和30行(客户端)。


有点错误的答案。UDP数据包丢失和乱序传递的风险与串行线路上的正常情况明显不同,而TCP更接近模拟这种情况。TCP主要问题是状态连接(正确实现重新连接)以及很难禁用客户端PC端的Nagle Ack延迟,这可能会在查询/响应通信中插入200ms的延迟。如果您无法容忍此问题,则在UDP上实现自己的可靠性层值得一试;如果可以,TCP将是串行的更直接的替代品。 - Chris Stratton
@Chris 在负载合理的交换网络上,UDP 是可以胜任的。一个简单的 ACK 数据包就能满足 Jack 需要的 99% 的情况。该产品已在全球范围内广泛安装,并且对无线电链路的容忍度更高。 - Tim Williscroft
你不能根据底层协议明确不保证的假设进行设计。如果你要使用UDP,无论在测试网络上看起来多么不可能,你都必须能够从丢失和错序的数据包中恢复。 - Chris Stratton

2
当你拥有一个TCP/IP堆栈时,应该提供一个send()函数来发送一些数据消息。
一些小型设备仅带有简单的UDP/IP实现,因为这要简单得多。如果您不需要TCP的序列控制和可靠性,可以考虑使用UDP发送短消息。这对于黑客ICMP消息更好。
但是,如果您需要TCP流协议的舒适性和可靠性,请勿在IUDP的基础上重新发明它。通常情况下,您无法做得更好、更有效,并且付出的努力更少。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接