HiveMQ MQTT 客户端:订阅多个主题
HiveMQ MQTT client: subscribe to multiple topics
我正在尝试使用 HiveMQ 客户端订阅多个主题。 This page建议MQTT订阅消息可以携带多个订阅。
我试过这段代码,但它只订阅了最后一个主题(本例中为Topic2
)
val mqttClient: Mqtt3AsyncClient
// Client instantiation ommited for brevity
mqttClient.subscribeWith()
.topicFilter("Topic1")
.topicFilter("Topic2")
.callback(::onMessageReceived)
.send()
如果可能,我想避免发送多个单独的订阅。
您是正确的,因为 MQTT 订阅负载包含 "a list of Topic Filters indicating the Topics to which the Client wants to subscribe"。所以理论上,您可以一次调用订阅多个主题。
通过一次调用订阅多个主题会使错误处理变得困难(如果一个订阅成功而另一个订阅失败是错误吗?)因此一些库可能不支持这一点,而其他库则为单个主题订阅提供简化的语法。在 hive-mqtt-client(我假设您正在使用)中调用 topicFilter()
overrides any existing filter 这样您将获得对指定的最后一个主题的订阅。
已讨论在一次通话中订阅多个主题in the forum and it appears that there are a number of ways of achieving this (see this issue and this PR)。来自论坛的示例代码如下(我没有测试过):
mqtt3AsyncClient.subscribeWith()
.addSubscription().topicFilter(“tenant1/topic”).qos(MqttQos.AT_LEAST_ONCE).applySubscription()
.addSubscription().topicFilter(“tenant2/topic”).qos(MqttQos.AT_LEAST_ONCE).applySubscription()
.callback(e -> {})
.send();
我正在尝试使用 HiveMQ 客户端订阅多个主题。 This page建议MQTT订阅消息可以携带多个订阅。
我试过这段代码,但它只订阅了最后一个主题(本例中为Topic2
)
val mqttClient: Mqtt3AsyncClient
// Client instantiation ommited for brevity
mqttClient.subscribeWith()
.topicFilter("Topic1")
.topicFilter("Topic2")
.callback(::onMessageReceived)
.send()
如果可能,我想避免发送多个单独的订阅。
您是正确的,因为 MQTT 订阅负载包含 "a list of Topic Filters indicating the Topics to which the Client wants to subscribe"。所以理论上,您可以一次调用订阅多个主题。
通过一次调用订阅多个主题会使错误处理变得困难(如果一个订阅成功而另一个订阅失败是错误吗?)因此一些库可能不支持这一点,而其他库则为单个主题订阅提供简化的语法。在 hive-mqtt-client(我假设您正在使用)中调用 topicFilter()
overrides any existing filter 这样您将获得对指定的最后一个主题的订阅。
已讨论在一次通话中订阅多个主题in the forum and it appears that there are a number of ways of achieving this (see this issue and this PR)。来自论坛的示例代码如下(我没有测试过):
mqtt3AsyncClient.subscribeWith()
.addSubscription().topicFilter(“tenant1/topic”).qos(MqttQos.AT_LEAST_ONCE).applySubscription()
.addSubscription().topicFilter(“tenant2/topic”).qos(MqttQos.AT_LEAST_ONCE).applySubscription()
.callback(e -> {})
.send();