Go 服务器上重新启动mqtt服务不工作
我已经编写了类似以下内容的Go 服务器上重新启动mqtt服务不工作,go,mqtt,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 Pu
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
事情也不起作用。也许我在这里遗漏了一些东西,比如重新启动时,我需要检查客户端是否未正确关闭,也许?或者是我遗漏了什么,让它无法运行
我是一个新手,如果有任何问题,请忽略。您需要提供更多信息(例如,您何时调用
SubscriberImpl.Subscribe
-通常这将在OnConnect
中,但您没有设置)。理想情况下,提供一个(精确的代码,而不是“类似这样的东西”)。日志可以帮助您查看正在发生的事情(代理和日志)