zoukankan      html  css  js  c++  java
  • MQTT报文格式

    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是可选。

  • 相关阅读:
    kafka 消息推送报错"dial tcp: lookup iZ2ze2k3******7abjcsyZ on 219.141.140.10:53: no such host"
    MacBook安装Homebrew的国内安装脚本 告别龟速下载安装
    docker info命令的使用和返回结果描述
    Python requests.post方法中data与json参数区别
    redis master-slave python switch logic (升级版,序列七)
    ELKF日志收集系统
    MySQL 中的concat函数使用
    程序员的街舞“梦”
    第一份工作没有工资,信不信
    Java中的享元设计模式,涨姿势了!
  • 原文地址:https://www.cnblogs.com/daiker/p/6382638.html
Copyright © 2011-2022 走看看