我认为这是一个愚蠢的问题,我需要一个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)
最后。
答案 0 :(得分:0)
你必须让程序无限运行,或者除非你想明确地结束它(Cntrl c)。对我有用的一个很好的解决方案是在退出主函数之前等待一个通道,该通道可以继续监听中断。
例如:
func main() {
keepAlive := make(chan os.Signal)
signal.Notify(keepAlive, os.Interrupt, syscall.SIGTERM)
// All your code
<-keepAlive
}