以下材料是有关在新版本的MQTTv5.0中添加的功能的文章的续篇。如果您已经研究过它,那么您将不难发现,大多数新功能都基于可以添加到包中的属性的概念。在本文中,我们将详细分析它们。
大约 -本文针对的是那些对MQTT的复杂性感兴趣或需要深入研究的人。这里将没有图片和抒情题,只有铁杆!!!
下表是所有属性的表(请参阅规范中的2.2.2.2节)。
ID | 名称 | 数据类型 | 包/遗嘱属性 |
1个 | 有效载荷格式指示器 | 字节 | 发布,将财产 |
2 | 邮件到期间隔 | 四字节整数 | 发布,将财产 |
3 | 内容类型 | UTF-8编码字符串 | 发布,将财产 |
8 | 回应主题 | UTF-8编码字符串 | 发布,将财产 |
九 | 相关数据 | 二进制数据 | 发布,将财产 |
十一 | 订阅标识符 | 可变字节整数 | 出版,订阅 |
17 | 会话到期间隔 | 四字节整数 | 连接,断开,断开 |
十八 | 分配的客户标识符 | UTF-8编码字符串 | 康纳克 |
19 | 服务器保持活动 | 两字节整数 | 康纳克 |
21 | 身份验证方法 | UTF-8编码字符串 | CONNECT,CONNACK,AUTH |
22 | 认证数据 | 二进制数据 | CONNECT,CONNACK,AUTH |
23 | 索取问题信息 | 字节 | 连接 |
24 | 将延迟间隔 | 四字节整数 | 意志属性 |
25 | 请求响应信息 | 字节 | 连接 |
26 | 回应信息 | UTF-8编码字符串 | 康纳克 |
28 | 服务器参考 | UTF-8编码字符串 | 断开连接 |
31 | 原因字符串 | UTF-8编码字符串 | CONNACK,PUBACK,PUBREC,PUBREL,PUBCOMP,SUBACK,UNSUBACK,DISCONNECT,AUTH |
33 | 收到最大 | 两字节整数 | 连接,CONNACK |
34 | 主题别名最大 | 两字节整数 | 连接,CONNACK |
35 | 主题别名 | 两字节整数 | 发布 |
36 | 最大QoS | 字节 | 康纳克 |
37 | 保持可用 | 字节 | 康纳克 |
38 | 用户属性 | UTF-8字符串对 | CONNECT,CONNACK,PUBLISH,Will属性,PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE,UNSUBACK,DISCONNECT,AUTH |
39 | 最大封包大小 | 四字节整数 | 连接,CONNACK |
40 | 提供通配符订阅 | 字节 | 康纳克 |
41 | 订阅标识符可用 | 字节 | 康纳克 |
42 | 可用共享订阅 | 字节 | 康纳克 |
现在,让我们仔细看看它们。
有效载荷格式指示器-有效载荷格式指示器
- 0-数据是一组未定义的字节,等同于不发送有效载荷格式指示符,
- 1-数据是UTF-8编码的字符数据。
消息有效期限-消息有效期限
一个数字,表示消息的到期间隔(以秒为单位)。
如果已超过消息到期间隔,并且服务器无法将消息传递给正确的订户,则它必须删除该订户的消息。
内容类型-内容类型
内容类型的值由发送和接收客户端确定。
响应主题-响应主题
一个UTF-8字符串,用作回复消息的主题。
具有指定答复主题的邮件的收件人将其主题用作其发布主题,以发送其答复。
在这种情况下,请求/响应交互如下发生(请参阅规范中的4.10.1节):
- 客户端(发送者)发布带有某些主题的请求消息,该主题指定响应的主题。
- () , , . . , .
- , , .
- . - . , .
Correlation Data —
相关数据由请求消息的发送者用来确定接收到响应消息时属于哪个请求。如果没有相关数据,则请求者不需要任何相关数据。
如果请求消息包含相关数据,则接收方还必须将相关数据作为属性包含在响应消息的PUBLISH数据包中。
相关数据值仅对请求消息的发送者和响应消息的接收者有意义。
订阅标识符-订阅标识符
代表订阅ID的数字。
如果发布是与多个订阅匹配的结果,则将指定多个订阅ID,在这种情况下,它们的顺序无关紧要。
客户还可以进行多个订阅,这些订阅与给定的出版物匹配,并对多个订阅使用相同的标识符。在这种情况下,PUBLISH软件包将包含几个相同的订阅ID。
订阅ID与由于SUBSCRIBE软件包而创建或修改的任何订阅相关联。如果有订阅ID,则将其与订阅一起保存。如果未指定此属性,则没有任何预订与预订一起保存。
订阅ID是服务器上会话状态的一部分,并返回给接收相应PUBLISH数据包的客户端。当服务器收到UNSUBSCRIBE数据包,服务器从客户端收到用于相同主题筛选器但具有不同订阅ID或没有订阅ID的SUBSCRIBE数据包,或者服务器在CONNACK数据包中发送Session Present为0时,会将它们从服务器会话状态中删除。
会话到期间隔-会话到期间隔
一个数字,表示会话终止的时间间隔(以秒为单位)。
如果没有会话到期间隔,则使用值0;如果将其设置为0或不存在,则会话在网络连接关闭时结束。
如果会话到期间隔为0xFFFFFFFF(UINT_MAX),则会话不会到期。
如果会话到期间隔大于0
,则在关闭网络连接后,客户端和服务器必须保持会话状态。客户端可以通过提供间歇连接的网络连接到服务器。该客户端可以使用较短的会话到期间隔,以便它可以在网络再次变得可用时重新连接并继续可靠地传递消息。如果客户端没有时间恢复连接,则消息将丢失。
将Clean Start设置为1并将到期时间间隔设置为0等效于在MQTT规范版本3.1.1中将CleanSession设置为1。将Clean Start设置为0并且没有会话到期间隔等同于在MQTT规范版本3.1.1中将CleanSession设置为0。
分配的客户标识符-分配的客户标识符
一个字符串,它是服务器分配的客户端ID。如果在CONNECT数据包中使用零长度的客户端标识符,则使用该标识符。
服务器保持活动状态-服务器保持活动状态
一个数字,定义服务器分配的保持活动时间。如果服务器在CONNACK数据包中返回“服务器保持活动状态”,则客户端务必使用该值,而不是作为“保持活动状态”发送的值。如果服务器未发送“服务器保持活动状态”,则它必须使用客户端在CONNECT数据包中设置的“保持活动状态”值。
服务器的“服务器保持活动”的主要用途是在客户端指定的“保持活动”超时之前通知客户端,如果不活动,它将断开与客户端的连接。
认证方式-认证方式
一个字符串,其中包含用于扩展身份验证的身份验证方法的名称。
如果没有身份验证方法,则不执行扩展身份验证。
身份验证方法是客户端与服务器之间关于身份验证数据中发送的数据的含义以及CONNECT中任何其他字段的协议,以及客户端和服务器完成身份验证所需的交换和处理的协议。身份验证方法通常是SASL机制。
认证数据-认证数据
包含认证数据的二进制数据。仅在指定身份验证方法时发送。该数据的内容由认证方法确定。
请求问题信息-有关请求问题的信息
客户端使用此值指示是否在失败时分派原因字符串或自定义属性。
- 0-服务器可以在CONNACK或DISCONNECT程序包中返回原因字符串或自定义属性,但不应在PUBLISH,CONNACK或DISCONNECT以外的任何程序包中发送原因字符串或自定义属性,
- 1-服务器可以在允许的情况下为任何程序包返回原因字符串或自定义属性。
将延迟间隔-将消息延迟间隔
一个数字,表示“ Will Message”延迟的间隔(以秒为单位)。如果没有延迟间隔,则默认值为0,并且在发布意愿消息之前没有延迟。
服务器将延迟发布消息,直到延迟时间到期或会话结束(以先到者为准)。如果在延迟间隔到期之前建立了与此会话的新网络连接,则服务器不得发送遗嘱消息。
一种使用此方法的方法是在临时网络断开连接且客户端能够在消息发布之前重新连接并继续会话的情况下,阻止发布Will Message。
请求响应信息-请求的响应信息
一个值为0或1的字节。客户端使用此值向服务器请求CONNACK响应信息。
- 0-服务器不应返回响应信息,
- 1-服务器可以在CONNACK数据包中返回响应信息,但这不是必需的,即使客户端请求了此信息也是如此。
响应信息-响应信息
一个UTF-8字符串,用作创建响应主题的基础。客户端未根据响应信息创建响应主题的方式由本规范定义。
通常,这通常用于传输为该客户端保留的主题的全局唯一子集,至少在其会话的生存期内。使用此机制可以使此配置在服务器上一次完成,而不是在每个客户端上一次。
服务器参考-链接到服务器
客户端可以用来标识正在使用的另一台服务器的字符串。该字符串的值是一个用空格分隔的链接列表。链接的格式不受管制。
服务器可以通过发送CONNACK或DISCONNECT(原因码为“使用其他服务器”或“移动的服务器”)来请求客户端使用其他服务器。发送这些代码之一时,服务器还可以包含服务器引用属性,以指示客户端应使用的一个或多个服务器的位置。
- 使用其他服务器-客户端必须临时切换为使用其他服务器。
- 服务器已移动-客户端必须始终连接到其他服务器。
建议每个链接包含一个名称,后跟一个冒号和端口号。如果名称包含冒号,则可以将名称字符串括在方括号中。方括号中的名称不能包含右方括号字符(“]”)。这用于表示使用冒号作为分隔符的IPv6地址。
服务器链接中的名称通常是主机名,DNS名称,SRV名称或IP地址。冒号后面的值通常是十进制端口号。如果端口信息是从名称中获取的(例如,对于SRV)或默认,则这不是必需的。
如果给出了多个链接,则客户端应选择其中之一。
示例
myserver.xyz.org
myserver.xyz.org:8883
10.10.151.22:8883 [fe80::9610:3eff:fe1c]:1883
myserver.xyz.org:8883
10.10.151.22:8883 [fe80::9610:3eff:fe1c]:1883
原因字符串-原因字符串
一个字符串,描述与此响应相关的原因。服务器使用该值向客户端提供其他信息。
在客户端中正确使用原因字符串将包括在客户端代码引发的异常中使用此信息,或记录原因字符串。
接收最大值-QOS数据包数量的最大值> 0
设置发送配额的数字,用于限制在不接收PUBACK(对于QoS 1)或PUBCOMP(对于QoS 2)的情况下可以发送的PUBLISH QOS> 0数据包的数量。也就是说,此值用于限制同时发送的QoS 1和QoS 2发布的数量。如果存在尚未发送响应的已发送最大接收消息,则客户端/服务器不应发送具有QoS 1和QoS 2的消息。达到“接收最大值”时,也可以暂停发送QoS 0数据包,但这不是必需的。同时,除了发布外,无需延迟数据包的发送。
如果客户端和服务器都将“接收最大值”设置为1,则请确保同一时间“运行中”的消息不超过一个。
指定的值仅适用于当前的网络连接,并在重新连接时重新初始化。
如果未指定,则默认为65,535。
主题别名最大值-主题别名的最大值
一个数字,代表主题别名的最大值。
此值指示被接受为主题别名的最大值。它用于限制此连接中需要存储的主题别名的数量。
主题别名-主题别名
为了减小PUBLISH数据包的大小,发送方可以使用主题别名。这是一个整数值,用于标识主题而不是使用主题名称。此技术减小了PUBLISH数据包的大小,当主题名称很长且同一名称经常在网络连接上重复使用时,此技术很有用。
在接收方,当收到主题的别名时,将在主题与其别名之间建立必要的对应关系。
如果PUBLISH程序包包含主题别名,则接收方将按以下方式对其进行处理(请参见规范中的3.3.4节):
- ,
a) , , ,
b) , , , .
- ,
a) ,
b) , .
Maximum QoS — QoS
可以为0或1。如果没有最大QoS,则客户端使用的最大QoS为2。
如果服务器不支持PUBLISH QoS 1或QoS 2数据包,则它必须在CONNACK数据包中发送最大QoS,以指示其支持的最高QoS。
如果客户端从服务器收到最大QoS,则不应发送QoS级别超过指定最大值的PUBLISH数据包。
保留可用-可以保存
- 0-不支持保存的消息,
- 1-支持保存的消息。
从服务器接收到“保留可用”值为0的客户端不得发送“保留”标志设置为1的发布数据包。
用户属性-用户属性
它是一个字符串对“名称”-“值”。与其他属性不同,此属性可以出现多次。同一名称可用于多个属性。
此属性可用于提供其他诊断或其他信息。
这些属性的含义未在规范中指定,它们的含义和解释仅对发送和接收客户端已知。
最大数据包大小-最大数据包大小
一个数字,指定客户端/服务器愿意接受的最大数据包大小。数据包大小是MQTT数据包中的字节总数。此属性用于指示超出此限制的数据包将不被处理。
如果没有最大数据包大小,则不施加数据包大小限制。
如果选择限制数据包大小,则应用程序有责任选择适当的最大数据包大小值。
提供通配符订阅-提供通配符订阅
- 0-不支持通配符订阅,
- 1-支持此类订阅。
如果缺少该属性,则支持通配符订阅。
如果服务器支持通配符订阅,它仍然可以拒绝包含通配符订阅的特定订阅请求。
订阅标识符可用-订阅标识符可用
- 0-不支持订阅ID,
- 1-支持订阅ID。
如果缺少该属性,则支持订阅ID。
共享订阅可用-共享订阅可用
- 0-不支持常规订阅,
- 1-支持常规订阅。
如果缺少该属性,则支持常规订阅。
结论
让我提醒您,这篇文章是在将上述新兴功能嵌入到IoT平台的服务中时诞生的。在我看来,在对象界面中显示从客户端接收到的属性的显示非常方便(您可以在这里>>>了解更多有关对象的信息)。您可以隐藏不感兴趣的属性,还可以添加其他自定义属性来显示。通常,它看起来像这样。 仅此而已。为了测试功能,我发现这个项目redboltz / mqtt_cpp非常方便和直观。 如果您在评论中分享了支持版本5.0的MQTT客户端的其他开源项目(带有GUI和不带有GUI),我将非常高兴。