在服务器重新启动 mqtt 服务不起作用

时间:2021-06-01 14:15:04

标签: go mqtt

我的 mqtt.go 文件是这样写的:

// Publisher sends a message to an MQTT broker
type Publisher interface {
    Publish(topic string, qos byte, retained bool, payload interface{}) mqtt.Token
}

// PublisherImpl implements sending messages into a broker
type PublisherImpl struct {
    mqtt.Client
}

// Subscriber consumer of MQTT topic(s)
type Subscriber interface {
    Subscribe(topic string, handler handler.Handler)
    Disconnect(wait uint)
}

// SubscriberImpl implements sending messages into a broker
type SubscriberImpl struct {
    client mqtt.Client
}

// Disconnect closes connection to broker
func (s *SubscriberImpl) Disconnect(wait uint) {
    s.client.Disconnect(wait)
}

// Subscribe creates a new subscription to a handler
func (s *SubscriberImpl) Subscribe(topic string, handler handler.Handler) {
    go func() {
        token := s.client.Subscribe(topic, 0, handler.Handle)
        if token.Error() != nil {
            log.Println(token.Error())
        }
    }()
}

// NewPublisher Create new MQTT publisher instance
func NewPublisher(clientID string, uri string) Publisher {
    parsedURI := parseURI(uri)
    client := connect(clientID, parsedURI)
    return &PublisherImpl{
        client,
    }
}

// NewSubscriber Create new MQTT subscriber instance
func NewSubscriber(clientID string, uri string) Subscriber {
    parsedURI := parseURI(uri)
    client := connect(clientID, parsedURI)
    return &SubscriberImpl{
        client,
    }
}

func connect(clientID string, uri *url.URL) mqtt.Client {
    opts := createClientOptions(clientID, uri)
    client := mqtt.NewClient(opts)
    token := client.Connect()
    for !token.WaitTimeout(3 * time.Second) {
    }
    if err := token.Error(); err != nil {
        log.Fatal(err)
        panic(err)
    }
    return client
}

func createClientOptions(clientID string, uri *url.URL) *mqtt.ClientOptions {
    opts := mqtt.NewClientOptions()
    opts.AddBroker(fmt.Sprintf("tcp://%s", uri.Host))
    opts.SetUsername(uri.User.Username())
    password, _ := uri.User.Password()
    opts.SetPassword(password)
    opts.SetClientID(clientID)
    return opts
}

func parseURI(uriString string) *url.URL {
    url, err := url.Parse(uriString)
    if err != nil {
        panic(err)
    }
    return url
}

但是当我更新服务器上的代码并在此之后服务器重新启动时,这不起作用,即使接收发布数据但 Mqtt 事情也不起作用。也许我在这里遗漏了一些东西,比如重新启动时我需要检查客户端是否没有正确关闭?或者我缺少的东西不能让它运行?

我是新手,如果有任何错误,请忽略。

0 个答案:

没有答案