代码之家  ›  专栏  ›  技术社区  ›  NeitoFR

保持MQTT Go客户端运行

  •  0
  • NeitoFR  · 技术社区  · 7 年前

    我认为这是一个愚蠢的问题,我需要一个MQTT客户机在连接和订阅之后继续运行。我从来没有遇到过这个问题,因为我的MQTT客户机总是与HTTP服务器耦合在一起,并且当启动HTTP服务器时,代码不会停止运行。

    但是在本用例中,我只需要一个MQTT客户机来订阅某个主题并保持活动状态。

    下面是我要做的(该函数只需连接到一个代理并订阅到一个主题)

    func main() {
        godotenv.Load("./.env")
        _initMqttConnection()
    }
    

    我需要客户端保持连接,而不是在订阅完成后立即停止。

    怎么做这个简单的事情?

    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 回复  |  直到 7 年前