关于我在 TCP、UDP 和 MQTT 方面的经验的一些想法以及一些要审查的其他资源。
使用 UDP 我遇到了静默故障问题,其中一个网络节点(客户端)上的应用程序只能看到一些已发送的 UDP 消息。网络流量可能出错的原因太多了。UDP 的问题在于,只要数据包的生产者和数据包的消费者之间的网络路径中的任何节点允许,几乎都可以丢弃数据包。请参阅维基百科主题数据包丢失。
问题是无论当前网络环境如何,您的丢失率是多少。因此,如果这是 LAN 或子网内的通信,您的丢失率可能很低。在 WAN 或 Internet 上,您的丢失率可能很高。UDP 数据包由于多种原因被丢弃并进行路由,但是网络条件允许该跳数递减。在没有问责制的情况下将数据包发送到巨大的空隙中,可能会导致静默失败。
在您的情况下,听起来只是一个简单的 ack,在超时后重新传输而没有收到 ack 就足够了。
我已经通过维护的 TCP 连接完成了 XML 消息,并且效果很好。我有一个层将缓冲区中的每个消息都传递给应用程序层来处理。我使用 XML 来打包消息,其中包含用于消息开头的 XML 起始标记和用于了解何时收到整条消息的 XML 结束标记。
TCP 确实具有一些特性,例如数据包的顺序顺序、无重复,并且作为一种连接的传输机制意味着您知道另一端是否消失,尽管可能需要一段时间才能找到。尽管网络条件会导致 TCP 吞吐量变慢,但在普通条件下连接和断开连接会引入延迟但不会造成负担。
MQTT 是一种由网络传输层(通常为 TCP)传输的协议。MQTT 使用发布/订阅模型,因此没有消息存储。因此,当发布者发布消息时,如果订阅者当时未连接,那么当它连接时,它将看不到该消息。MQTT 几乎是实时的,我想这就是首字母缩略词的遥测部分的全部内容。我确实喜欢用于小消息的 MQTT,并且一直在使用 Mosquitto 通过 MQTT 对 JSON 有效负载进行一些实验。请参阅这篇文章使用 Mosquitto (MQTT)进行可靠的消息传递,其中包含 MQTT 和服务质量的概述。并查看这篇包含资源链接的简短文章,包括示例应用IoT – MQTT 发布和订阅者 C 代码。
我使用 JSON 文本和订阅者中的 SQLite3 数据库来存储消息的 MQTT 实验位于https://github.com/RichardChambers/raspberrypi/tree/master/mqtt尽管源代码是 C 语言并且非常混乱。
这是一个 13 分钟的视频#144 互联网协议:CoAP 与 MQTT、网络嗅探和准备宜家 Tradfri 黑客。这是一篇关于 CoAP 的有趣文章,受限应用协议:CoAP 是物联网的“现代”协议。CoAP 的总结如下:
早期采用者一致认为,受限应用协议非常适用于受限网络和设备。一些不太为人所知的事情:“在非常拥挤的无线网络(Wi-Fi 或蜂窝网络)上,CoAP 可以继续工作,而基于传输控制协议 (TCP) 的协议(如 MQTT)甚至无法完成握手, ”弗米拉德说。
这是因为与大多数其他物联网协议不同,CoAP 建立在 UDP 之上。换句话说,这意味着没有 TCP 遇到的协议握手或纠错。“CoAP 可能不像 HTTP 那样可靠,也不像 MQTT 那样保证消息的传递,但它非常快,”Matthieu 指出。“如果您对某些未收到的消息感到满意,您可以在同一时间范围内发送更多消息。”
还有一些其他的,例如 AMQP、STOMP 和 CBOR,您也可以看看。参见CBOR标准网站以及本论文,CBOR协议的实施和评估。请参阅这篇文章,选择您的消息传递协议:AMQP、MQTT 或 STOMP,其中比较和对比了 AMQP、MQTT 和 STOMP,并以关于 RabitMQ 代理的注释结尾:
希望这可以帮助许多人开始为您的每个用例导航协议汤。由于公司拥有许多具有不同需求的应用程序是很常见的,因此您当然可能需要跨不同应用程序的所有三个代理。这就是像 RabbitMQ 这样可靠的多协议、多语言代理的用武之地——因为它可以将 STOMP、MQTT 或 AMQP 发送进来,然后将其中一个发送出去。您不需要被这些协议中的任何一个锁定——RabbitMQ 代理都支持这三种协议,使其成为应用程序之间互操作性的理想选择。插件架构还使 RabbitMQ 能够在未来发展以支持这些协议的附加或更新版本。
这个包含约 60 张幻灯片的幻灯片共享包对四种不同的 IoT 协议进行了比较和对比,着眼于两个不同的 IoT 组(消费者和工业)的需求,它们对可靠性和稳健性有不同的需求。物联网的正确消息传递标准是什么?.