MQTT 协议学习:006-订阅主题

背景

之前我们提到了怎么发布消息对应的报文;现在我们来看,订阅一个主题的报文是怎么样的。

SUBSCRIBE - 订阅主题

客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。为了将应用消息转发给与那些订阅匹配的主题,服务端发送PUBLISH报文给客户端。SUBSCRIBE报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个发送应用消息给客户端。

SUBSCRIBE 的 固定报头

Bit 7 6 5 4 3 2 1 0
byte 1 MQTT控制报文类型 (0x8) 保留位(0x2)
1 0 0 0 0 0 1 0
byte 2 剩余长度

SUBSCRIBE控制报固定报头的第3,2,1,0位是保留位,必须分别设置为0,0,1,0。服务端必须将其它的任何值都当做是不合法的并关闭网络连接。
剩余长度字段 等于可变报头的长度(2字节)加上有效载荷的长度。

SUBSCRIBE 的 可变头

SUBSCRIBE 的 可变头 中只有 报文标识符(Packet Identifier) 这一个字段。

报文标识符(Packet Identifier) 占用2个字节。没什么新的知识点,这里不再介绍。

SUBSCRIBE 的 有效荷载

SUBSCRIBE报文的有效载荷必须包含至少一对主题过滤器QoS等级字段组合

每一个过滤器后面跟着一个字节,这个字节被叫做 服务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的最大QoS等级。

主题过滤器列表:表示客户端想要订阅的主题。

SUBSCRIBE报文有效载荷中的主题过滤器列表必须是UTF-8字符串。服务端应该支持包含通配符(4.7.1节定义的)的主题过滤器。如果服务端选择不支持包含通配符的主题过滤器,必须拒绝任何包含通配符过滤器的订阅请求。

请求的最大服务质量等级字段编码为一个字节,它后面跟着UTF-8编码的主题名,那些主题过滤器 /和QoS等级组合是连续地打包。

图例 3.22 – SUBSCRIBE报文有效载荷格式
? ?

描述 7 6 5 4 3 2 1 0
主题过滤器
byte 1 长度 MSB
byte 2 长度 LSB
byte 3..N 主题过滤器(Topic Filter)
服务质量要求(Requested QoS)
保留位 服务质量等级
byte N+1 0 0 0 0 0 0 X X

当前版本的协议没有用到服务质量要求(Requested QoS)字节的高六位。如果有效载荷中的任何位是非零值,或者QoS不等于0,1或2,服务端必须认为SUBSCRIBE报文是不合法的并关闭网络连接 [MQTT-3-8.3-4]。

有效载荷非规范示例

图例 3.23 – 有效载荷字节格式非规范示例 展示了 表格 3.5 – 有效载荷非规范示例 中简略描述的SUBSCRIBE报文的有效载荷。

表格 3.5 – 有效载荷非规范示例
主题名 “a/b”
服务质量要求 0x01
主题名 “c/d”
服务质量要求 0x02
图例 3.23 – 有效载荷字节格式非规范示例
描述 7 6 5 4 3 2 1 0
主题过滤器(Topic Filter)
byte 1 Length MSB (0) 0 0 0 0 0 0 0 0
byte 2 Length LSB (3) 0 0 0 0 0 0 1 1
byte 3 ‘a’ (0x61) 0 1 1 0 0 0 0 1
byte 4 ‘/’ (0x2F) 0 0 1 0 1 1 1 1
byte 5 ‘b’ (0x62) 0 1 1 0 0 0 1 0
服务质量要求(Requested QoS)
byte 6 Requested QoS(1) 0 0 0 0 0 0 0 1
主题过滤器(Topic Filter)
byte 7 Length MSB (0) 0 0 0 0 0 0 0 0
byte 8 Length LSB (3) 0 0 0 0 0 0 1 1
byte 9 ‘c’ (0x63) 0 1 1 0 0 0 1 1
byte 10 ‘/’ (0x2F) 0 0 1 0 1 1 1 1
byte 11 ‘d’ (0x64) 0 1 1 0 0 1 0 0
服务质量要求(Requested QoS)
byte 12 Requested QoS(2) 0 0 0 0 0 0 1 0

原文地址:https://www.cnblogs.com/schips/p/12272372.html

时间: 2024-10-09 16:10:41

MQTT 协议学习:006-订阅主题的相关文章

MQTT协议学习及实践(Linux服务端,Android客户端的例子)

前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景.本文旨在研究其在消息发布/订阅/接收场景下的应用. MQTT协议中的几个重要概念 服务端 是发送消息的客户端和请求订阅的客户端之间的中介,又称

MQTT协议笔记之订阅

前言 记忆不太好的时候,只能翻看以前的文章/笔记重新温习一遍,但找不到MQTT协议有关订阅部分的描述,好不容易从Evernote中找到贴出来,这样整个MQTT协议笔记,就比较齐全了. SUBSCRIBE 一般来讲,客户端在成功建立TCP连接之后,发送CONNECT消息,在得到服务器端授权允许建立彼此连接的CONNACK消息之后,客户端会发送SUBSCRIBE消息,订阅感兴趣的Topic主题列表(至少一个主题),一个完整示范如下:   Description 7 6 5 4 3 2 1 0 Fix

MQTT 协议学习:001-有关概念入门

背景 MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议" 概念 MQTT是机器对机器(M2M)/物联网(IoT)连接协议.它被设计为一个极其轻量级的发布/订阅消息传输协议.对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽.高延迟或不可靠的网络而设计.这些原则也使该协议成为新兴的"机器到机器"(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择.例如,它已被用于通过卫星链路与

MQTT 协议学习:Retained(保留消息) 和LWT(最后遗嘱)

背景导入 让我们来看一下这个场景: 你有一个温度传感器,它每三个小时向一个 Topic 发布当前的温度.那么问题来了,有一个新的订阅者在它刚刚发布了当前温度之后订阅了这个主题,那么这个订阅端什么时候能才能收到温度消息? 对的,它必须等到三个小时以后,温度传感器再次发布消息的时候才能收到.在这之前,这个新的订阅者对传感器的温度数据一无所知. 怎么来解决这个问题呢? 这个时候就轮到 Retained 消息出场解决这个问题了.Retained 消息是指在 PUBLISH 数据包中 Retain 标识设

MQTT 协议学习:Keep Alive 和连接保活

(2020-02-05 10:30) 我们提到过 Broker 需要知道 Client 是否非正常地断开了和它的连接,以发送遗愿消息.实际上 Client 也需要能够很快地检测到它失去了和 Broker 的连接,以便重新连接. MQTT 协议是基于 TCP 的一个应用层协议,理论上 TCP 协议在丢失连接时会通知上层应用,但是 TCP 有一个半打开连接的问题(half-open connection).这里我不打算深入分析 TCP 协议,需要记住的是,在这种状态下,一端的 TCP 连接已经失效,

MQTT 协议学习:002-使用MQTT示例源码构建最简单的demo在STM32上移植MQTT协议

前言 通过上一章:<>,我们明确了MQTT的有关概念. 本文参考:STM32+W5500+MQTT+Android实现远程数据采集及控制 现在我们就来进行移植. MQTT代码源码下载地址: http://www.eclipse.org/paho/ 在STM32这边我们使用的是C/C++ MQTT Embedded clients代码. 原文地址:https://www.cnblogs.com/schips/p/12255092.html

MQTT协议-----订阅

MQTT协议笔记之订阅      http://www.blogjava.net/yongboy/archive/2014/04/12/412351.html MQTT - chszs的专栏    http://blog.csdn.net/chszs/article/category/6262440 MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例    http://blog.csdn.net/shayuye/article/details/17590497

MQTT协议

简介: MQTT协议(Message Queuing Telemetry Transport),翻译过来就是遥信消息队列传输,是IBM公司于1999年提出的,现在最新版本是3.1.1.MQTT是一个基于TCP的发布订阅协议,设计的初始目的是为了极有限的内存设备和网络带宽很低的网络不可靠的通信,非常适合物联网通信. MQTT的网络层级 工作原理: 发布订阅示意图 如上图所示,客户端A连接到消息代理(message broker),消息代理返回确认消息.客户B发布消息温度25度,客户A订阅‘温度’,

MQTT协议-MQTT协议简介及协议原理

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布.MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务.做为一种低开销.低带宽占用的即时通讯协议,使其在物联网.小型设备.移动应用等方面有较广泛的应用. MQTT协议特点 MQTT协议原理 2.1 MQTT协