65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (14投票s)

2020年10月19日

CPOL

4分钟阅读

viewsIcon

35918

如何在 .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 仓库链接

参考文献

历史

  • 2020 年 10 月 19 日:初始版本
© . All rights reserved.