web-dev-qa-db-ja.com

golang mqttパブリッシュおよびサブスクライブ

無限ループでパブリッシュとサブスクライブの両方を行うMQTTクライアントGo(golang)コードの例を入手できる場所を誰も知っていますか?

MacOで実行されているMosquittoブローカーとメッセージをやり取りしています。

さらに詳細に...

  1. ネットワークからメッセージを取得する(トピック)
  2. そのメッセージに基づいて何かを計算する
  3. 計算の結果をネットワークに送信します(トピック)

私が使用しているコードは次のとおりです。

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で探しましたが、何も適切ではないようです。 「サブスクライブ」で無限ループを行うことは確かにできますが、それは非効率的です。

7
Phillip Neal

接続を開いたままにする方法についてのヒントをGoDocsで探しましたが、何も適切ではないようです。 「サブスクライブ」で無限ループを行うことは確かにできますが、それは非効率的です。

OK。で解決策を見つけました。 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
}
10
Phillip Neal