关于MQTT固定头结构?

时间:2014-11-01 13:10:33

标签: mqtt messagebroker mosquitto paho

我正在尝试实施MQTT库。根据教程,MQTT消息的固定标题应如图所示。

同样在同一个教程中,我发现固定头的编码方法写成:

mqtt.write((byte) ((retain ? 1 : 0) | qos << 1 | (dup ? 1 : 0) << 3 | type << 4));

我的问题是,根据发布的固定标头规范,字段retainqosdupmsg type应该有1,{分别为{1}},21位。

为什么4字段扩展到5位&#34;&lt;&lt;&lt; 4&#34;并且字段msg type已扩展到dup&#34;&lt;&lt;&lt; 3&#34; ?

Fixed_Header enter image description here

1 个答案:

答案 0 :(得分:4)

  

为什么将msg类型字段扩展到5比特“&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;

<<不会“扩展”该字段,而是移位。

最初,我们的每个数字都是这样的:

bit: |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
======================================================================
                                     |------------- type ------------|
                                                             |- dup -|
                                                     |----- qos -----|
                                                             | retain|

假设每个数字都在该字段的有效范围内,那么它们已经是正确的宽度。具体来说,type的值可以是0到15,因此它是(最多)4位宽; dupretain必须为0或1,因此只有1位宽; qos的值可以是0到3,即2位宽。

但是,他们在错误的地方。它们被固定在低位(3,2,1,0)。我们需要将它们向左移动以使它们到达正确的位置:

bit: |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
======================================================================
     |----------- type<<4 -----------|                                
                                     | dup<<3|                        
                                             |---- qos<<1 ---|        
                                                             | retain|

例如,dup向左移3位,因为我们想要3个空格(实际上是0位)。 retain不需要移动,因为它恰好位于正确的位置。

一旦所有位都在正确的位置,它们ORed一起使用|来给出这个字节:

bit: |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
======================================================================
     |----------- type<<4 -----------| dup<<3|---- qos<<1 ---| retain|

这是想要的。