Как подписаться на несколько тем MQTT с помощью библиотеки paho.mqtt.golang?

Я пытаюсь подключиться к брокеру 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 ответ

Для реализации paho.mqtt.python один клиент может подписаться на несколько подписок одним вызовом в массиве следующим образом

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

Он не чувствителен к порядку элементов в массиве. Это не связано с реализацией языка 'golang', но я оставлю это здесь для справки.

Другие вопросы по тегам