【发布时间】: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)。只要没有输入,程序就不会停止,连接将保持打开状态。