MQTT 订阅标识符解析
图解:© IoT For All 大多数MQTT客户端的实现都会使用回调机制来处理接收到的消息。在回调函数中,我们只能访问消息的主题名称。如果这是一个非通配符订阅,订阅时使用的主题过滤器将与消息中的主题名称完全一致。因此,我们可以直接建立订阅主题与回调函数之间的映射关系。当消息到达时,我们可以通过消息中的主题名称查找对应的回调函数并执行它。然而,如果是通配符订阅,消息中的主题名称将与订阅时使用的原始主题过滤器不同。在这种情况下,我们需要将消息中的主题名称逐一与原始订阅进行匹配,以确定应执行哪个回调函数。这将影响客户端的处理效率。此外,MQTT允许客户端建立多个订阅,因此当使用通配符订阅时,单条消息可以同时匹配多个客户端订阅。在这种情况下,MQTT允许服务器为每个重叠的订阅单独发送一条消息,或者为所有重叠的订阅只发送一条消息。前者意味着客户端将收到多个重复的消息。无论采用前者还是后者,客户端都无法确定该消息来自哪个订阅。例如,即使客户端发现某条消息匹配了两个订阅,它也无法保证当服务器将消息转发给自身时这两个订阅都已成功创建。因此,客户端无法触发正确的回调函数来处理该消息。EMQ Technologies Inc. 订阅标识符是如何工作的?为了解决这个问题,MQTT 5.0引入了订阅标识符(Subscription Identifier)。其用法非常简单:客户端在订阅时可以指定一个订阅标识符,服务器需要存储订阅与订阅标识符之间的映射关系。当PUBLISH数据包匹配某个订阅且需要转发给客户端时,服务器会将与该订阅相关的订阅标识符连同PUBLISH数据包一起返回给客户端。EMQ Technologies Inc. 如果服务器选择为重叠的订阅发送单独的消息,每个PUBLISH数据包都应包含匹配该订阅的订阅标识符。如果服务器选择为重叠的订阅只发送一条消息,该PUBLISH数据包将包含多个订阅标识符。客户端只需在订阅标识符与回调函数之间建立映射。通过使用消息中的订阅标识符,客户端可以确定消息的来源订阅以及应执行的回调函数。EMQ Technologies Inc. 在客户端中,订阅标识符不是会话状态的一部分,它与任何内容的关联完全由客户端决定。因此,除了回调函数之外,我们还可以在订阅标识符与订阅主题之间,或在订阅标识符与客户端ID之间建立映射关系。后者在网关场景中尤为有用,当网关接收到服务器发来的消息并需要将其转发给正确的客户端时,网关可以通过订阅标识符快速确定消息的接收客户端,而无需重新匹配和路由主题。一个SUBSCRIBE数据包只能包含一个订阅标识符。如果一个SUBSCRIBE数据包包含多个订阅,相同的订阅标识符将与所有这些订阅相关联。因此,请确保将多个订阅关联到同一个回调函数是出于有意为之的目的。TweetShareShareEmail MQTT网络与协议 MQTT网络与协议
查看全文
作者最近更新
-
Edge and IoT Predictions For 2024iotforall2023-12-22
评论0条评论