精华内容
下载资源
问答
  • MQTT数据包格式

    千次阅读 2020-05-23 18:27:47
    MQTT数据包格式 前段时间看别人写的代码,解析MQTT数据包的时候,对原始数据的一些操作并没有看懂,尤其是 if(buf[1] & 0x80 == 0x80); 这个判断表示很疑惑,以为在解析ASSCI码,后来翻阅了资料才发现,mqtt...

    MQTT数据包格式

    前段时间看别人写的代码,解析MQTT数据包的时候,对原始数据的一些操作并没有看懂,尤其是 if(buf[1] & 0x80 == 0x80);
    这个判断表示很疑惑,以为在解析ASSCI码,后来翻阅了资料才发现,mqtt数据包一共分为三部分,固定头、可变头、消息。上面那个判断式其实是在解析数据长度。
    转载:https://www.jianshu.com/p/aa1a3518050d

    消息报文格式

    MQTT协议是应用层协议,需要借助TCP/IP协议进行传输,类似HTTP协议。MQTT协议也有自己的格式,如下表:

    [ Fixed Header | Variable Header | Payload]

    Fixed Header: 固定头部,MQTT协议分很多种类型,如连接,发布,订阅,心跳等。其中固定头是必须的,所有类型的MQTT协议中,都必须包含固定头。

    Variable Header:可变头部,可变头部不是可选的意思,而是指这部分在有些协议类型中存在,在有些协议中不存在。

    Payload:消息载体,就是消息内容。与可变头一样,在有些协议类型中有消息内容,有些协议类型中没有消息内容。

    固定头

    固定头包含两部分内容,首字节(字节1)和剩余消息报文长度(1-4字节)

    Bit 7 6 5 4 3 2 1 0
    Byte 1 MQTT Control Packet type Flags specific to each MQTT Control Packet type
    Byte 2… Remaining Length
    为了避免翻译不准确,这里都使用官方的原始术语。其中MQTT Control Packet type可以简单理解为字节位Bit[7-4]用于确定报文类型。Flags specific to each MQTT Control Packet type意思是字节位Bit[3-0]用作某些报文的特殊标记。

    首字节
    首字节用于表示MQTT消息的报文类型以及某些类型的控制标记,如上图。高4位(bit7~bit4)表示协议类型,总共可以表示16种协议类型,其中0000和1111是保留字段。MQTT消息报文类型如下。

    报文类型 字段值 数据方向 描述
    保留 0 禁用 保留
    CONNECT 1 Client —> Server 客户端连接到服务器
    CONNACK 2 Server —> Client 连接确认
    PUBLISH 3 Client <–> Server 发布消息
    PUBACK 4 Client <–> Server 发不确认
    PUBREC 5 Client <–> Server 消息已接收(QoS2第一阶段)
    PUBREL 6 Client <–> Server 消息释放(QoS2第二阶段)
    PUBCOMP 7 Client <–> Server 发布结束(QoS2第三阶段)
    SUBSCRIBE 8 Client —> Server 客户端订阅请求
    SUBACK 9 Server —> Client 服务端订阅确认
    UNSUBACRIBE 10 Client —> Server 客户端取消订阅
    UNSUBACK 11 Server —> Client 服务端取消订阅确认
    PINGREQ 12 Client —> Server 客户端发送心跳
    PINGRESP 13 Server —> Client 服务端回复心跳
    DISCONNECT 14 Client —> Server 客户端断开连接请求
    保留 15 禁用 保留
    首字节的低4位(bit3~bit0)用来表示某些报文类型的控制字段,实际上只有少数报文类型有控制位,如下图。

    报文类型 固定头标记 Bit 3 Bit 2 Bit 1 Bit 0
    CONNECT 保留 0 0 0 0
    CONNACK 保留 0 0 0 0
    PUBLISH Used in MQTT 3.1.1 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
    UNSUBACRIBE 保留 0 0 1 0
    UNSUBACK 保留 0 0 0 0
    PINGREQ 保留 0 0 0 0
    PINGRESP 保留 0 0 0 0
    DISCONNECT 保留 0 0 0 0
    当发布PUBLISH消息时,如果DUP字段(bit 3)设置为1,表明这是一条重复消息,否则是第一次发布消息。为了保证消息的可靠性传递,当QoS设置为1时,客户端或服务器发布消息时,需要得到对方的确认(PUBACK),如果一段时间后没收到PUBACK,那么会再次发送当前消息,并将DUP字段标记为1。

    QoS用来表明QoS等级,如果Bit 1和Bit 2都为0,表示QoS 0。如果Bit 1为1,表示QoS 1。如果Bit 2为1,表示QoS 2。如果同时将Bit 1和Bit 2都设置成1,那么客户端或服务器认为这是一条非法的消息,会关闭当前连接。

    目前Bit[3-0]只在PUBLISH协议中使用有效,并且表中指明了是MQTT 3.1.1版本。对于其它MQTT协议版本,内容可能不同。所有固定头标记为"保留"的协议类型,Bit[3-0]必须保持与表中保持一致,如SUBSCRIBE协议,其Bit 1必须为1。如果接收方接收到非法的消息,会强行关闭当前连接。

    Remaining Length
    Remaining Length意思是剩余长度,即Variable Header + Payload的长度。剩余长度从Byte 2开始,最长可达4字节。所以剩余长度范围是Byte[2-5]。那么怎样确定其长度到底是1还是4呢,这取决于字节的最高位Bit 7(默认都是高字节在前),如果这个值是1,那么就继续计算字节长度,如果是0,那么就不再计算字节长度。

    消息长度可以简单理解为128进制的数据,4位长度最大可以表示128128128*128Byte=256MB。但是这个长度的计算有些特别,就是低位在前,高位在后(因为正常的表示方法是高位在前,低位在后),字节最高位Bit7用于标记是否需要继续计算消息长度。以下是消息长度的长度范围:

    字节 最小值 最大值
    1 0(0x00) 127(0x7F)
    2 128 (0x80, 0x01) 16 383 (0xFF, 0x7F)
    3 16 384 (0x80, 0x80, 0x01) 2 097 151 (0xFF, 0xFF, 0x7F)
    4 2 097 152 (0x80, 0x80, 0x80, 0x01) 268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)
    稍微注意一下,0x80=1000 0000,不是 1000。刚开始以为是1000,所以就没明白。

    举个例子。

    消息假设长度是[0X60],其二进制是01100000,字节最高位Bit7(从左边起第0位)是0,所以不需要继续往后计算。那么消息长度就是0X60,十进制数是96。

    如果消息长度是[0XC1, 0XC2, 0X33],那么他们的二进制分别如下,

    0xC1=1100 0001

    0xC2=1100 0010

    0x33=0011 0011,

    第一字节最高位是1,那么需要继续向后计算,去掉标记位(0xC1%128),得到100 0001=41

    第二字节最高位是1,那么需要继续向后计算,去掉标记位(0xC2%128),得到100 0010=42

    第三字节最高位是0,不需要向后计算,其结果就是0x33=51

    因为低位在前,高位在后,那么长度计算为Length=41 + 42128 + 51128*128=841001 B = 821KB

    需要注意的是,消息长度=可变头部长度+消息内容长度。不包括首字节和消息长度本身,如果消息长度为5,那么说明这条消息后边还有5字节,整条消息长度为7(首字节+1位长度字节+5)。

    另外如果消息长度为4字节,最后一位不能超过0X7F=127,因为如果超出这个值,其最高位Bit7是1,还需要往后计算,这与消息最大长度为4字节矛盾。所以如果出现[0XFF, 0XFF, 0XFF, 0XFF]这样的消息长度,那么接收方认为这是一条非法的消息。

    Variable Header
    Variable Header的意思是可变化的消息头部。有些报文类型包含可变头部,如PUBLISH,SUBSCRIBE,CONNECT等等。可变头部在固定头部和消息内容之间,其内容根据报文类型不同而不同。

    Packet Identifier(消息ID)是一种常见的可变头部,一个消息ID包含2字节,高字节在前,低字节在后。包含Packet Identifier的协议类型包括:

    报文类型 包含可变头
    PUBLISH YES(QoS > 0)
    PUBACK YES
    PUBREC YES
    PUBREL YES
    PUBCOMP YES
    SUBSCRIBE YES
    SUBACK YES
    UNSUBSCRIBE YES
    UNSUBACK YES
    消息ID默认是从1开始并自增,如果一个消息ID被用完后,这个消息ID可以被重用。对于PUBLISH (QoS 1)来说,如果发送端接收到PUBACK,那么这个消息ID就用完了。对于PUBLISH(QoS 2),如果接收方收到PUBCOMP,那么这个消息ID就用完了。对于SUBSCRIBE和UNSUBSCRIBE,消息ID使用完成的标记是发送方收到了对应的SUBACK和UNSUBACK。

    另外客户端和服务端的消息ID是独立分配的,客户端和服务端可以同时使用同一个消息ID。比如

    Client                     Server
    

    PUBLISH Packet Identifier=0x1234—>

    <–PUBLISH Packet Identifier=0x1234

    PUBACK Packet Identifier=0x1234—>

    <–PUBACK Packet Identifier=0x1234
    上边消息客户端给服务端发送一条消息,使用的消息ID是0x1234,同时服务端给客户端发送了一条消息,也使用了消息ID 0x1234。然后客户端回复服务端,发送PUBACK,最后是客户端收到服务端的回复PUBACK。

    另外其它协议如CONNECT和CONNACK也有可变头部,具体请参见MQTT-Packet CONNECT Variable Header

    Payload
    有些报文类型是包含Payload的,Payload意思是消息载体的意思,如PUBLISH的Payload就是指消息内容。而CONNECT的Payload则包含Client Identifier,Will Topic,Will Message,Username,Password等信息。具体请参见MQTT-Packet CONNECT Payload

    包含Payload的报文类型如下:

    报文类型 是否包含Payload
    CONNECT YES
    PUBLISH 可选
    SUBSCRIBE YES
    SUBACK YES
    UNSUBSCRIBE YES
    除了上面列出的报文类型,其它的报文类型都没有Payload。

    抓包测试
    我们使用Wire Shark抓包,来探测一下MQTT消息内容。

    1. 打开Wireshark,选择你的网卡,添加以下过滤条件,并点击开始捕获。

    tcp.port==1883
    2. 打开终端,输入以下命令,发布一条消息。如果你不理解一下命令,请参看我的前一篇文章MQTT快速入门

    $ mosquitto_pub -d -p 1883 -h 10.69.94.176 -q 1 -t topic1 -m “Hello MQTT”
    Client mosqpub|2052-SCNWCL0121 sending CONNECT
    Client mosqpub|2052-SCNWCL0121 received CONNACK (0)
    Client mosqpub|2052-SCNWCL0121 sending PUBLISH (d0, q1, r0, m1, ‘topic1’, … (10 bytes))
    Client mosqpub|2052-SCNWCL0121 received PUBACK (Mid: 1)
    Client mosqpub|2052-SCNWCL0121 sending DISCONNECT
    3. 进入Wireshark捕获窗口,发现捕获到了一些TCP和MQTT协议,如下:

    mqtt-control-packet-format.png
    4. 查看其中一条MQTT消息,比如Publish Message,点击这一行。查看MQTT消息内容。其字节码为

    32 14 00 06 74 6f 70 69 63 31 00 01 48 65 6c 6c 6f 20 4d 51 54 54
    5. 来具体看一下消息内容

    首字节 0x32=0011 0010,对照首字节中的表,4位高字节为0011=3,表示PUBLISH,4位低字节0010,分别表示DUP 0,QoS 1(占两位),Retain 0。

    Remaining Length 0x14=20,表示剩余消息长度为20。

    PUBLISH (QoS>0)报文消息包含可变头部,其可变头部包含topic name和Packet Identifier。其格式为:

    00 06表示topic name的长度,所以topic name长度是6

    74 6f 70 69 63 31表示topic name的UTF8字符串,其值为"topic1"。

    00 01是Packet Identifier,所以消息ID为1。

    48 65 6c 6c 6f 20 4d 51 54 54是Payload,表示“Hello MQTT"的UTF8字节码。

    总结
    我们介绍了MQTT协议的消息格式,MQTT消息格式包含Fixed Header, Variable Header和Payload。因为MQTT消息格式非常精简,所以可以高效的传输数据。

    Fixed Header中包含首字节,高4位用来表示报文类型,低4位用于类型控制。目前只有PUBLISH使用了类型控制字段。其它控制字段被保留并且必须与协议定义保持一致。

    Fixed Header同时包含Remaining Length,这是剩余消息长度,最大长度为4字节,理论上一条MQTT最大可以传输256MB数据。Remaining Length=Variable Header+Payload长度。

    Variable Header是可变头部,有些报文类型中需要包含可变头部,可变头部根据报文类型不同而不同。比如Packet Identifier在发布,订阅/取消订阅等报文中都使用到。

    Payload是消息内容,也只在某些报文类型中出现,其内容和格式也根据报文类型不同而不同。

    展开全文
  • 在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、 可变头(Variable header)、 消息体(payload)三部分构成。   MQTT 数据包结构 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型...

    MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、 可变头(Variable header)、 消息体(payload)三部分构成。

     

    MQTT 数据包结构

    • 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识
    • 可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容
    • 消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容

     

    MQTT固定头

    固定头存在于所有MQTT数据包中,其结构如下:

    Bit76543210
    byte 1MQTT数据包类型不同类型MQTT数据包的具体标识
    byte 2…剩余长度

     

    1.1 MQTT数据包类型

    位置:byte 1, bits 7-4。

    相于一个4位的无符号值,类型如下:

    名称流方向描述
    Reserved0不可用保留位
    CONNECT1客户端到服务器客户端请求连接到服务器
    CONNACK2服务器到客户端连接确认
    PUBLISH3双向发布消息
    PUBACK4双向发布确认
    PUBREC5双向发布收到(保证第1部分到达)
    PUBREL6双赂发布释放(保证第2部分到达)
    PUBCOMP7双向发布完成(保证第3部分到达)
    SUBSCRIBE8客户端到服务器客户端请求订阅
    SUBACK9服务器到客户端订阅确认
    UNSUBSCRIBE10客户端到服务器请求取消订阅
    UNSUBACK11服务器到客户端取消订阅确认
    PINGREQ12客户端到服务器PING请求
    PINGRESP13服务器到客户端PING应答
    DISCONNECT14客户端到服务器中断连接
    Reserved15不可用保留位

     

    1.2 标识位

    位置:byte 1, bits 3-0。

    在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接:

    数据包标识位Bit 3Bit 2Bit 1Bit 0
    CONNECT保留位0000
    CONNACK保留位0000
    PUBLISHMQTT 3.1.1使用DUP1QoS2QoS2RETAIN3
    PUBACK保留位0000
    PUBREC保留位0000
    PUBREL保留位0000
    PUBCOMP保留位0000
    SUBSCRIBE保留位0000
    SUBACK保留位0000
    UNSUBSCRIBE保留位0000
    UNSUBACK保留位0000
    PINGREQ保留位0000
    PINGRESP保留位0000
    DISCONNECT保留位0000
    • DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
    • QoS:发布消息的服务质量,即:保证消息传递的次数
      • 00:最多一次,即:<=1
      • 01:至少一次,即:>=1
      • 10:一次,即:=1
      • 11:预留
    • RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

     

     

    1.3 剩余长度(Remaining Length)

    位置:byte 1。

    固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。 例如:计算出后面的大小为0

     

    MQTT可变头

    MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是做为包的标识:

    Bit76543210
    byte 1包标签符(MSB)
    byte 2…包标签符(LSB)

    很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

     

    Payload消息体

    Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:

      • CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
      • SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS
      • SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
      • UNSUBSCRIBE,消息体内容是要订阅的主题。
    展开全文
  • 数据包 mqtt 数据包编码器、解码器
  • MQTT数据包生成代码

    2018-06-24 14:49:20
    文件包括头文件和源文件,可以在单片机及各种地方使用。代码可以根据要求生MQTT协议数据包,通过tcp服务器发送给MQTT服务器即可完成MQTT通信。
  • 如何使用java抓取MQTT数据包?尝试过用Jpcap抓取,但是Jpcap没有MQTT的,抓取的数据解析也是乱码</p>
  • 数据包 编码和解码MQTT 3.1.1、5.0包的节点方式。 该库已通过节点v6,v8,v10,v12和v14进行了测试。 支持旧版本节点的最新版本是mqtt-packet@4.1.2。 安装 npm install mqtt-packet --save 例子 产生中 const mqtt ...
  • MQTT协议数据包结构

    2019-02-27 15:24:05
    在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、 可变头(Variable header)、 消息体(payload)三部分构成。   MQTT 数据包结构 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包...

    MQTT协议数据包结构

    协议就是通信双方的一个约定,即,表示第1位传输的什么、第2位传输的什么……。在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、 可变头(Variable header)、 消息体(payload)三部分构成。

     

    MQTT 数据包结构

    • 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识
    • 可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容
    • 消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容

     

    MQTT固定头

    固定头存在于所有MQTT数据包中,其结构如下:

    Bit76543210
    byte 1MQTT数据包类型不同类型MQTT数据包的具体标识
    byte 2…剩余长度

     

    1.1 MQTT数据包类型

    位置:byte 1, bits 7-4。

    相于一个4位的无符号值,类型如下:

    名称流方向描述
    Reserved0不可用保留位
    CONNECT1客户端到服务器客户端请求连接到服务器
    CONNACK2服务器到客户端连接确认
    PUBLISH3双向发布消息
    PUBACK4双向发布确认
    PUBREC5双向发布收到(保证第1部分到达)
    PUBREL6双赂发布释放(保证第2部分到达)
    PUBCOMP7双向发布完成(保证第3部分到达)
    SUBSCRIBE8客户端到服务器客户端请求订阅
    SUBACK9服务器到客户端订阅确认
    UNSUBSCRIBE10客户端到服务器请求取消订阅
    UNSUBACK11服务器到客户端取消订阅确认
    PINGREQ12客户端到服务器PING请求
    PINGRESP13服务器到客户端PING应答
    DISCONNECT14客户端到服务器中断连接
    Reserved15不可用保留位

     

    1.2 标识位

    位置:byte 1, bits 3-0。

    在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接:

    数据包标识位Bit 3Bit 2Bit 1Bit 0
    CONNECT保留位0000
    CONNACK保留位0000
    PUBLISHMQTT 3.1.1使用DUP1QoS2QoS2RETAIN3
    PUBACK保留位0000
    PUBREC保留位0000
    PUBREL保留位0000
    PUBCOMP保留位0000
    SUBSCRIBE保留位0000
    SUBACK保留位0000
    UNSUBSCRIBE保留位0000
    UNSUBACK保留位0000
    PINGREQ保留位0000
    PINGRESP保留位0000
    DISCONNECT保留位0000
    • DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
    • QoS:发布消息的服务质量,即:保证消息传递的次数
      • 00:最多一次,即:<=1
      • 01:至少一次,即:>=1
      • 10:一次,即:=1
      • 11:预留
    • RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

     

     

    1.3 剩余长度(Remaining Length)

    位置:byte 1。

    固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。 例如:计算出后面的大小为0

     

    MQTT可变头

    MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是做为包的标识:

    Bit76543210
    byte 1包标签符(MSB)
    byte 2…包标签符(LSB)

    很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

     

    Payload消息体

    Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:

      • CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
      • SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS
      • SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
      •  
      • UNSUBSCRIBE,消息体内容是要订阅的主题。

    上述转自:https://www.cnblogs.com/zhangyu1024/p/6141818.html

     

    1.资料

    mqtt官网http://mqtt.org/
    服务端程序列表https://github.com/mqtt/mqtt.github.io/wiki/servers
    客户端库列表https://github.com/mqtt/mqtt.github.io/wiki/libraries
    android相关https://github.com/mqtt/mqtt.github.io/wiki/mqtt_on_the_android_platform
    java MQTT客户端,android可用https://github.com/fusesource/mqtt-client
    mqtt v3.1.1 协议官方文档

    http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.doc

    http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

    http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.pdf

    本地下载

    2.4 MQTT v3.1.1数据包格式

      参考官方文档:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718018

      一个mqtt数据包至多包含下面3个部分,且是按下面的顺序。

    Fixed header, present in all MQTT Control Packets固定消息头,在所有消息中包中出现
    Variable header, present in some MQTT Control Packets变化的消息头,在一些特定包中出现
    Payload, present in some MQTT Control Pa消息的负载物,在一些包中出现

    2.5 MQTT v3.1.1固定消息头格式

      参考官方文档:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718020

    Bit

    7

    6

    5

    4

    3

    2

    1

    0

    byte 1

    MQTT Control Packet type

    Flags specific to each MQTT Control Packet type

    byte 2…

    Remaining Length

    2.6 MQTT v3.1.1变化消息头格式

      参考官方文档:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718024

    Bit

    7

    6

    5

    4

    3

    2

    1

    0

    byte 1

    Packet Identifier MSB

    byte 2

    Packet Identifier LSB

    2.7 MQTT v3.1.1消息体(装载物)格式

      参考官方文档:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718026  

    Control Packet

    Payload

    Control Packet

    Payload

    Control Packet

    Payload

    CONNECT

    Required

    PUBREL

    None

    UNSUBACK

    None

    CONNACK

    None

    PUBCOMP

    None

    PINGREQ

    None

    PUBLISH

    Optional

    SUBSCRIBE

    Required

    PINGRESP

    None

    PUBACK

    None

    SUBACK

    Required

    DISCONNECT

    None

    PUBREC

    None

    UNSUBSCRIBE

    Required

      

    //上述摘自:https://www.cnblogs.com/hhks/p/7442242.html

     

    展开全文
  • 在本教程中,我们将更详细地介绍MQTT协议,以及MQTT消息或数据包的格式。 我们将研究: MQTT消息格式。 MQTT消息头 消息字段和编码 控制消息编码示例 ...MQTT是基于二进制的协议,控制元素是二进制字节而...MQTT数据包.

    在本教程中,我们将更详细地介绍MQTT协议,以及MQTT消息或数据包的格式。

    我们将研究:

    MQTT消息格式。
    MQTT消息头
    消息字段和编码
    控制消息编码示例

     

    介绍


    MQTT是基于二进制的协议,控制元素是二进制字节而不是文本字符串。

    MQTT使用命令和命令确认格式。

    这意味着每个命令都有一个对应的确认。

    MQTT-Protocol-Commands

    主题名称,客户端ID,用户名和密码被编码为UTF-8字符串。

    除了MQTT协议信息(例如客户端ID等)外,有效负载是二进制数据,内容和格式是特定于应用程序的。

    MQTT数据包或消息格式由2字节固定报头(始终存在)+可变报头(并非始终存在)+有效负载(并非始终存在)组成。

    MQTT-Standard-Packet

    可能的数据包格式为:

    • Fixed Header (Control field + Length) – Example CONNACK
    • Fixed Header (Control field + Length) + Variable Header -Example PUBACK
    • Fixed Header (Control field + Length)  + Variable Header + payload -Example CONNECT

    固定报头字段由控制字段和可变长度数据包长度字段组成。

    数据包长度字段的最小大小为1个字节,用于总长度小于127个字节的消息(不包括控制字段和长度字段)。

    最大数据包大小为256MB。 小于127字节的小数据包具有1字节的数据包长度字段。

    大于127且小于16383的数据包将使用2个字节。 等等

    注意:只是用7位,第8位用作连续位.

    Note: 7 bits are used with the 8th bit being a continuation bit.

    最小数据包大小只有2个字节,其中包含一个单字节控制字段和一个单字节数据包长度字段。 例如,断开连接消息只有2个字节。

    mqtt-minimum-packet

     

    控制字段


    8位控制字段是2字节固定报头的第一个字节。 它分为两个4位字段,包含所有协议命令和响应。

    前4个最高有效位是命令或消息类型字段,其他4位用作控制标志。

    mqtt-control-field-structure

    下表摘自MQTT 3.1.1规范,并显示了MQTT命令及其相关代码的示例。

    因为它们是8位字节字段中最重要的部分,所以我也以十进制显示了它们的字节值,就像它们出现在数据包中一样。

    Sample-MQTT-Control-Message

     

    控制标志

    尽管有16种可能的标志,但实际上只使用其中少部分。

    发行消息充分利用了这些标志,如下表所示:

    MQTT-Message-Flags

    当使用QOS或1或2重新发布消息时使用重复标志

    发布消息时使用QOS标志,并指示QOS级别-0,1,2

    保留消息标志也用于发布。

     

    长度字段(剩余长度)

    它的长度在1到4个字节之间。 每个字节使用7位作为长度,其中MSB用作连续标志。

    剩余长度是长度字段后面的字节数,包括可变长度的头和有效负载,如下所示:

    MQTT-Packet-Remaining-Length

    下面说明了长度为64和321字节的数据包的长度字段

    剩余数据包长度64个字节仅需要1个字节:

    mqtt-length-field-1

    321个字节的数据包长度需要2个字节的剩余长度字段:

    Encoding-Remaining-Length-Field-2

    从规范中获取的下表显示了数据包大小和数据包长度字段。

    Remaining-Length-Field-Values

     

    可变长度头

    如前所述,可变长度头字段并不总是出现在MQTT消息中。

    某些MQTT消息类型或命令要求使用此字段来携带其他控制信息。

    可变长度报头字段是相似的,但对于所有消息类型而言都不相同。

    MQTT连接和断开连接消息示例
    作为说明,我们现在将查看连接消息的数据包详细信息。

    下面是一个真实的客户端连接和断开连接示例,显示了已发送和已接收数据的实际字节值。

    CONNECT控制代码= 0x10

    CONNACK控制码= 0x20

    MQTT数据包=控制+长度+协议名称+协议级别+连接标志+保持活动+有效负载

    (MQTT packet =control + length + protocol name + Protocol Level +Connect Flags + keep alive +Payload)

    MQTT-Message-Example-1

     

    注解:

    • 注意连接(0x10)和连接确认(0x20)控制代码。
    • 注意十六进制0x17或23字节的总长度,其中不包括控制字段和长度字段。 长度字段只有1个字节。
    • 您还应该能够在发送的数据包中看到客户端ID(python_test)。
    • 当查看实际的数据包字节时,Python会打印十六进制值,除非它可以匹配ASCII字符。在上面的示例中,keep alive字段为x00x3C,但显示为x00 <。 因为Ascii < = 0x3C

    mqtt-packet-structure-connect

    注解:

    • 客户端ID字段作为有效内容的第一部分发送,而不是作为头部的一部分发送。
    • 客户端ID后跟一个长度字段。
    • 连接标志表明正在请求一个干净的会话(clean session)。
    • 连接标志是“可变长度”标头的一部分,用于指示用户名,密码的存在与否,以及有效负载中的消息字段。 它还包含干净会话标志和Will QOS。

     

    控制包摘要表

    Control PacketVariable HeaderPayload
    CONNECTRequiredRequired
    CONNACKNoneNone
    PUBLISHRequiredOptional
    PUBACKRequiredNone
    PUBRECRequiredNone
    PUBRELRequiredNone
    PUBCOMPRequiredNone
    SUBSCRIBERequiredRequired
    SUBACKRequiredRequired
    UNSUBSCRIBERequiredRequired
    UNSUBACKRequiredRequired
    PINGREQNoneNone
    PINGRESPNoneNone
    DISCONNECTNoneNone

     

    Wireshark网络分析

    为了回应读者有关TCP协议的问题,我创建了这张摘自Wireshark的屏幕截图。

    wireshark-mqtt-packet

     

    它显示了一个MQTT客户端连接和发布(QOS 1)。 您可以清楚地看到总长度为58个字节的ACK数据包。

    我们知道ACK数据包是2个字节。

    因此,没有MQTT的TCP数据包约为56个字节。

    还有一点需要注意的有趣的事情是直到我完成数据包捕获之前我都没有想到的是,每个MQTT命令或响应都将获得一个TCP ACK,甚至还有一个MQTT ACK。

    如果查看屏幕截图,则MQTT连接可以获取TCP ACK响应和MQTT Connect ACK响应。

    MQTT Connect ACK响应会有一个TCP ACK响应。

     

    参考:MQTT V3.1.1 Specification pdf

    http://www.steves-internet-guide.com/mqtt-protocol-messages-overview/

    展开全文
  • MQTT协议—数据包结构

    千次阅读 2018-11-03 18:59:48
    一个MQTT协议数据包由固定头...固定头存在于所有的MQTT数据包中,表示数据包类型及数据包的分组类标识。其结构如下: Bit 7 6 5 4 3 2 1 0 Byte1 MQTT数据包类型 不同类型MQTT数据...
  • iot mqtt json数据包格式

    千次阅读 2018-04-10 10:46:29
    iot json数据包格式数据类型:订阅类型 RegisterDevice DeviceData DeviceAlert Acknowledge发布类型 RegistrationAck DataPublis UserCommandsub:{ "hardwareId": "(unique hardware id)&...
  • iopa-mqtt-数据包 关于 iopa-mqtt-packet是基于Internet协议联盟(IOPA)规范的,用于API的OASIS消息队列遥测传输(MQTT数据包传输,用于物联网(IoT) 它以标准IOPA格式存储MQTT消息。 这是一个较低级别的实用...
  • MQTT协议--MQTT协议解析

    千次阅读 2021-01-29 09:58:35
    在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。 MQTT 数据包结构 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及...
  • ChirpStack网关桥 ChirpStack盖特威大桥是转换LORA:registered:数据包转发协议为ChirpStack网络服务器的... 通用MQTT经纪人 建筑 组件链接 链接 支持 执照 ChirpStack Gateway Bridge是根据MIT许可证分发的。 请参阅。
  • MQTT协议的简单了解

    2019-09-18 05:37:45
    MQTT协议-MQTT协议解析(MQTT数据包结构) 协议就是通信双方的一个约定, 即,表示第1位传输的什么、第2位传输的什么……。 在MQTT协议中,一个MQTT数据包由: 固定头(Fixed header)、 可变头(Variable header)...
  • 编码和解码MQTT-SN 1.2数据包。 它是从自由启发而来的。 该模块支持流输入(例如,从用于串行端口的TCP套接字),其中推送到解析器的单个缓冲区可能一次包含部分数据包或多个数据包。 安装 npm install mqttsn-...
  • 在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。 MQTT数据包结构 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包...
  • MQTT的连接和心跳

    2020-02-22 12:23:06
    最近学习MQTT协议和与Onenet平台的...在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下: (1)固定头(Fixed header)...
  • 压缩包mqtt.zip中包含,中文和英文版本的3.1.1版本MQTT协议规范和连接断开数据包。。。。
  • MQTT简单了解

    千次阅读 2018-02-28 14:33:16
    MQTT简单了解 ...MQTT数据包结构 MQTT英文文档 Version 3.1.1 MQTT协议中文版翻译 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscri...
  • MQTT初识

    2020-07-02 14:52:50
    MQTT1 概述2 设计原则3 特性4 MQTT协议原理4.1 MQTT协议实现方式4.2 网络传输与应用消息4.3 MQTT客户端4.4 MQTT服务器4.5 MQTT协议中的订阅、...头5.1.1 MQTT数据包类型5.1.2 标识位5.1.3 剩余长度(Remaining Leng
  • MQTT数据包解析
  • mqtt协议介绍

    2021-07-26 11:35:28
    发布和订阅 QoS(Quality of Service levels) 2 MQTT 数据包结构 2.1 MQTT固定头 2.2 MQTT可变头 / Variable header 2.3 Payload消息体 mqtt协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测...
  • 因为考虑后使用wireshark抓取MQTT数据包来进行对MQTT协议分析, mqtt客户端使用的是eclipse.paho.ui.app(安装在windows下,后续将介绍如何安装),如果将mqtt服务器安装在windows下,那么wireshark无法捕获localhost...
  • 从服务器发送到客户端的第一个数据包必须是CONNACK数据包[MQTT-3.2.0-1]。 如果客户端在合理的时间内没有从服务器收到CONNACK数据包,则客户端应该关闭网络连接。“合理”的时间量取决于应用程序的类型和通信基础...
  • 在客户端向服务器建立网络连接之后,从客户端发送到服务器的第一个数据包必须是CONNECT数据包[MQTT-3.1.0-1]。 客户端只能通过网络连接发送一次CONNECT数据包。服务器必须处理从客户端发送的第二个CONNECT数据包...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,619
精华内容 1,047
关键字:

mqtt数据包