登录
首页 >  Golang >  Go问答

确保 MQTT Go 客户端持续运行

来源:stackoverflow

时间:2024-03-24 23:27:33 295浏览 收藏

为了确保 MQTT Go 客户端在连接和订阅后持续运行,需要采取措施防止程序终止。常见的做法是让程序无限运行或等待一个通道,该通道可以持续监听中断信号。通过在退出主函数之前等待该通道,客户端可以保持连接状态,直到收到终止信号(例如,通过按 Ctrl+C)。

问题内容

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

在最后。


解决方案


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

例如:

func main() {

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

    // All your code

    <-keepAlive
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《确保 MQTT Go 客户端持续运行》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>