Я думаю, что это глупый вопрос, мне нужно, чтобы клиент MQTT продолжал работать после подключения и подписки.Я никогда не сталкивался с проблемой, потому что мои MQTT-клиенты всегда связаны с HTTP-сервером, и при запуске HTTP-сервера код не останавливается.
Но в данном случае использования мне нужен только клиент MQTT, чтобы подписаться на какую-то тему и остаться в живых.
Вот что я делаю (функция просто подключается к брокеру и подписывается на одноготема.)
func main() {
godotenv.Load("./.env")
_initMqttConnection()
}
Мне нужно, чтобы клиент оставался на связи, а не останавливался сразу после завершения подписки.
Как выполнить эту простую вещь?
Редактировать 1: Полный код
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/yosssi/gmq/mqtt"
"github.com/yosssi/gmq/mqtt/client"
"github.com/joho/godotenv"
"github.com/skratchdot/open-golang/open"
)
var cli *client.Client
func _initMqttConnection() {
cli = client.New(&client.Options{
ErrorHandler: func(err error) {
fmt.Println(err)
},
})
defer cli.Terminate()
log.Println("Connecting to " + os.Getenv("mqtt_host"))
err := cli.Connect(&client.ConnectOptions{
Network: "tcp",
Address: os.Getenv("mqtt_host"),
UserName: []byte(os.Getenv("mqtt_user")),
Password: []byte(os.Getenv("mqtt_password")),
ClientID: []byte("mqtt_video_launcher"),
})
if err != nil {
log.Println("Error 1")
panic(err)
}
log.Println("Connected to MQTT")
topic_to_sub := []byte("/" + os.Getenv("video_topic"))
err = cli.Subscribe(&client.SubscribeOptions{
SubReqs: []*client.SubReq{
&client.SubReq{
TopicFilter: topic_to_sub,
QoS: mqtt.QoS0,
Handler: func(topicName, message []byte) {
//do struff with message
fmt.Println(string(topicName), string(message))
},
},
},
})
if err != nil {
panic(err)
}
log.Println("Subscription OK : " + string(topic_to_sub[:len(topic_to_sub)]))
}
func main() {
godotenv.Load("./.env")
_initMqttConnection()
}
Временное решение, которое я использую, добавляет:
http.ListenAndServe(":", nil)
в конце.