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

时间:2018-05-22 13:33:06

标签: 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

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

1 个答案:

答案 0 :(得分:0)

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

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

它对Array中的项目顺序不敏感。这与' golang'无关。语言实现,但我把它留在这里供参考。