文章目录

  • 系列文章目录
  • 前言
  • 一、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。

SUBSCRIBEUNSUBSCRIBEPUBLISH(在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控制包格式相关推荐

  1. 【MQTT协议详解】MQTT协议

    文章前注:本文的大量素材来自于百度百科和MQTT协议3.1.1中文板 MQTT协议3.1.1中文版网址:http://blog.mcxiaoke.com/mqtt/protocol/MQTT-3.1. ...

  2. MQTT协议详解 三、MQTT控制包(CONNECT)

    文章目录 系列文章目录 前言 CONNECT(客户端请求连接服务端) 一.固定包头(2字节) 二.可变包头(10字节) 协议名字(6字节) 协议等级(1字节) 连接标识(1字节) Clean Sess ...

  3. MQTT协议详解 一、MQTT简介

    文章目录 系列文章目录 前言 一.简述 二.主要特性 三.应用领域 四.常见术语 总结 系列文章目录 MQTT协议详解 一.MQTT简介 MQTT协议详解 二.MQTT控制包格式 MQTT协议详解 三 ...

  4. IoT:MQTT协议详解

    IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...

  5. MQTT协议详解及开发教程(四)MQTT协议报文格式

    推荐一款稳定的基于C编写的MQTT Client开源库 cMQTT MQTT协议详解及开发教程(一)MQTT协议概述 MQTT协议详解及开发教程(二)MQTT服务器EMQx搭建 MQTT协议详解及开发 ...

  6. MQTT协议详解,非常易懂

    MQTT协议详解一 协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html 当然也有PDF版的,百度 ...

  7. MQTT协议详解及v5.0实践——实践类

    本文主要包含了以下内容: 1)MQTT协议演进历史及协议特点,总结和分析MQTT协议族的优缺点,分析和总结了为什么相比于其他协议,MQTT适合IoT,业内支持现状等. 2)阿里云IoT MQTT3和5 ...

  8. http发送16进制报文_阿里云物联网平台使用心得(25)MQTT协议详解UNSUBSCRIBE报文...

    题目 大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖.超子今天给大家介绍一下UNSUBSCRIBE报文. UNSUBSCRIBE报文 从上图中可知,UNSUBSCRI ...

  9. MQTT协议详解(完整版)

    1 MQTT协议概念: 1.1 MQTT特点: 基于Publish/Subscribe(发布订阅)模式的物联网通信协议 简单易实现 支持Qos(服务质量) 报文精简 基于TCP/IP 发布订阅模式: ...

最新文章

  1. c++多线程队列 类对象
  2. web前端-移动端HTML5微商城项目实战分享案例
  3. DM365 dvsdk_2_10_01_18开发环境搭建
  4. 你多久更新一次简历,决定了你的收入多久能提升
  5. 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
  6. 安卓开发工程师应该这样快速使用机智云APP开源框架
  7. DOM技术对xml增删改查后更新源文件异常报错
  8. 结尾匹配_2.nginx的server_name匹配顺序
  9. 测量员软件测试版,测量员app
  10. Unity 动画模拟果冻抖动效果
  11. ubuntu下使用docker进行深度学习环境配置(从入门到精通)
  12. 校园二手交易平台-程序流程图
  13. 大榕树BASIS QQ群
  14. 透视与3D(3D立方体)
  15. 智能聊天机器人之图灵机器人
  16. 最近公共祖先(LCA,Tarjan)
  17. uni-app微信公众号(5)——新增、修改地址
  18. 游戏数值策划-经验值计算公式设计(自百度文库)
  19. 使用C++设计滤波器(低通滤波器,高通滤波器,带通滤波器)
  20. C陷阱与缺陷(C Traps and Pitfalls)学习笔记

热门文章

  1. 嵌入式 LED 万年历
  2. JavaScript中常用的API
  3. 单片机旋转led程序c语言,基于单片机POV的旋转LED灯程序
  4. 微星(MSI)B360M MORTAR迫击炮Win10系统安装
  5. 100PB!互联网史上最大规模数据迁移之一:115科技迁至阿里云
  6. yt88加密狗不识别_YT88 是天域一个很不错的加密狗工具,可以源码 ,还 外壳 ,带DLK开发包。 Windows Develop 256万源代码下载- www.pudn.com...
  7. 〖产品思维训练白宝书 - 核心竞争力篇⑨〗- 产品经理核心竞争力解读之产品经理的规划能力对普通人的启发
  8. 指数数据预测股指期货价格流程
  9. 原生js实现播放器操作(随机播放、上/下一首、播放/暂停)
  10. 市级政务云平台建设与运营解决方案