MQTT报文结构

  控制报文由三部分组成:

  1、Fixed header 固定报头,所有报文都包含

  2、Variable header 可变报头,部分报文包含

  3、Body 有效载荷,部分报文包含

固定报头

  报头长度:2 ~ 5 Bytes

  1、报文类型:由第一个字节4-7 表示;共16个类型,但是保留第0个,第15个类型不用:

    

  2、标志位,标志报文类型的特定标志,第一个字节的0-3:

    

  3、剩余长度,从第二个字节开始,最少一个字节,最长四个字节。表示当前报文剩余部分(可变报头+负载数据)的字节数。不包括用于编码Remaining Length字段本身的字节数。

    它使用一个变长度编码方案,对小于128的值,它使用单字节编码。

    大值处理:低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。

    因此每个字节可以编码128个数值和一个延续位(continuation bit)。

    剩余长度字段的大小:

    

    非负整数x使用变长编码方案算法:

do
encodedByte = x%128;
x = x /128;
if (x > 0 ){
encodedByte = encodedByte|128; //延续标志位置1
}else{
encodedByte = encodedByte;
}
fill_fix_header_remain_len(encodeByte);
while(x>0)

    剩余长度字段的解码算法:

multiplier = 1
value = 0
do
encodedByte = 'next byte from stream'
value += (encodedByte AND 127) * multiplier
multiplier *= 128
if (multiplier > 128*128*128)
throw Error(Malformed Remaining Length)
while ((encodedByte AND 128) != 0)//判断下一个字节的最高位是否为1,不等于1就表示是最后一个长度字节,value的值就是剩余长度的值

可变报头

    在固定报头和body之间,内容根据报文类型不同而不同。可变报头的标识符字段存在于在多个类型的报文里。?

    报文标识符类型:

    

    很多控制报文的可变报头部分,包含一个两字节的报文标识符字段。比如:PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,

    PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCIBE,UNSUBACK。

    SUBSCRIBE,UNSUBSCRIBE 和 PUBLISH(QoS大于0)控制报文必须包含一个非零的16位报文标识符。

有效载荷

    对于PUBLISH来说就是消息内容了。

    需要有效载荷的控制报文:CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE。 PUBLISH是可选。

MQTT报文格式的更多相关文章

  1. MQTT——控制报文格式

    解控制报文格式是学习MQTT中,笔者认为最为重要的一个知识点.MQTT的所有行为都离不开他.控制报文可以分为三个部分组成,分别为:固定报头.可以变报头.有效载荷部分. 注意:上面的说的报文的类型.是指 ...

  2. TCP协议探究(一):报文格式与连接建立终止

    一 TCP:传输控制协议报文格式 1 TCP服务 提供面向连接.可靠的字节流服务 面向连接意味着两方通信,不支持多播和广播 可靠性的支持: 应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给 ...

  3. DNS报文格式(RFC1035)

    一.域名和资源记录的定义 1.Name space definitions 2.资源记录定义(RR definitions)      2.1 格式          后面分析报文的时候详细解释.   ...

  4. 报文格式:xml 、定长报文、变长报文

    目前接触到的报文格式有三种:xml .定长报文.变长报文 . 此处只做简单介绍,日后应该会深入学习到三者之间如何解析,再继续更新.——2016.9.23 XML XML 被设计用来传输和存储数据. H ...

  5. HTTP POST请求报文格式分析与Java实现文件上传

    时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

  6. DNS报文格式

    原文链接地址:http://blog.chinaunix.net/uid-24875436-id-3088461.html DNS报文格式(借个图贴过来):     说明一下:并不是所有DNS报文都有 ...

  7. ARP协议的报文格式

    原文链接地址:http://www.cnblogs.com/laojie4321/archive/2012/04/12/2444187.html   结构ether_header定义了以太网帧首部:结 ...

  8. HTTP报文格式

    请求报文 <method><SP><uri><SP><version><CRLF> <head-name><: ...

  9. HTTP请求、响应报文格式

    HTTP请求报文格式: HTTP请求报文主要由请求行.请求头部.空行以及请求正文4部分组成 1,请求行由3部分组成,分别为:请求方式,URI(注意这里不是URL)以及协议版本组成,之间由空格分隔 请求 ...

随机推荐

  1. open live writer 测试

    什么是Hash表 1.定义 Hash(散列/哈希),就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散 ...

  2. SSM框架开发遇到的问题

    request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+re ...

  3. Manual write code to record error log in .net by Global.asax

    完整的Glabal.asax代码: <%@ Application Language="C#" %> <script RunAt="server&quo ...

  4. Comet OJ - Contest #1

    A:随便怎么暴力. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 25 char ...

  5. icns图标的制作

    1. 准备一张无损的png图片(1024x1024) 2. 新建一个文件夹 必须要以iconset为后缀 $ mkdir hgl_pngpic.iconset 3. 使用sips 命令剪切10个不一样 ...

  6. Xilinx FPGA引脚txt文件导入excel中

    需求 为了把xilinx FPGA的官方引脚文件txt转成excel文件(实际官网中有对应的csv文件就是excel文件了...) xilinx FPGA引脚地址:https://china.xili ...

  7. spring 中的设计模式

    https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485205&idx=1&sn=63455d2313776d ...

  8. 微信小程序之:wepy(二)

    一大堆实例:人家的博客园 代码规范: 1.尽量使用驼峰命名,避免使用$开头,框架内建属性都已$开头,可以使用this直接调用. 2.入口文件.页面.组件后缀都为.wpy. 3.使用ES6语法开发. 4 ...

  9. Django 后台定制自己的选择框删除函数

    from django.contrib import admin from .models import Article,Category from datetime import datetime ...

  10. mac-redis安装与使用

    安装: brew install redis --------------- 使用: 启动redis-server: sudo redis-server 连接:./redis-cli -h 127.0 ...