MQTT学习从零到实战:一

1. 什么是MQTT?

        MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

2. MQTT的优点和应用范围

        最大优点:用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务

        应用范围:广泛应用于物联网、M2M通信、智能家居、工业自动化、智能交通、智能农业、环境监测等领域。例如,在智能家居领域,MQTT可以实现各种智能设备之间的互联互通和远程控制

3. MQTT订阅与发布

        MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。

        MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。

        提供了一对多的消息分发机制,从而实现与应用程序的解耦。

        MQTT 服务器是发布-订阅架构的核心。目前主流的MQTT服务器有:Eclipse Mosquitto、EMQ X、HiveMQ CE、VerneMQ(下一篇将基于EMQ X进行实战讲解)

        MQTT(Message Queuing Telemetry Transport)协议中的发布者、订阅者、代理和主题是其核心概念,它们共同构建了一个灵活且可扩展的消息传递系统。

发布者(Publisher)

发布者是MQTT协议中的消息发送方。它们负责创建并发布消息到MQTT代理(Broker)。发布者将消息发送到特定的主题(Topic),而不直接发送给特定的订阅者。这使得发布者无需知道哪些订阅者正在监听其发布的消息,从而实现了发布者和订阅者之间的解耦。

订阅者(Subscriber)

订阅者是MQTT协议中的消息接收方。它们向MQTT代理订阅感兴趣的主题,并接收该主题上发布的所有消息。订阅者可以根据需要订阅多个主题,以便接收来自不同源的消息。一旦订阅者接收到消息,它们可以根据自己的业务逻辑对消息进行处理。

代理(Broker)

MQTT代理是MQTT协议中的核心组件,负责在发布者和订阅者之间传递消息。代理接收发布者发送的消息,并根据订阅者的订阅信息将消息转发给相应的订阅者。代理还负责管理订阅关系,确保消息能够准确地发送给需要的订阅者。此外,代理还可以提供持久化存储功能,以便在订阅者离线时保存消息,并在订阅者重新上线时发送这些消息。

主题(Topic)

主题是MQTT协议中用于对消息进行分类的关键概念。它是一个UTF-8编码的字符串,可以包含多个层级关系(通过斜杠/表示)。发布者将消息发布到特定的主题,而订阅者则订阅感兴趣的主题以接收消息。主题的设计使得MQTT协议能够支持灵活的消息传递模式,允许不同的设备和应用程序通过共享的主题进行通信。

4. QoS(Quality of Service levels)

MQTT 协议中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,QoS 的设计是 MQTT 协议里的重点。

4.1 QoS 0 最多分发一次

这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1

4.2 QoS 1 至少分发一次

QoS 1 承诺消息将至少传送一次给订阅者。

4.3 QoS 2 只分发一次

使用 QoS 2,我们保证消息仅传送到目的地一次。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 级别 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流。

如何决定QoS?

MQTT 发布消息 QoS 保证不是端到端的,是客户端与服务器之间的。订阅者收到 MQTT 消息的 QoS 级别,最终取决于发布消息的 QoS 和主题订阅的 QoS。

5. MQTT 数据包结构

固定报头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。

可变报头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。

有效载荷(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容。

整体MQTT的消息格式如下图所示;

5.1 MQTT固定头

每个MQTT控制包都包含一个固定报头

 消息类型

 标识位(bit0~3)

DUP1: 控制报文的重复分发标志

QoS2:PUBLISH报文的服务质量等级

RETAIN3: PUBLISH报文的保留标志

  剩余长度

剩余长度是一个可变字节整数,表示当前控制报文中剩余的字节数,包括可变报头和有效载荷中的数据。

 可变报头

可变报头位于固定报头和有效载荷之间,可变报头的内容根据报文类型的不同而不同。通常都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

 有效载荷

Payload有效载荷位于MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型包含有效载荷。

CONNECT有效载荷内容主要是:客户端的ClientID、遗嘱主题、遗嘱Message以及用户名和密码。

SUBSCRIBE有效载荷内容是主题过滤器指明需要订阅的Topic以及QoS。

SUBACK有效载荷内容包含一个返回码清单,每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。UNSUBSCRIBE有效载荷内容是客户端想要取消订阅的主题过滤器。

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值