MQTT(Message Queuing Telemetry Transport)是一种消息协议,它具有“小的代码占用和在线占用”的特点。MQTT基于TCP/IP构建,采用发布/订阅的消息传递架构,与传统的HTTP请求/响应模式不同。发布/订阅是一种事件驱动的架构,允许消息被推送给客户端。MQTT协议的中心通信点是MQTT代理(broker),它负责在发送者和接收者之间分发所有消息。
每个发布消息到代理的客户端都会在消息中包含一个主题(topic)。主题是代理的路由信息。任何想要接收消息的客户端都会订阅到某个主题,代理则将所有匹配该主题的消息传递给客户端。因此,客户端之间不需要相互了解,它们只通过主题进行通信。这种架构允许构建高度可扩展的解决方案,而不需要数据生产者和数据消费者之间的依赖。
HTTP/REST用于处理文档和资源,而MQTT用于处理消息。HTTP/REST可能很复杂,并不总是处理简单消息的最佳解决方案。MQTT的数据包大小为2字节加上有效载荷。MQTT支持一对一、一对多和多对多的消息传递。MQTT与HTTP的主要区别在于,客户端不需要拉取它需要的信息,而是代理将信息推送给客户端,如果有新信息的话。因此,每个MQTT客户端都与代理保持一个永久打开的TCP连接。如果这个连接由于任何原因被中断,MQTT代理可以缓冲所有消息,并在客户端重新上线时发送给客户端。
如前所述,MQTT中用于分发消息的中心概念是主题。主题是一个简单的字符串,可以有多个层级,层级之间用斜杠分隔。例如,发送客厅温度数据的主题可能是"house/living-room/temperature"。客户端可以订阅到确切的主题,或者使用通配符。订阅"house/+/temperature"将导致接收到之前提到的主题"house/living-room/temperature"的所有消息,以及任何客厅位置有任意值的主题,例如"house/kitchen/temperature"。加号是一个单层级通配符,只允许一个层级有任意值。如果需要订阅超过一个层级,例如整个子树,还有一个多级通配符(#)。它允许订阅所有下层级。例如,"house/#"订阅了所有以"house"开头的主题。
MQTT对有效载荷是不可知的。可以使用以下任何一种:
- 一个简单的字节数组
- 一个简单的字符串
- 或者一个JSON
MQTT支持SSL/TLS,用户名/密码以及加密有效载荷(数据/有效载荷不可知)。物联网安全不容忽视!SSL/TLS是必须的。
构建了一个.NET Core控制台应用程序来测试库。以下是代码截图,它们是自解释的,如果需要,可以从git下载代码。如果有什么不清楚的地方,请在评论中告诉。
解决方案包含三个项目,所有项目都引用了MQTTnet。一个应用程序作为发布者,另一个作为订阅者,第三个作为代理,以说明消息系统的主要模块。
代理:发布者和订阅者都连接到代理。
发布者:以下是SimulatePublish方法的代码:
// 这里是发布者代码示例
订阅者:以下是运行解决方案的截图:
// 这里是订阅者代码示例
执行:以下是发布者/订阅者和代理在行动的截图:
// 这里是执行代码示例