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不同,可以使用通配符匹配多个主题
而Publish中每个消息必须指定一个明确主题
订阅报文中的的QoS字段是代理向订阅者转发消息时能使用的最大等级, 如果超过这个QoS等级的消息也会转发,如果发送这种情况,消息也会转发,但是QoS会降级,比如订阅的时候请求的等级为1,发布者如果发布的为2等级,代理转发的时候会降级为1,如果发布者发布0或者1,因为没有超过请求者最大的QoS,会保持不变,相当于消息转发时候的QoS等级永远是消息发布时的QoS等级和订阅时候服务端授予的QoS等级这两者的最小值
订阅逻辑
订阅的时候同一个客户端使用相同主题的过滤器多次订阅时,新的订阅将覆盖旧的订阅,不会出现订阅失败和收到重复的消息,如果同一个客户端使用不同的主题过滤器进行订阅,不同的主题过滤器匹配到同一个主题时,每个订阅都将收到一次消息
订阅可能会失败,比如不具备主题的访问权限或者拒绝订阅,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完全的文本匹配
Unsubscribe报文同样也有UNSUBACK报文进行响应,但是在MQTT 3.1.1没有Reason Codes原因码确认是否成功, 在MQTT 5.0里面进行补充,有对应Reason Codes
MQTT-发布与订阅的报文的更多相关文章
- MQTT——发布报文
发布报文的知识点并不难,只是多.看过前面几章的读者们应该或多或少都认识服务质量QOS.发布报文跟他的联系最紧的.我们也清楚订阅报文里面虽然也有用到QOS,但是他却没有更进一步的联系.往下看就知道是什么 ...
- MQTT介绍(3)java模拟MQTT的发布,订阅
MQTT目录: MQTT简单介绍 window安装MQTT服务器和client java模拟MQTT的发布,订阅 在此强调一下mqtt的使用场景: 1.不可靠.网络带宽小的网络 2.运行的设备CPU. ...
- Android MQTT的发布与订阅
一.MQTT介绍 链接1(菜鸟教程):https://www.runoob.com/w3cnote/mqtt-intro.html 连接2(MQTT中文网):http://mqtt.p2hp.com/ ...
- MQTT 协议学习:002- 通信报文的构成
背景 之前工作中参与有关协议调试的时候,发现对于协议帧的解析是比较重要的. 参考:<MQTT协议 -- 消息报文格式>.<基于STM32实现MQTT>.<MQTT协议从服 ...
- 转MQTT--Python进行发布、订阅测试
前言 使用python编写程序进行测试MQTT的发布和订阅功能.首先要安装:pip install paho-mqtt 测试发布(pub) 我的MQTT部署在阿里云的服务器上面,所以我在本机上编写 ...
- (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...
- (原)3.2 Zookeeper应用 - 数据的发布与订阅
本文为原创文章,转载请注明出处,谢谢 数据的发布与订阅 1.应用 服务端监听数据改变,客户端创建/更新节点数据,客户端提供数据,服务端处理 2.原理 客户端监控节点数据改变事件(例如配置信息,下图的c ...
- MSSQL复制中的发布与订阅
准备条件 1.2台服务器 2.WINDOWS SERVER 2008 64bit + 3.SQL SERVER 2008 R2 + 4.MSSQLSERVER服务与MSSQLAGENT服务正常运行中 ...
- 知方可补不足~SQL2008中的发布与订阅模式
回到目录 作用:完成数据库与数据库的数据同步 原理:源数据库发布需要同时的表,存储过程,或者函数:目标数据库去订阅它,当源发生变化时,目标数据库自己同步,注意,由于这个过程是SQL自动完成的,所以要求 ...
- RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式被称为“ ...
随机推荐
- 设计模式 (Design Pattern)C# -- 简介
简介 设计模式(Design Pattern)是对面向对象设计中反复出现的问题的解决方案. 设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用. 设计模式是软件开发人员在软件开发过程 ...
- Python操作数据库读书笔记
SQLite 简介 什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.它是一个零配置的数据库,这意味着与其他数据库一样,您不需 ...
- C++ condition_variable
一.使用场景 在主线程中创建一个子线程去计数,计数累计100次后认为成功,并告诉主线程:主线程收到计数100次完成的信息后继续往下执行 二.条件变量的成员函数 wait:当前线程调用 wait() 后 ...
- 学习记录--C++多态性简答+编程题
#include<iostream> #include<string> //双目运算符:运算符作用域两个操作数 //定义一个复数类,重载"+",作为复数类的 ...
- ElasticSearch在linux环境安装和启动
1.下载 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-0 2.安装启动 2.1 错误1 Java HotSp ...
- Java学习小总结它又又又又来啦!
又到了输出总结的时候啦,话不多说,直接开始输出! 一.final final修饰符的主要作用就是强调它所修饰的板块的"最后"性: 若是修饰成员方法:那么成员方法不可以再被重写: 若 ...
- SpringBoot笔记--自动配置(高级内容)(上集)
原理分析 自动配置 Condition--增加的条件判断功能 来一个案例说明: 具体实现: 没有要求的话,就是这样的: Config.java User.java SpringLearnApplica ...
- wxml2canvas爬坑之路
效果图: 前提: 公司要求生成一分报告并转为图片并保存,之前用canvas画过,但这次是在不想用canvas一点点画了,再往上找了n久,爬了n多坑,终于搞出来了 插件: wxml2canvas 一:下 ...
- Linux & 标准C语言学习 <DAY2>
vim文本编辑器: 可以直接在终端下采用纯键盘操作的一款文本编辑器,号称编辑器之神,可以二次升级.可以扩展 基础用法: 1.进入vim: 输入 ...
- 53.cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
1.cin 用法1:最基本,也是最常用的用法,输入一个数字: #pragma warning(disable:4996) #define _CRT_SECURE_NO_WARNINGS 1 #incl ...



