mqtt_simple例程 nrf9160做主控连接阿里云——( 三 )


  • QoS 1:消息传递至少 1 次 。包含了从传机制,如果服务器来不及应答,就会导致客户端端超时,再次发送一次消息,服务端每次对没一个消息都要回复,在有多条消息时,不会像QoS2一样去和客户端确认说,你连续发了这么多,是都要执行嘛,还是只执行一次,多发的是误发 。

  • mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
  • QoS 2:消息恰好传送送一次 。相同的命令值希望执行一次,不会由于如QoS1一样导致说,本来只想执行一次的信息,多执行了几次,由于有了这个保证,要完成这个机制(多一个应答机制),导致系统开销会大,但是保证了消息的精准性,QoS2质量的消息只有在比较重要的领域应用,如军事 ,航天等 。

  • mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    QoS2因此是最高质量的消息,就如我们本次使用的阿里云占时还在不支持这个等级的消息 。
    3.2.1、固定报头
    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    1)第一字节:
    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    如截图,第一字节,一共8bit,分为两部分,4~7bit定义了每一包报文是一个什么类型,所有报文如表3.1中所示,下图是MQTT协议中对CONNECT报文的定义:
    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    由此我们可以确定整个报文的第一字节为0x10(为了书写方便后续将不在写0x这个十六进制的标号,将直接使用10标识) 。
    2)第二字节(也有可能是第2到第3、或者2到4,或者2到5)为什么会有不同的选择,这是由于在第一字节确定了本包报文是什么类型后,会在后续告诉对方后面的可变报头和负载一共有多少字节,当后面只有120个字节时可以用一个字节就表示好,但是当有500,或者1000时就不是一个字节可以表示的长度了(二进制表示方式,不理解的这里可以自己百度) 。为什么会有500,或者1000的那么大的差别呢,这由于有些可选配置,如有需要可配置进去(然后再后面的可变报头给对应的bit位写1,表示我要使用改配置,那么服务端检测到该标志就可以知道说原来你本次有这个可选配置,我会在检测负载数据时进行检测读取的),然后就是如果你设置设备名字或者密码等时给了一个很长的名字,那数据不就是增加了,所以才在这把长度搞成这样的可选,然后还经过特殊的设置让接收设备可以很好的知道本次报文这部分到低是用几个字节表示后面数据的长度,接下来我们会详细讲解一下,先把截图放在下面,这就是为什么剩余长度bute2...有三个点的原因:
    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图

    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    分别表示(每个字节的低 7 位用于编码数据,最高位是标志位) :1 个字节时(整个报文包的第2字节),从 0(0x00)到 127(0x7f)2 个字节时(整个报文包的第2字节和第3字节),从 128(0x80,0x01)到 16383(0Xff,0x7f)3 个字节时(整个报文包的第2、3、4字节),从 16384(0x80,0x80,0x01)到 2097151(0xFF,0xFF,0x7F)4 个字节时(整个报文包的第2、3、4、5字节),从 2097152(0x80,0x80,0x80,0x01)到 268435455(0xFF,0xFF,0xFF,0x7F))
    长度计算方式:

    经验总结扩展阅读