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. 结构体中.和->两种访问区别

    定义结构体指针,访问成员时就用->定义结构体变量,访问成员时就用. 例如:struct A { int a; char b;}; struct A q; 访问成员就用:q.a;struct A ...

  2. 【HTML+CSS】在书写代码时的便捷应用

    创建多个相同元素: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  3. ISOMAP

    转载 https://blog.csdn.net/dark_scope/article/details/53229427# 维度打击,机器学习中的降维算法:ISOMAP & MDS 降维是机器 ...

  4. [BZOJ 3227] [SDOI 2008] 红黑树(tree)

    Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色.若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点.并规定所有前端结点的高度为- ...

  5. JPA javax.persistence.TransactionRequiredException

    直接说一下解决方案 Dao层,一定要是Dao层. 1 增加Transactional,必须要事务! 2 增加Modifying,告诉jpa这是修改! @Transactional @Modifying ...

  6. Python基础7:字符串方法

    1 * 重复输出字符串 print('helo '*4) 2 [],[:] 通过索引获取字符串中的字符,这里和列表中的切片操作是相同的,具体内容见列表 print('hello word'[2:]) ...

  7. 码云报错:fatal: remote origin already exists.解决方法

    今天在提交Git的时候,遇到了几个问题,记录一下,方便以后查找O(∩_∩)O 第一个问题 git remote add origin************** fatal: remote origi ...

  8. echarts纵坐标使用科学计数法表示

    最近做项目使用echart画图,发现纵坐标的刻度太大或太小的情况,导致页面十分难看,甚至出现遮挡的情况,所以想办法用科学计数法表示 代码如下: var option = { title: Echart ...

  9. [Luogu P2966][BZOJ 1774][USACO09DEC]牛收费路径Cow Toll Paths

    原题全英文的,粘贴个翻译题面,经过一定的修改. 跟所有人一样,农夫约翰以宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道 ...

  10. [转载] win10进行端口转发

    1.添加端口转发netsh interface portproxy add v4tov4 listenport=4000 listenaddress=127.0.0.1 connectport=400 ...