一文读懂物联网 MQTT 协议之基础特性篇

本文探讨了在面向对象编程中基于类型的消息过滤,以及MQTT与消息队列的区别,重点介绍了MQTT的重要概念如MQTTClient、MQTTBroker、连接机制和消息类型。对比了MQTT与传统消息队列在消息存储、消费、主题管理和权限控制上的异同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 基于类型的过滤

当使用面向对象的语言时,基于消息(事件)的类型/类进行过滤是一种常见做法。例如,订阅者可以收听所有类型为 Exception 或任何子类型的消息。

2.5 MQTT 与消息队列的区别

这里你又会说了,既然 MQTT 与主流的消息的队列都采用发布/订阅模式,那他们就是一样的。这里老周得再提一嘴,确实和消息队列很多相似的地方,但还有有些差异的,下面就来说道说道:

  • 消息队列存储消息直到消息被消费 使用消息队列时,每条传入消息都存储在队列中,直到被客户端(通常称为消费者)接收。如果没有客户端接收到消息,消息将保持在队列中并等待被消费。在消息队列中,不会存在消息没有客户端消费的情况,但是在 MQTT 中,却存在 topic 无 subscriber 订阅的情况。

  • 一条消息只被一个客户端消费 另一个很大的区别是,在传统的消息队列中,一条消息只能被一个消费者处理。负载分布在队列的所有消费者之间。在 MQTT 中,行为完全相反:订阅主题的每个订阅者都会收到消息,每个订阅者有相同的负载。

  • 队列是命名的,必须显式创建 队列比主题严格得多。在使用队列之前,必须使用单独的命令显式创建队列。只有在队列命名和创建之后,才可以发布或消费消息。相比之下,MQTT 主题非常灵活,可以即时创建。

三、MQTT 重要概念


3.1 MQTT Client

publisher 和 subscriber 都属于 MQTT Client,之所以有发布者和订阅者这个概念,其实是一种相对的概念,就是指当前客户端是在发布消息还是在接收消息,发布和订阅的功能也可以由同一个 MQTT Client 实现。

MQTT 客户端是运行 MQTT 库并通过网络连接到 MQTT 代理的任何设备(从微控制器到成熟的服务器)。例如,MQTT 客户端可以是一个非常小的、资源受限的设备,它通过无线网络进行连接并具有一个最低限度的库。基本上,任何使用 TCP/IP 协议使用 MQTT 设备的都可以称之为 MQTT Client。MQTT 协议的客户端实现非常简单直接,易于实施是 MQTT 非常适合小型设备的原因之一。MQTT 客户端库可用于多种编程语言。例如,Android、Arduino、C、C++、C#、Go、iOS、Java、JavaScript 和 .NET。

3.2 MQTT Broker

与 MQTT Client 对应的就是 MQTT Broker,Broker 是任何发布/订阅协议的核心,根据实现的不同,代理可以处理多达数百万连接的 MQTT Client。

Broker 负责接收所有消息,过滤消息,确定是哪个Client 订阅了每条消息,并将消息发送给对应的 Client,Broker 还负责保存会话数据,这些数据包括订阅的和错过的消息。Broker 还负责客户端的身份验证和授权。

3.3 MQTT Connection

MQTT 协议基于 TCP/IP。客户端和代理都需要有一个 TCP/IP 协议支持。

在这里插入图片描述

MQTT 连接始终位于一个客户端和代理之间。客户端从不直接相互连接。要发起连接,客户端向代理发送 CONNECT 消息。代理使用 CONNACK 消息和状态代码进行响应。建立连接后,代理将保持打开状态,直到客户端发送断开连接命令或连接中断。

在这里插入图片描述

四、消息列表


4.1 CONNECT<

### 解决MQTT消息队列堵塞问题的方法 #### 一、优化QoS设置 调整MQTT的消息服务质量(Quality of Service, QoS)。对于实时性要求不高的场景,可以考虑降低QoS级别。例如,在某些情况下,使用QoS0代替QoS1或2能够减少确认机制带来的额外开销,从而缓解因过多未完成的传输请求造成的阻塞现象[^1]。 #### 二、增加Broker处理能力 当单个MQTT Broker无法满足大量并发连接的需求时,可以通过集群部署来扩展系统的吞吐量支持更多的设备接入。此外,还可以通过水平扩展的方式提升整个平台的服务性能,确保即使在网络流量高峰期也能稳定运行。 #### 三、合理配置持久化存储策略 针对可能出现的数据积压情况,应仔细规划并实施有效的持久化方案。这不仅涉及到选择合适的数据库作为后台支持,还包括设定恰当的时间窗口以及清理过期记录等措施,防止不必要的历史数据占用宝贵的资源空间而影响当前业务流程效率。 #### 四、实现负载均衡与故障转移功能 为了进一步提高系统的可靠性可用性,建议引入专业的负载均衡器负责分发来自客户端的新建会话请求;同时建立冗余节点以便于发生异常状况时快速切换至备用实例继续提供服务,最大限度地保障通信链路畅通无阻。 ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") client = mqtt.Client() client.on_connect = on_connect # 设置遗嘱消息,用于通知其他订阅者本机已离线 client.will_set("/status", payload="offline", qos=0, retain=True) try: client.connect("broker.hivemq.com", 1883, 60) except Exception as e: print(e) finally: client.loop_start() # 启动网络循环 ``` 上述代码展示了如何利用Python中的`paho-mqtt`库创建一个简单的MQTT客户端应用程序,并设置了遗嘱消息以增强健壮性。实际应用中可根据具体需求调整参数配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值