我正在尝试实现一个MQTT
图书馆。并且根据一个教程,该MQTT
消息的固定标头应如图所示,如图所示。
同样在同一教程中,我发现固定标头的编码方法写为:
mqtt.write((byte) ((retain ? 1 : 0) | qos << 1 | (dup ? 1 : 0) << 3 | type << 4));
我的问题是,根据贴在固定头规格,田野retain
,qos
,dup
而msg type
应该有1
,2
,1
和4
位分别。
为什么将msg type
字段扩展到5位“ << 4”,然后将字段dup
扩展到4 bits
“ << 3”?
Fixed_Header
为什么将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
不需要移动,因为它恰好位于正确的位置。
一旦所有位都位于正确的位置,就可以使用以下方式对它们进行“或”运算|
:
bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
======================================================================
|----------- type<<4 -----------| dup<<3|---- qos<<1 ---| retain|
想要什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句