MQTT 订阅标识符解析

iotforall 20230807

  • 物联网通信
  • 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网络与协议

查看全文

点赞

iotforall

作者最近更新

  • How to Implement Device Convergence for Sigfox & LoRaWAN
    iotforall
    2023-12-22
  • Edge and IoT Predictions For 2024
    iotforall
    2023-12-22
  • IoT Device Security Challenges: Calling for Consumer Vigilance
    iotforall
    2023-12-20

期刊订阅

相关推荐

  • Intellisense获得了326万美元的DHS洪水液位传感器合同

    2019-09-09

  • IPv6技术可为物联网带来什么?

    2020-03-17

  • 搭载传感器的物联网无人机如何为城市消毒?

    2020-04-01

  • 产业界力挺工信部物联网“新政”

    2020-05-11

评论0条评论

×
私信给iotforall

点击打开传感搜小程序 - 速览海量产品,精准对接供需

  • 收藏

  • 评论

  • 点赞

  • 分享

收藏文章×

已选择0个收藏夹

新建收藏夹
完成
创建收藏夹 ×
取消 保存

1.点击右上角

2.分享到“朋友圈”或“发送给好友”

×

微信扫一扫,分享到朋友圈

推荐使用浏览器内置分享功能

×

关注微信订阅号

关注微信订阅号,了解更多传感器动态

  • #{faceHtml}

    #{user_name}#{created_at}

    #{content}

    展开

    #{like_count} #{dislike_count} 查看评论 回复

    共#{comment_count}条评论

    加载更多

  • #{ahtml}#{created_at}

    #{content}

    展开

    #{like_count} #{dislike_count} #{reback} 回复

  • #{ahtml}#{created_at}

    #{content}

    展开

    #{like_count} #{dislike_count} 回复

  • 关闭
      广告