MQTT – .NET Core 中的消息队列遥测传输协议





5.00/5 (14投票s)
如何在 .NET Core 应用程序中使用 MQTT 协议
引言
发布/订阅模式是实现解耦软件的常见需求。有多种技术和协议可供选择。在这篇文章中,我将向您展示如何使用 MQTT 协议在您的 .NET Core 应用程序中实现它。
什么是 MQTT
MQTT 是一种消息协议,具有“代码占用空间小,线路上占用空间小”的特点。MQTT 是一种基于发布/订阅的消息协议,构建在 TCP/IP 之上。
与 HTTP 的请求/响应模式相比,该协议使用**发布/订阅**架构。发布/订阅是事件驱动的,允许将消息推送到客户端。
中央通信点是**MQTT 代理 (broker)**,它负责在**发送者**和合适的**接收者**之间分发所有消息。
每个**发布**消息到代理的客户端,都会在消息中包含一个**主题 (topic)**。**主题是代理的路由信息。**
每个想要接收消息的客户端都会**订阅**某个主题,代理会将所有具有匹配主题的消息传递给该客户端。
因此,**客户端不必相互了解**,它们只通过主题进行通信。
这种架构支持高度可扩展的解决方案,而数据**生产者**和数据**消费者**之间没有依赖关系。
… REST 又如何呢?
- HTTP/REST 可用于处理文档和资源。
- MQTT 可用于处理消息。
- HTTP/REST 可能很复杂,并且不总是处理简单消息的最佳解决方案。
- MQTT 数据包大小为 2 字节 + 有效载荷。
- MQTT 支持一对一、一对多和多对多消息。
- 请求和响应 **vs** 发布者和订阅者。
架构
与 HTTP 的区别在于,客户端不必拉取所需信息,而是代理在有新信息时将其推送到客户端。
因此,每个 MQTT 客户端都与代理保持**永久打开的 TCP 连接**。如果由于任何原因中断了此连接,MQTT 代理可以缓冲所有消息,并在客户端恢复在线时将它们发送给客户端。
如前所述,MQTT 中分发消息的中心概念是主题。**主题是一个简单的字符串,可以有更多的层级,用斜杠分隔**。
发送客厅温度数据的示例主题可以是*house/living-room/temperature*。
一方面,客户端可以订阅确切的主题,另一方面可以使用通配符。订阅*house/+/temperature*将导致所有发送到先前主题*house/living-room/temperature*的消息,以及任何在 living room 位置具有任意值的匹配主题,例如,*house/kitchen/temperature*。
加号是**单级通配符**,只允许一个层级的任意值。如果您需要订阅多个级别,例如订阅整个子树,还有一个**多级通配符**(*#*)。它允许订阅所有底层层级。例如,*house/#*订阅所有以*house*开头的主题。
Payload(载荷)
- MQTT 对有效载荷是无关的。您可以使用以下任何一种
- 简单的字节数组
- 简单的字符串
- 或 JSON
**发布**到 **home/livingroom/light/1 message**
安全
- SSL/TLS 支持
- 用户名/密码
- 加密有效载荷(数据/有效载荷无关)
- 物联网安全不容小觑!
- SSL/TLS 是必备的
代码示例
我构建了一个示例 .NET Core 控制台应用程序来测试该库。以下是代码截图,它们是不言自明的,如有需要,您可以从 git 下载代码。如果有什么不清楚的地方,请在评论中告诉我。
该解决方案包含以下三个项目,所有项目都引用了 MQTTnet。一个应用程序充当发布者,另一个充当订阅者,第三个充当代理,以说明消息系统的主要模块。
代理 (Broker)
发布者和订阅者都连接到代理。
出版社
这是SimulatePublish
** **方法的代码
订阅者
执行
以下是运行解决方案的截图
>> 发布者和订阅者已连接到代理。
在这里,您可以看到发布者/订阅者和代理的运行情况
摘要
这是对 MQTT 及其用法的非常基础的介绍。为了保持讨论的简单性,我使用了最少的代码。发布者/订阅者模式非常强大,可以让我们轻松创建解耦的应用程序,并且使用 MQTTNet 库可以非常容易地在我们的应用程序中实现此模式。您可以从我 GitHub 仓库的代码源链接下载示例。我也建议查看参考资料中的链接以获得更多深入了解。下次再见,编码愉快。
Git 仓库链接
参考文献
- https://www.hivemq.com/blog/how-to-get-started-with-mqtt/
- https://github.com/chkr1011/MQTTnet/wiki/Client
历史
- 2020 年 10 月 19 日:初始版本