go - 如何使用 paho.mqtt.golang 库订阅多个 MQTT 主题?

标签 go mqtt paho

我尝试连接到在外部服务器上运行的 MQTT 代理,我需要在其中处理多个不同的主题。问题是,只有最后一个订阅的处理程序被调用,即使主题与作为参数传递给 Subscribe() 方法的主题不匹配也是如此。

示例:p1/test 发送任何内容都会触发 registrationHandler,它只应监听“P1/controller/registration”。其他处理程序或 DefaultPublishHandler 永远不会被调用。

我的程序的简化版本:

func main(){
    var opts = MQTT.NewClientOptions()
    opts.AddBroker(address)
    opts.SetClientID("go-controller")

    opts.SetDefaultPublishHandler(func(client MQTT.Client, msg MQTT.Message) {
        log.Printf("topic: %s\n", msg.Topic())
    })

    client = MQTT.NewClient(opts)
    if token := client.Connect(); token.Wait() && token.Error() != nil {
        log.Panicln(token.Error())
    }

    client.Subscribe("P1/#", 0, logHandler)
    client.Subscribe("P1/controller/registration", 0, registrationHandler)
}

var logHandler MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
    ...
    log.Printf("Topic %s logged...\n", msg.Topic())
}

var registrationHandler MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
    ...
    log.Printf("Topic %s registered...\n", message.Value)
}

编辑#1

我发现订阅主题的顺序很重要。当我交换两个订阅调用时,将调用正确的处理程序。

最佳答案

对于 paho.mqtt.python 实现,一个客户端可以像这样在一个数组中一次调用订阅多个订阅

client.subscribe([("P1/#", 0),("P1/controller/registration", 0)])

它对数组中项目的顺序不敏感。这与“golang”语言实现无关,但我将其留在这里以供引用。

关于go - 如何使用 paho.mqtt.golang 库订阅多个 MQTT 主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50469066/

相关文章:

go - 如何记录请求正文(通过中间件)而不进行缓冲?

node.js - 如何将聊天与 nodejs 和 xmpp 集成到我现有的 Web 应用程序中?

android - MQTT Paho 客户端不会自动重新连接到代理

android - 选项卡 Activity 上的 Paho android 服务

go - Google的logadmin中的条目迭代器从不返回迭代器。

go - 更新全局变量的成员未反射(reflect)在全局变量中

go - 非对等服务器上的分布式计算

python - 使用 pika 在 python 中使用 SparkStreaming、RabbitMQ 和 MQTT

ssl - Apache camel - 带 SSL 的 MQTT

python - MQTT msg.payload 有趣的字符