我正在尝试实施MQTT
库。根据教程,MQTT
消息的固定标题应如图所示。
同样在同一个教程中,我发现固定头的编码方法写成:
mqtt.write((byte) ((retain ? 1 : 0) | qos << 1 | (dup ? 1 : 0) << 3 | type << 4));
我的问题是,根据发布的固定标头规范,字段retain
,qos
,dup
和msg type
应该有1
,{分别为{1}},2
和1
位。
为什么4
字段扩展到5位&#34;&lt;&lt;&lt; 4&#34;并且字段msg type
已扩展到dup
&#34;&lt;&lt;&lt; 3&#34; ?
Fixed_Header
答案 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位宽; 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|
这是想要的。