MQTT——具有.NET Core的消息队列遥测传输协议
2023-10-26 15:23 古兆洋 阅读(205) 评论(0) 编辑 收藏 举报转自:https://blog.csdn.net/mzl87/article/details/109910991
目录
介绍
发布/订阅模式是解耦软件的常见要求。有各种可用的技术和协议。在本文中,我将向您展示如何使用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存储库中下载示例。另外,我建议您检查参考链接以获取更多信息。