golang mqtt发布和订阅

时间:2018-02-19 18:43:41

标签: go mqtt mosquitto paho

有没有人知道我在哪里可以得到一些示例MQTT客户端Go(golang)代码,它在无限循环中同时发布和订阅?

我正在与在MacOs上运行的Mosquitto代理进行消息传递。

更详细......

  1. 从网络上获取消息(主题)
  2. 根据该消息计算某些内容
  3. 将计算结果发送回网络(主题)
  4. 以下是我正在使用的代码:

    package main
    
    import (
    "fmt"
     MQTT "github.com/eclipse/paho.mqtt.golang"
    "os"
    "time"
    )
    
    var knt int
    
    var f MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) 
    { 
       fmt.Printf("MSG: %s\n", msg.Payload())
       text:= fmt.Sprintf("this is result msg #%d!", knt)
       knt++
       token := client.Publish("nn/result", 0, false, text)
       token.Wait()
    }
    
    func main() {
       knt = 0
    
       opts := MQTT.NewClientOptions().AddBroker("tcp://localhost:1883")
       opts.SetClientID("mac-go")
       opts.SetDefaultPublishHandler(f)
    
       c := MQTT.NewClient(opts)
       if token := c.Connect(); token.Wait() && token.Error() != nil {
            panic(token.Error())
       }
    
      if token := c.Subscribe("nn/sensors", 0, nil); token.Wait() && 
         token.Error() != nil {
         fmt.Println(token.Error())
         os.Exit(1)
      }
    
      time.Sleep(3 * time.Second)
    } //end of main
    

    我通过GoDocs查看了如何保持连接打开的一些提示,但似乎没有任何相关内容。我当然可以做一个无限循环 通过'订阅'但这似乎效率低下。

1 个答案:

答案 0 :(得分:6)

我通过GoDocs查看了如何保持连接打开的一些提示,但似乎没有任何相关内容。我当然可以对订阅'进行无限循环。但这似乎效率低下。

确定。找到解决方案。 https://github.com/eclipse/paho.mqtt.golang/blob/master/cmd/stdoutsub/main.go。 基本上,我必须为订阅打开一个频道。 这是新代码:

package main

import (
    "fmt"
    MQTT "github.com/eclipse/paho.mqtt.golang"
    "os"
    "os/signal"
    "syscall"
)

var knt int
var f MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
    fmt.Printf("MSG: %s\n", msg.Payload())
    text := fmt.Sprintf("this is result msg #%d!", knt)
    knt++
    token := client.Publish("nn/result", 0, false, text)
    token.Wait()
}

func main() {
    knt = 0
    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt, syscall.SIGTERM)

    opts := MQTT.NewClientOptions().AddBroker("tcp://localhost:1883")
    opts.SetClientID("mac-go")
    opts.SetDefaultPublishHandler(f)
    topic := "nn/sensors"

    opts.OnConnect = func(c MQTT.Client) {
            if token := c.Subscribe(topic, 0, f); token.Wait() && token.Error() != nil {
                    panic(token.Error())
            }
    }
    client := MQTT.NewClient(opts)
    if token := client.Connect(); token.Wait() && token.Error() != nil {
            panic(token.Error())
    } else {
            fmt.Printf("Connected to server\n")
    }
    <-c
}