Поддерживайте работу клиента MQTT Go - PullRequest
0 голосов
/ 08 мая 2019

Я думаю, что это глупый вопрос, мне нужно, чтобы клиент 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)

в конце.

...