首页 > 其他分享 >MQTT-发布与订阅的报文

MQTT-发布与订阅的报文

时间:2023-04-21 17:23:28浏览次数:34  
标签:订阅 QoS 报文 主题 MQTT 消息 客户端

MQTT发布订阅流程

在MQTT发布/订阅模式中,一个客户端既可以是发布者,也可以是订阅者,也可以同时具备这两个身份。当客户端发布一条消息时,它会被发送到代理,然后代理将消息路由到该主题的所有订阅者。当客户端订阅一个主题时,它会收到代理转发到该主题的所有消息

发布消息报文-Publish

客户端连接broker后就可以发布消息,发布消息需要用Publish报文

Publish报文基础字段:

  • Topic Name-必填

    • 字段类型:utf-8类型的字符串

    • 字段含义:指定发布消息的主题,一条消息只能指定一个主题,如果要发送给多个主题需要指定多条消息

  • QoS-必填

    • 字段类型:int
    • 字段含义:指定消息的服务质量等级,基础介绍中的QoS level 1、2、3
  • Payload-必填

    • 字段类型:binary(二进制)
    • 字段含义:用于指定消息的实际内容,MQTT作为二进制协议,payload可以是任何格式的协议,json、二进制、密文等
  • Retained-选填

    • 字段类型:bool
    • 字段含义:当前消息是否为保留消息
  • Packet ID

    • 唯一的标记一条消息,QOS为1或者2的时候固定出现
    • mqtt客户端内部实现,无需我们手动实现
  • DUP

    • 消息是否重发标识,QoS 1&2的时候固定出现
    • mqtt客户端内部实现,无需我们手动实现
订阅主题报文-Subscribe

订阅主题需要使用Subscribe报文,主要包含一个Packet ID 和Subscription List(订阅列表)

  • Packet ID

    用来唯一标识Subscribe报文以及匹配服务端返回的SUBACK的 Packet ID,无需手动设置

  • Subscription List

    订阅列表可以包含多个订阅,每个订阅有一个topic filter和 qos组成,可以通过Subscribe报文一次性订阅多个主题,Subscribe中主题过滤器和Publish中topic不同,可以使用通配符匹配多个主题image-20230421164020053

    而Publish中每个消息必须指定一个明确主题

    image-20230421164105024

    订阅报文中的的QoS字段是代理向订阅者转发消息时能使用的最大等级, 如果超过这个QoS等级的消息也会转发,如果发送这种情况,消息也会转发,但是QoS会降级,比如订阅的时候请求的等级为1,发布者如果发布的为2等级,代理转发的时候会降级为1,如果发布者发布0或者1,因为没有超过请求者最大的QoS,会保持不变,相当于消息转发时候的QoS等级永远是消息发布时的QoS等级和订阅时候服务端授予的QoS等级这两者的最小值

  • 订阅逻辑

订阅的时候同一个客户端使用相同主题的过滤器多次订阅时,新的订阅将覆盖旧的订阅,不会出现订阅失败和收到重复的消息,如果同一个客户端使用不同的主题过滤器进行订阅,不同的主题过滤器匹配到同一个主题时,每个订阅都将收到一次消息

image-20230421165634156

订阅可能会失败,比如不具备主题的访问权限或者拒绝订阅,broker会返回SUBACK报文返回订阅的结果,SUBACK报文中包含Subscribe报文一致的Packet ID,以及和订阅列表一一对应的Reason Codes

  • Reason Codes

    订阅结果的原因码

    0x00-订阅成功且最大QoS等级为0

    0x01-订阅成功且最大QoS等级为1

    0x02-订阅成功且最大QoS等级为2

    0x80-订阅失败

取消订阅报文-Unsubscribe

取消订阅报文与订阅报文类型,包含一个Packet ID 和一个期望取消的主题过滤器列表,想要取消的Topic filter 需要与实际订阅的 Topic filter完全的文本匹配image-20230421170525806

Unsubscribe报文同样也有UNSUBACK报文进行响应,但是在MQTT 3.1.1没有Reason Codes原因码确认是否成功, 在MQTT 5.0里面进行补充,有对应Reason Codes

标签:订阅,QoS,报文,主题,MQTT,消息,客户端
From: https://www.cnblogs.com/Mickey-7/p/17341131.html

相关文章

  • MQTT基础介绍
    MQTT与HTTP的区别HTTP协议是客户端与服务端直连请求与响应MQTT是基于发布订阅模型的轻量级的消息传输协议MQTT能力发布:Publish订阅:Subscribe代理:Broker,管理通信执行模式:客户端发送消息到broker,broker将消息发送给订阅过的客户端MQTT通信模式一对一:点对点通信......
  • 【汇智学堂】Dubbo注册中心-订阅/发布
    Dubbo注册中心-订阅/发布订阅与发布是整个注册中心的核心功能之一。在传统应用系统中,配置文件中配置需要变更时会修改配置文件,当服务节点数量不断上升时,就会有很多弊端。我们使用注册中心,解决该问题。当一个已有服务提供者节点下线,或者一个新的服务提供者节点加入微服务环境时,订阅......
  • MQTT报文分析
    一、问题引入MQTT属于应用层协议,基于TCP/IP架构实现,那么它的报文是如何定义的呢?或许可以像分析http协议那样,利用抓包工具:wireshark分析报文。二、解决过程......
  • 项目-mqtt阿里云传输图像,AD,10路输入,8路输出
     程序下载1,配置阿里云物联网平台参数 2,下载程序   3,正常运行阿里云物联网平台会显示设备在线  提示:上报开关量等数据设备发布的主题为: /a1ykoHAGGPL/${deviceName}/user/update上报摄像头数据设备发布的主题为:  /a1ykoHAGGPL/${deviceName}/use......
  • EMQX vs NanoMQ | 2023 MQTT Broker 对比
    引言EMQX和NanoMQ都是由全球领先的开源物联网数据基础设施软件供应商EMQ开发的开源MQTTBroker。EMQX是一个高度可扩展的大规模分布式MQTTBroker,能够将百万级的物联网设备连接到云端。NanoMQ则是专为物联网边缘场景设计的轻量级Broker。本文中我们将对EMQX和NanoMQ......
  • Redis高级 哈希类型、列表类型、集合类型、有序集合(zset)、慢查询、pipeline与事务
    哈希类型###1---hget,hset,hdelhgetkeyfield#获取hashkey对应的field的value时间复杂度为o(1)hsetkeyfieldvalue#设置hashkey对应的field的value值时间复杂度为o(1)hdelkeyfield#删除hashkey对应的field的值时间复杂度为o(1)#测试hsetuser:1:infoage......
  • 【Redis】哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitm
    目录昨日回顾今日内容1哈希类型2列表类型3集合类型4有序集合(zset)5慢查询6pipeline与事务7发布订阅8Bitmap位图9HyperLogLog作业昨日回顾#1redis介绍 -特性#速度快:10wops(每秒10w读写),数据存在内存中,c语言实现,单线程模型#持久化:rdb和aof#多种数据结......
  • redis 二、(哈希类型,列表类型,集合类型,有序集合,pipline机制,发布订阅,bitmap位图,HyperLogL
    目录Redis一、哈希类型二、列表类型三、集合类型四、有序集合五、慢查询六、pipline与事务七、发布订阅八、bitmap位图九、HyperLogLogRedis一、哈希类型###1---hget,hset,hdelhgetkeyfield#获取hashkey对应的field的value时间复杂度为o(1)hsetkeyfieldvalue#设......
  • tcp报文
    TCP报文详解_测试开发-海励的博客-CSDN博客_tcp报文1、介绍tcp,transmissioncontrolprotocol传输控制协议是一种传输层协议,向上为http/https等服务,向下由ip协议支持。2、数据格式(1)源端口,2字节(2)目的端口,2字节(3)序列号,4字节,表示本报文数据部分第一个字节的编号。在tcp连接中,......
  • udp报文
    1、介绍udp,userdatagramprotocol用户数据报协议,属于传输层协议。上层是dns等应用层协议,下层是ip协议。2、结构(1)源端口号,2字节(2)目标端口号,2字节(3)总长度,2字节,单位是字节(4)校验值,2字节,保证数据安全3、wireshark ......