共计 1853 个字符,预计需要花费 5 分钟才能阅读完成。
MQTT v5 相较于 MQTT v3.1 和 v3.1.1 提供了许多新个性。咱们会尽量以通俗易懂的形式展现这些个性,并探讨这些个性对开发者的影响。咱们曾经探讨过其中一部分 MQTT v5 新个性,明天将持续探讨:主题别名。
什么是主题别名
主题别名(Topic Alias)是 MQTT v5.0 中新退出的与主题名(topic)相干的个性。它容许用户将主题长度较长且罕用的主题名缩减为一个双字节整数来升高公布音讯时的带宽耗费。
它是一个双字节整数,并将作为属性字段,编码在 PUBLISH
报文中可变报头局部。并且在理论利用中,将受到 CONNECT
报文和 CONNACK
报文中“主题别名最大长度”属性的限度。只有不超过该限度,任何主题名,都能够应用此个性缩减为编码长度 2 字节的整数。
为什么应用主题别名
在应用 MQTT v3 协定时。如果客户端在某次连贯中须要公布大量雷同主题的音讯,那么在每一条 PUBLISH
报文中写入雷同的主题名,就造成了客户端和服务端之间带宽资源的节约。同时对于服务端而言,每次对雷同主题名的 UTF-8 字符串进行解析,都是对计算资源的节约。
构想这样的场景,在地位 A
以固定频率报告温度湿度的传感器:
- 应用
/position/A/temperature
作为该地位温度音讯的主题(长度 23 字节); - 应用
/position/A/humidity
作为该地位湿度音讯的主题(长度 20 字节)。
除去第一次公布音讯外,之后的每个 PUBLISH
报文,都须要将“主题名”这个曾经传递过的信息再次通过网络传输。即使抛开客户端和服务端之间额定的带宽耗费不言,对服务端来说,面对成千上万的传感器公布的大量音讯,对每个客户端的每条音讯,都要将同样的主题名字符串进行解析,这将造成了计算资源的节约。
此时应用 MQTT v5 中的主题别名个性,就能够无效升高资源耗费。当客户端或服务端公布频率较高,且主题名长度较大的情景下,应用主题别名能够将每条音讯中主题名的带宽耗费缩减为 2 字节,同时因为计算机解决整数的效率高于解决字符串的效率,对于客户端或服务端在报文解析时耗费的计算资源也有了肯定的节约。
怎么应用主题别名
主题别名生命周期和作用范畴
该值由客户端和服务端 各自保护 ,且生命周期和作用范畴仅限于以后连贯。连贯断开后须要再次应用主题别名须要从新建设 主题别名 <=> 主题名
映射关系。
主题别名最大值(Topic Alias Maximum)
在 MQTT 客户端和服务端应用主题别名进行公布音讯前,须要对能够应用的最大主题别名长度进行约定。这部份信息替换将在 CONNECT
报文和 CONNACK
报文中实现。“主题别名最大值”也将以报文属性的模式,用双字节整数值编码在 CONNECT
和CONNACK
报文的可变报头中。
客户端的 CONNECT
报文中 ” 主题别名最大值 ” 批示了本客户端在此次连贯中服务端能够应用的最大主题别名数量;同样地,服务端发送的 CONNACK
报文中,也通过此值表明了以后连贯中对端(客户端)能够应用的最大主题别名数量。
设置与应用主题别名
客户端(或服务端)在发送 PUBLISH
报文时,能够在可变报头的属性局部,用一个字节,值为 0x23
的标识符批示接下来 2 字节将是主题别名值。
但主题别名值不容许为 0,也不容许大于服务端(客户端)发送的CONNACK
(CONNECT
)报文中设置的主题别名最大值。
对端接管到带有主题别名值和非空主题名的 PUBLISH
报文后,将建设主题别名和主题名的映射关系,在此之后发送的 PUBLISH
报文中,便能够仅用长度 2 字节的主题别名公布音讯,对端将应用通过之前建设的 主题别名 <=> 主题名
映射关系来解决音讯中的主题。并且因为这一映射关系由双端各自保护,所以客户端与服务端能够应用值雷同的主题别名相互公布音讯。
应用未设置的主题别名
PUBLISH
报文中应用的主题别名值如果在此前的报文中未进行设置,即对端并未建设以后主题别名到某个主题名的映射关系,而此条报文的可变报头中主题名字段为空,对端将应用蕴含起因码(REASON_CODE)为 0x82
的DISCONNECT
报文断开网络连接。
重置主题别名
当对端曾经依据本次连贯中某个 PUBLISH
报文创立了一个 主题别名 <=> 主题名
的映射关系时,能够在下一次发送 PUBLISH
报文时应用同样的主题别名值和非空的主题名来更新这个主题别名值到主题名的映射关系。
总结
主题别名作为 MQTT v5 新提供的个性,为 pub/sub 这一消息传递模型提供了更灵便的应用形式,对于主题名统一且数量大、重复性高的音讯而言,能够无效节俭带宽资源和计算资源。