Regarding the MQTT fixed header structure?

回眸只為那壹抹淺笑 提交于 2019-12-11 07:44:41

问题


i am trying to implement a MQTT library. And according to a tutorial, the fixed header of the MQTT message should look like as shown in the posted picture.

Also in the same tutorial, i found that the encodeing method of the fixed header is written as:

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

My Question is, according to the fixed header specifications posted, the fields retain, qos, dup and the msg type should have 1, 2, 1 and 4 bits respectively.

why the msg type field is expanded upto 5 bits "<<4" and the field dup is expanded upto 4 bits "<<3" ?

Fixed_Header


回答1:


why the msg type field is expanded upto 5 bits "<<4" and the field dup is expanded upto 4 bits "<<3" ?

<< doesn't "expand" the field, it shifts it left.

Initially, each of our numbers looks like this:

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

Assuming that each of the numbers is in a valid range for that field, then they are already the correct width. Specifically, type can have a value from 0 to 15, so it is (up to) 4 bits wide; dup and retain must be 0 or 1 so are only 1 bit wide; qos can have a value from 0 to 3, which is 2 bits wide.

But, they are in the wrong place. They are stuck down in the low bits (3,2,1,0). We need to shift them left to get them to the correct positions:

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

For example, dup is shifted left 3 bits because we want 3 spaces (actually bits of value 0) below it. retain does not need to be shifted because it happened to be in the correct place already.

Once all the bits are in the correct place, they are ORed together using | to give this byte:

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

Which is what is wanted.



来源:https://stackoverflow.com/questions/26689636/regarding-the-mqtt-fixed-header-structure

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!