使MQTT Go客户端保持运行

时间:2019-05-08 10:19:34

标签: go mqtt

我认为这是一个愚蠢的问题,我需要一个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)

最后。

1 个答案:

答案 0 :(得分:0)

你必须让程序无限运行,或者除非你想明确地结束它(Cntrl c)。对我有用的一个很好的解决方案是在退出主函数之前等待一个通道,该通道可以继续监听中断。

例如:

func main() {

    keepAlive := make(chan os.Signal)
    signal.Notify(keepAlive, os.Interrupt, syscall.SIGTERM)

    // All your code

    <-keepAlive
}