Как подписаться на несколько тем MQTT с помощью библиотеки paho.mqtt.golang? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь подключиться к брокеру MQTT, работающему на внешнем сервере, где мне нужно обрабатывать несколько разных тем.Проблема в том, что только последний подписанный обработчик называется , даже если тема не соответствует теме, переданной в качестве параметра методу Subscribe().

Пример: отправка любого контента на p1/test запускает регистратор регистрации, который должен только прослушивать « 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)
}

EDIT # 1

Я обнаружилчто вопрос подписки на темы имеет значение.Когда я переставляю обе подписки, меняются правильные обработчики.

1 Ответ

0 голосов
/ 22 мая 2018

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

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

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

...