MQTT——具有.NET Core的消息队列遥测传输协议

发布时间 2023-10-26 15:41:09作者: 古兆洋

转自:https://blog.csdn.net/mzl87/article/details/109910991

目录

介绍

什么是MQTT

REST是什么?

体系结构

有效载荷

安全

代码样例

代理

发布者

订阅者

执行

概要

Git存储库链接

参考文献


介绍

发布/订阅模式是解耦软件的常见要求。有各种可用的技术和协议。在本文中,我将向您展示如何使用MQTT协议在.NET Core应用程序中实现。

什么是MQTT

MQTT是一种消息协议,具有“较小的代码占用空间和在线占用空间”。MQTT是基于发布——订阅的消息传递协议,它建立在TCP/IP之上。

与具有请求/响应范例的HTTP相比,该协议使用发布/订阅体系结构。发布/订阅是事件驱动的,并允许将消息推送到客户端。

中央通信点是MQTT代理,它负责在发送方和合法接收方之间调度所有消息。

每个向代理发布消息的客户端都会在消息中包含一个主题。主题是代理的路由信息​​。

每个想要接收消息的客户端都订阅了某个主题,代理将具有匹配主题的所有消息传递给客户端。

因此,客户不必彼此了解,他们只需要就主题进行交流。

这种体系结构可实现高度可扩展的解决方案,而无需数据产生者和数据使用者之间的依赖。

REST是什么?

  • HTTP/REST对处理文档和资源很有用。
  • MQTT对于处理消息很有用。
  • HTTP/REST可能很复杂,并且并非总是简单消息的最佳解决方案。
  • MQTT数据包大小为2字节+有效负载。
  • MQTT支持一对一,一对多和多对多消息。
  • 请求和响应与发布者和订阅者。

体系结构

与HTTP的区别在于,客户端不必提取其所需的信息,但是如果有新内容,则代理会将信息推送到客户端。

因此,每个MQTT客户端都具有到代理的永久打开的TCP连接。如果此连接在任何情况下都中断,则MQTT代理可以缓冲所有消息并将其重新联机时发送给客户端。

如前所述,MQTT中用于分发消息的中心概念是主题。主题是一个简单的字符串,可以具有更多的层次结构级别,并用斜杠分隔。

用于发送客厅温度数据的示例主题可以是house/living-room/temperature

一方面,客户端可以订阅确切的主题,另一方面,可以使用通配符。订阅house/+/temperature将导致所有消息发送到前面提到的主题house/living-room/temperatur以及任何在客厅位置具有任意值的主题,例如 house/kitchen/temperature

加号是单级通配符,并且只允许一个层次结构使用任意值。如果您需要预订多个级别,例如整个子树,则还可以使用一个多级通配符(#)。它允许订阅所有基础层次结构级别。例如,house/#订阅以house开头的所有主题。

有效载荷

  • MQTT与负载无关。您可以使用以下任何一种:
    • 一个简单的字节数组
    • 一个简单的字符串
    • 或JSON

发布到home/livingroom/light/1消息

安全

  • SSL/TLS支持
  • 用户名/密码
  • 加密有效负载(与数据/有效负载无关)
  • 物联网的安全性不容小觑!!
  • SSL/TLS是必须具备的

代码样例

我已经构建了一个示例.NET Core控制台应用程序来测试该库。以下是代码屏幕截图,这些屏幕截图很容易解释,您可以根据需要从git下载代码。

该解决方案包含以下三个项目,所有项目都引用了MQTTnet。一个应用程序充当发布者,另一应用程序充当订阅者,第三应用程序充当代理,以说明消息传递系统的主要模块。

代理

发布者和订阅者都连接到代理。

发布者

 这是SimulatePublish 方法的代码:

订阅者

执行

以下是运行解决方案的屏幕截图:

>>发布者和订阅者与代理连接。

 在这里您可以看到发布者/订阅者和代理的实际行动:

概要

这是MQTT及其用法的非常基本的介绍。为了使讨论简单,我将代码保持在最低限度。发布者/订阅者模式非常强大,它使我们能够轻松创建解耦的应用程序,而MQTTNet库的使用使在我们的应用程序中实现此模式非常容易。您可以从下面的源代码链接上的git存储库中下载示例。另外,我建议您检查参考链接以获取更多信息。

Git存储库链接

参考文献