一文学会MQTT

简介

MQTT是什么?

MQTTMessage Queuing Telemetry Transport)是一种基于发布-订阅Publish-Subscribe)模式的轻量级通讯协议,采用客户端-代理Client-Broker)模型进行通信,基于TCP协议,属于应用层协议。

它最初由 IBM 在 1999 年开发,目前已成为物联网IoT)领域中最流行的通讯协议之一。

MQTT 的发布-订阅机制可以很轻易地满足我们一对一、一对多、多对一的通信需要。

发布-订阅模式是什么?

在 MQTT 中,发布-订阅模式是指消息的发布者/发送者(Publisher)和订阅者/接收者(Subscriber)之间的通讯方式。

发布-订阅模式与客户端-服务器模式的不同之处在于:发布者和订阅者之间无需建立直接连接,而是通过 MQTT 代理Broker) 来负责消息的路由和分发。

下图展示了 MQTT 发布-订阅过程。温度传感器作为客户端连接到 MQTT Broker,并通过发布操作将温度数据发布到一个特定主题(例如 Temperature)。MQTT Broker 接收到该消息后会负责将其转发给订阅了相应主题(Temperature)的订阅者客户端。

客户端-代理模型是什么?

客户端-代理模型指的是 MQTT 客户端(包括发布者和订阅者)与 MQTT 代理(Broker)之间的通讯模式。具体来说:

  • 客户端可以是发布者,也可以是订阅者,也可以同时具备这两个身份
  • 代理类似于服务器,负责接收发布者发布到特定主题的消息并转发给相应的订阅者

主题是什么?

主题Topic)是消息的分类或者话题,用唯一标识字符串来标识消息的内容或者类型。MQTT 协议根据主题来转发消息。

主题可以是层次结构的,使用正斜杠(/)进行分隔,类似于 URL 路径。例如weather/temperature是一个层次结构的主题,表示天气的温度信息。

MQTT 主题支持以下两种通配符:+#

  • +:表示单层通配符,例如 a/+ 匹配 a/xa/y
  • #:表示多层通配符,例如 a/# 匹配 a/xa/b/c/d

注意:通配符主题只能用于订阅,不能用于发布。

一个主题可以有多个订阅者,代理会将该主题下的消息转发给所有订阅者;一个主题也可以有多个发布者,代理将按照消息到达的顺序转发。

例如客户端A发布了一条消息 XXX 到特定的主题Topic),而客户端B客户端C订阅了这个主题。当客户端A发布消息到该主题时,客户端B和客户端C都会接收到这条消息。这样,客户端A作为发布者,而客户端B和客户端C作为订阅者,他们通过订阅相同的主题来实现消息的传递和接收。

$SYS/开头的主题为系统主题,系统主题主要用于获取 MQTT 服务器自身运行状态、消息统计、客户端上下线事件等数据。目前,MQTT 协议暂未明确规定$SYS/ 主题标准,但大多数 MQTT 服务器都遵循该标准建议。

例如,EMQX 服务器支持通过以下主题获取集群状态。

更多内容请参考:通过案例理解 MQTT 主题与通配符

QoS是什么?

MQTT定义了服务质量QoS(Quality of Service,)用于控制消息在不同网络环境下保证消息的可靠性。QoS 级别有三种:

  • 0:最低级别的 QoS,表示“最多传递一次”。消息发布者发布消息后,不会收到任何确认,也不保证消息会被准确地传递给订阅者。消息可能会丢失或者重复传递。消息最多传送一次。如果当前客户端不可用,它将丢失这条消息。
  • 1:中等级别的 QoS,表示“至少传递一次”。消息发布者发布消息后,会收到一个确认(PUBACK),但不保证消息只传递一次。消息可能会重复传递,但不会丢失。
  • 2:最高级别的 QoS,表示“只传递一次”。消息发布者发布消息后,会进行消息传递的完全确认,确保消息只传递一次给订阅者。这种级别的 QoS 保证了消息的完整性和精确性,但需要更多的网络带宽和资源。

MQTT协议的优缺点

优点 缺点
轻量级:协议简单、开销小,适合在资源受限的设备上使用。 消息传递不可靠:QoS 0 级别的消息可能会丢失,不适用于要求严格的消息传递可靠性的场景。
易于实现:提供了多种编程语言的客户端库,方便开发者进行应用程序开发。 不适用于大规模消息传输:在大量消息传输的场景下,可能会导致代理性能问题。
异步通讯:支持发布者和订阅者之间的异步通讯,提高了系统的灵活性和响应速度。 安全性限制:默认情况下,MQTT 不提供消息加密和身份验证,需要额外的安全措施来保护通讯安全。
与HTTP相比
  • HTTP 报文相较与 MQTT 需要占用更多的网络开销
  • HTTP 是一种无状态协议,服务器在处理请求时不会记录客户端的状态,也无法实现从连接异常断开中恢复
  • 请求-响应模式需要通过轮询才能获取数据更新,而 MQTT 通过订阅即可获取实时数据更新
  • MQTT 5.0 增加了请求-响应特性,以实现订阅者收到消息后向某个主题发送应答,发布者收到应答后再进行后续操作
与消息队列相比
  • MQTT 主题不需要提前创建。MQTT 客户端在订阅或发布时即自动的创建了主题,开发者无需再关心主题的创建,并且也不需要手动删除主题

使用场景

  • 物联网(IoT)应用程序中的设备通讯和数据传输。如手机控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值