Как подписаться на несколько тем 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', но я оставлю это здесь для справки.