【问题标题】:Keep a MQTT Go client running保持 MQTT Go 客户端运行
【发布时间】:2019-05-08 10:19:34
【问题描述】:

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

最后。

【问题讨论】:

  • 您能否提供一个最小且完整的代码示例,包括您正在使用的实际 mqtt 库的导入?
  • 你可以查看这个问题的答案stackoverflow.com/questions/48872360/…我认为这也会对你有所帮助。本质上,他们创建了一个等待输入的通道 (SIGTERM)。只要没有输入,程序就不会停止,连接将保持打开状态。

标签: go mqtt


【解决方案1】:

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

例如:

func main() {

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

    // All your code

    <-keepAlive
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多