如何在MQTT中实现一对一通信?

How to implement one-to-one communication in MQTT?

我正在尝试为连接许多客户端的项目设置 MQTT 系统。

这些客户端类型不同,可能具有不同的功能。某些客户端类型有正在发布的信息(例如温度),但同时具有需要设置的功能状态(例如开关),可以由其他客户端设置。

所以使用 MQTT 我想出了以下概念:

  1. 客户端发布它拥有的信息——在上面的例子中这就是温度,所以像:

    customer/group/device/temperature

  2. 当客户端连接到代理时,为了从它订阅的不同客户端接收切换状态:

    customer/group/device/switch

到目前为止,我一直在使用基于 websocket 的解决方案,但由于 MQTT 是一种著名的物联网设备协议,我问自己如何在客户端之间实现一对一通信,并想出了上面的例子来说明我将如何做那。

你的解决方案还不错。例如,客户端 A 可以使用主题 customer/group/B/switch 向客户端 B 发布消息,然后客户端 B 回复 customer/group/A/switch.

作为替代方案,客户端 A 可以发布到 customer/group/B/switch 并在有效负载中指定它期望回复的主题,例如

{
    "data":"your message",
    "reply-to":"customer/group/A/segretreply-fromB-1345313"
}

(只是 JSON 负载的一个例子)。 您可以使用时间戳、MAC 或 "uniqueness" 的其他来源来构建回复主题。客户 A 可以订阅不同的回复主题,以便为彼此的客户维护 "separate" 频道。

真正的问题是 MQTT 不是一对一的 通信,每个客户端都可以潜在地订阅 # 并接收所有消息。
你应该在你的经纪人中有某种授权来决定客户是否可以publish/subscribe到一个主题。

我建议阅读这篇优秀文章 MQTT Security Fundamentals: Authorization。然后您可以设置主题和授权规则以更好地满足您的要求。

我不隶属于 HiveMQ。提供的 link 仅用于教育目的,他们的教程很棒。