MQTT 知道客户端是否已订阅

MQTT know if a client is subscribed

问题已经发布,How to Find Connected MQTT Client Details

在我的例子中,如果客户端 X 已经订阅了频道 A,则客户端 Y 无法订阅频道 A,直到 X 取消订阅。我频道只能订阅一个客户端

我也可以使用保留消息和 LWT 的想法吗?

如果是,我不知道应该从哪里开始。最好从一个简单的例子开始,看看保留消息和 LWT 是如何工作的。到目前为止,我只有发布和订阅的经验,没有更多。

能否请您告诉我一些建议,可能是一些链接或示例或任何有用的信息,以便我可以有一个起点。

MQTT 就是让多个客户端订阅相同的主题,它是整个 pub/sub 模式和共享信息的一部分。因此,协议中没有任何内容可以满足您的需求。

您也许可以执行如下操作:

如果有一个主题说 foo/bar 并且您只想要一个订阅者,您可以发布一条保留消息,其中包含订阅者客户端 ID 的有效负载到 lock/foo/bar。然后,您可以在断开连接时向此锁定主题发布一个 "free",并设置一个 LWT 以在客户端死亡时执行相同的操作。

这样做的问题是一切都是异步的,因此它为竞争条件开辟了很多时间 windows。例如比如说 client-1client-2 都想订阅 foo/bar,他们都需要先订阅 lock/foo/bar 来检查它的状态。他们几乎同时执行此操作,然后他们必须等待一段时间才能看到返回的消息("free" 或客户端 ID)。他们都会得到 "free" 所以他们都假设他们可以发布他们的客户 ID。 client-1 首先发布,紧随其后的是 client-2,然后他们都订阅了 foo/bar