1

我正在尝试实现一个MQTT库。根据教程,MQTT消息的固定标头应如发布的图片所示。

同样在同一个教程中,我发现fixed header的编码方式是这样写的:

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

我的问题是,根据发布的固定标头规范,字段,retain和the should have ,和bits 分别。qosdupmsg type1214

为什么该msg type字段扩展为 5 位 "<<4" 并且该字段dup扩展为4 bits"<<3" ?

Fixed_Header 在此处输入图像描述

4

1 回答 1

4

为什么 msg 类型字段最多扩展为 5 位 "<<4" 而字段 dup 最多扩展为 4 位 "<<3" ?

<<不会“扩展”该字段,而是其向左移动。

最初,我们的每个数字看起来像这样:

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

假设每个数字都在该字段的有效范围内,那么它们已经是正确的宽度。具体来说,type可以有一个从 0 到 15 的值,所以它是(最多)4 位宽;dup并且retain必须为 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|

这就是想要的。

于 2014-11-02T14:38:22.097 回答