MQTT协议详解 二、MQTT控制包格式
文章目录
- 系列文章目录
- 前言
- 一、MQTT控制包格式
- 二、固定包头
- 控制包类型
- 控制包类型标识
- 剩余长度
- 三、可变包头
- 数据包标识
- 四、载荷
系列文章目录
MQTT协议详解 一、MQTT简介
MQTT协议详解 二、MQTT控制包格式
MQTT协议详解 三、MQTT控制包(CONNECT)
前言
本章接详细介绍MQTT的控制包数据组成。
一、MQTT控制包格式
MQTT控制包由一下三个部分组成
顺序 | 名称 | 描述 |
---|---|---|
1 | 固定包头 | 所有MQTT包中 |
2 | 可变包头 | 某些MQTT包中 |
3 | 载荷 | 某些MQTT包中 |
二、固定包头
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
byte1 | 控制包类型 | 控制包类型标识 | ||||||
byte2 | 剩余长度 |
控制包类型
位置:第一个字节
名称 | 值 | 传输方向 | 描述 |
---|---|---|---|
Reserved | 0 | 保留 | |
CONNECT | 1 | 客户端 --> 服务端 | 客户端连接请求 |
CONNACK | 2 | 服务端 --> 客户端 | 服务器响应客户端连接请求 |
PUBLISH | 3 | 客户端 --> 服务端 OR 服务端 --> 客户端 | 发布消息 |
PUBACK | 4 | 客户端 --> 服务端 OR 服务端 --> 客户端 | 发布消息响应 |
PUBREC | 5 | 客户端 --> 服务端 OR 服务端 --> 客户端 | 发布消息到达 (交付第一步 ) |
PUBREL | 6 | 客户端 --> 服务端 OR 服务端 --> 客户端 | 发布消息释放 (交付第二步) |
PUBCOMP | 7 | 客户端 --> 服务端 OR 服务端 --> 客户端 | 发布消息完成 (交付第三步) |
SUBSCRIBE | 8 | 客户端 --> 服务端 | 客户端订阅请求 |
SUBACK | 9 | 服务端 --> 客户端 | 服务器响应客户端订阅请求 |
UNSUBSCRIBE | 10 | 客户端 --> 服务端 | 取消订阅请求 |
UNSUBACK | 11 | 服务端 --> 客户端 | 响应取消订阅请求 |
PINGREQ | 12 | 客户端 --> 服务端 | 心跳请求 |
PINGRESP | 13 | 服务端 --> 客户端 | 心跳响应 |
DISCONNECT | 14 | 客户端 --> 服务端 | 客户端断开连接 |
Reserved | 15 | 保留 |
控制包类型标识
控制包类型 | 固定标志 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|
CONNECT | 保留 | 0 | 0 | 0 | 0 |
CONNACK | 保留 | 0 | 0 | 0 | 0 |
PUBLISH | 根据实际传输情况设置 | DUP | QoS | QoS | RETAIN |
PUBACK | 保留 | 0 | 0 | 0 | 0 |
PUBREC | 保留 | 0 | 0 | 0 | 0 |
PUBREL | 保留 | 0 | 0 | 1 | 0 |
PUBCOMP | 保留 | 0 | 0 | 0 | 0 |
SUBSCRIBE | 保留 | 0 | 0 | 1 | 0 |
SUBACK | 保留 | 0 | 0 | 0 | 0 |
UNSUBSCRIBE | 保留 | 0 | 0 | 1 | 0 |
UNSUBACK | 保留 | 0 | 0 | 0 | 0 |
PINGREQ | 保留 | 0 | 0 | 0 | 0 |
PINGRESP | 保留 | 0 | 0 | 0 | 0 |
DISCONNECT | 保留 | 0 | 0 | 0 | 0 |
DUP = 重复发送PUBLISH包
QoS = PUBLISH包消息质量
RETAIN = PUBLISH 保留标识
剩余长度
位置:第二个字节
剩余长度是指当前包中的剩余字节,包括可变包头的数据以及载荷。剩余长度不包含用来编码剩余长度的字节。
剩余长度怎么计算呢?说实话,我看了官方的描述很懵逼。但是看代码后就很清晰了。
占用字节 | 起始数值 | 结束数值 |
---|---|---|
1 | 0(0x00) | 127(0x7F) |
2 | 128(0x80, 0x01) | 16383(0xFF,0x7F) |
3 | 16384(0x80,0x80,0x01) | 2097151(0xFF,0xFF,0x7F) |
4 | 2097152(0x80, 0x80,0x80,0x01) | 268435455(0xFF,0xFF,0xFF,0x7F) |
下面是编码部分代码,可以直接放在—》C语言在线编辑器上试一下
#include <stdio.h>int main(void) { int encodedByte = 0;int X = 2097152;//想要进行编码的长度int index = 1;do{encodedByte = X % 128;X = X / 128;if ( X > 0 )encodedByte = encodedByte | 128;printf("编码第%d字节=%X(HEX)\n",index++,encodedByte); }while ( X > 0 );return 0;
}
接下来是解码部分代码,也可以在—》C语言在线编辑器上试一下
#include <stdio.h>int main(void) { int multiplier = 1;int buff[4] = {0x80,0x80,0x80,0x01};int value = 0; int temp = 0;int index = 0;do{temp = buff[index++];//index先运算,再累加value += ( temp & 127) * multiplier;multiplier *= 128;}while((temp & 128) != 0 );printf("MQTT控制包长度%d字节",value);return 0;
}
三、可变包头
某些类型的MQTT控制包包含一个可变包头结构。位于固定包头和载荷之间。可变包头的内容取决于包的类型。可变包头中的包标识符字段在大多类型的包中比较常见。
数据包标识
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
byte1 | 包标识最高有效位 | |||||||
byte2 | 包标识最低有效位 |
许多控制数据包类型的可变报头组件都包含一个2字节的数据包标识符字段。这些控制数据包是PUBLISH(QoS> 0),PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE和UNSUBACK。
SUBSCRIBE,UNSUBSCRIBE和PUBLISH(在QoS> 0的情况下)控制包必须包含一个非零的16位包标识符 。每当客户端发送一个新的数据包(以上四种类型)时,客户端必须给该数据包分配一个当前未使用的数据包标识符。如果客户端重新发送一个特定的控制包,则它必须在该包的后续重新发送中使用相同的包标识符。在客户端处理了相应的确认数据包后,数据包标识符就可以重用。在QoS 1 PUBLISH的情况下,这是对应的PUBACK;在QoS 2的情况下,它是PUBCOMP。对于SUBSCRIBE或UNSUBSCRIBE,它是对应的SUBACK或UNSUBACK 。 当服务器发送QoS> 0 的PUBLISH时,同样的条件也适用于服务器。
如果其QoS值设置为0,则PUBLISH数据包不得包含数据包标识符。因为Qos=0时,是不会得到响应的。
PUBACK,PUBREC或PUBREL数据包必须包含与最初发送的PUBLISH数据包相同的数据包标识符。类似地,SUBACK和UNSUBACK必须包含分别在相应的SUBSCRIBE和UNSUBSCRIBE数据包中使用的数据包标识符。
控制包类型 | 是否包含标识符字段 |
---|---|
CONNECT | 否 |
CONNACK | 否 |
PUBLISH | 是(当Qos>0时) |
PUBACK | 是 |
PUBREC | 是 |
PUBREL | 是 |
PUBCOMP | 是 |
SUBSCRIBE | 是 |
SUBACK | 是 |
UNSUBSCRIBE | 是 |
UNSUBACK | 是 |
PINGREQ | 否 |
PINGRESP | 否 |
DISCONNECT | 否 |
客户端和服务端各自独立分配唯一标识。但是,一对客户端和服务端交换数据的时候可以使用相同的唯一标识。
四、载荷
有些MQTT控制包的最后一部分会包含载荷。其实负载就是想要传递的数据。
控制包类型 | 负载 |
---|---|
CONNECT | 必须 |
CONNACK | 无 |
PUBLISH | 可选(可以空载) |
PUBACK | 无 |
PUBREC | 无 |
PUBREL | 无 |
PUBCOMP | 无 |
SUBSCRIBE | 必须 |
SUBACK | 必须 |
UNSUBSCRIBE | 必须 |
UNSUBACK | 无 |
PINGREQ | 无 |
PINGRESP | 无 |
DISCONNECT | 无 |
MQTT协议详解 二、MQTT控制包格式相关推荐
- 【MQTT协议详解】MQTT协议
文章前注:本文的大量素材来自于百度百科和MQTT协议3.1.1中文板 MQTT协议3.1.1中文版网址:http://blog.mcxiaoke.com/mqtt/protocol/MQTT-3.1. ...
- MQTT协议详解 三、MQTT控制包(CONNECT)
文章目录 系列文章目录 前言 CONNECT(客户端请求连接服务端) 一.固定包头(2字节) 二.可变包头(10字节) 协议名字(6字节) 协议等级(1字节) 连接标识(1字节) Clean Sess ...
- MQTT协议详解 一、MQTT简介
文章目录 系列文章目录 前言 一.简述 二.主要特性 三.应用领域 四.常见术语 总结 系列文章目录 MQTT协议详解 一.MQTT简介 MQTT协议详解 二.MQTT控制包格式 MQTT协议详解 三 ...
- IoT:MQTT协议详解
IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...
- MQTT协议详解及开发教程(四)MQTT协议报文格式
推荐一款稳定的基于C编写的MQTT Client开源库 cMQTT MQTT协议详解及开发教程(一)MQTT协议概述 MQTT协议详解及开发教程(二)MQTT服务器EMQx搭建 MQTT协议详解及开发 ...
- MQTT协议详解,非常易懂
MQTT协议详解一 协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html 当然也有PDF版的,百度 ...
- MQTT协议详解及v5.0实践——实践类
本文主要包含了以下内容: 1)MQTT协议演进历史及协议特点,总结和分析MQTT协议族的优缺点,分析和总结了为什么相比于其他协议,MQTT适合IoT,业内支持现状等. 2)阿里云IoT MQTT3和5 ...
- http发送16进制报文_阿里云物联网平台使用心得(25)MQTT协议详解UNSUBSCRIBE报文...
题目 大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖.超子今天给大家介绍一下UNSUBSCRIBE报文. UNSUBSCRIBE报文 从上图中可知,UNSUBSCRI ...
- MQTT协议详解(完整版)
1 MQTT协议概念: 1.1 MQTT特点: 基于Publish/Subscribe(发布订阅)模式的物联网通信协议 简单易实现 支持Qos(服务质量) 报文精简 基于TCP/IP 发布订阅模式: ...
最新文章
- c++多线程队列 类对象
- web前端-移动端HTML5微商城项目实战分享案例
- DM365 dvsdk_2_10_01_18开发环境搭建
- 你多久更新一次简历,决定了你的收入多久能提升
- 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
- 安卓开发工程师应该这样快速使用机智云APP开源框架
- DOM技术对xml增删改查后更新源文件异常报错
- 结尾匹配_2.nginx的server_name匹配顺序
- 测量员软件测试版,测量员app
- Unity 动画模拟果冻抖动效果
- ubuntu下使用docker进行深度学习环境配置(从入门到精通)
- 校园二手交易平台-程序流程图
- 大榕树BASIS QQ群
- 透视与3D(3D立方体)
- 智能聊天机器人之图灵机器人
- 最近公共祖先(LCA,Tarjan)
- uni-app微信公众号(5)——新增、修改地址
- 游戏数值策划-经验值计算公式设计(自百度文库)
- 使用C++设计滤波器(低通滤波器,高通滤波器,带通滤波器)
- C陷阱与缺陷(C Traps and Pitfalls)学习笔记
热门文章
- 嵌入式 LED 万年历
- JavaScript中常用的API
- 单片机旋转led程序c语言,基于单片机POV的旋转LED灯程序
- 微星(MSI)B360M MORTAR迫击炮Win10系统安装
- 100PB!互联网史上最大规模数据迁移之一:115科技迁至阿里云
- yt88加密狗不识别_YT88 是天域一个很不错的加密狗工具,可以源码 ,还 外壳 ,带DLK开发包。 Windows Develop 256万源代码下载- www.pudn.com...
- 〖产品思维训练白宝书 - 核心竞争力篇⑨〗- 产品经理核心竞争力解读之产品经理的规划能力对普通人的启发
- 指数数据预测股指期货价格流程
- 原生js实现播放器操作(随机播放、上/下一首、播放/暂停)
- 市级政务云平台建设与运营解决方案