2017-05-03 9 views
1

は私がgolang、 によってMQTTサブクライアントを構築するためにpaho PKGをしようとしていますし、ブローカーの切断が、私はメッセージappearを失っすべきだと思うとき、私は私のクライアントに問題があるが、これは起こらない、と私は、ブローカを起動した場合、 mqttサブクライアントはmqtt pubクライアントから送信されたメッセージを取得できません。mqttブローカとの接続が失われているかどうかを確認する方法は?

なぜこれが起こり、どうすれば修正できるのでしょうか?

コード

package main 

import (
    "fmt" 
    "os" 

    mqtt "github.com/eclipse/paho.mqtt.golang" 
) 

var (
    broker      = "tcp://localhost:1883" 
    f  mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { 
     fmt.Printf("TOPIC: %s\n", msg.Topic()) 
     fmt.Printf("MSG: %s\n", msg.Payload()) 
    } 
) 

func main() { 
    //create a ClientOptions 
    opts := mqtt.NewClientOptions().AddBroker(broker) 
    opts.SetClientID("group-one") 
    opts.SetDefaultPublishHandler(f) 

    //create and start a client using the above ClientOptions 
    c := mqtt.NewClient(opts) 
    if token := c.Connect(); token.Wait() && token.Error() != nil { 
     panic(token.Error()) 
    } 

    if token := c.Subscribe("test", 0, nil); token.Wait() && token.Error() != nil { 
     fmt.Println(token.Error()) 
     os.Exit(1) 
    } 

    for { 

    } 
} 

答えて

2

クライアントが接続を失うたびに、追加のアクションを実行できるように、接続失われたイベントをキャッチするカスタムOnConnectionLostHandlerを割り当てます。 AutoReconnectオプションをtrue(デフォルトの動作)に設定すると、クライアントは接続が失われた後に自動的にブローカに再接続します。接続が失われた後、購読状態/情報がブローカによって保存されない可能性があるので、メッセージを受信することはできません。この問題に対処するには、トピックサブスクリプションをOnConnectハンドラに移動してください。以下の例の実装です:

package main 

import (
    "fmt" 
    "os" 
    "time" 

    mqtt "github.com/eclipse/paho.mqtt.golang" 
) 

func messageHandler(c mqtt.Client, msg mqtt.Message) { 
    fmt.Printf("TOPIC: %s\n", msg.Topic()) 
    fmt.Printf("MSG: %s\n", msg.Payload()) 
} 

func connLostHandler(c mqtt.Client, err error) { 
    fmt.Printf("Connection lost, reason: %v\n", err) 

    //Perform additional action... 
} 

func main() { 
    //create a ClientOptions 
    opts := mqtt.NewClientOptions(). 
     AddBroker("tcp://localhost:1883"). 
     SetClientID("group-one"). 
     SetDefaultPublishHandler(messageHandler). 
     SetConnectionLostHandler(connLostHandler) 

    //set OnConnect handler as anonymous function 
    //after connected, subscribe to topic 
    opts.OnConnect = func(c mqtt.Client) { 
     fmt.Printf("Client connected, subscribing to: test/topic\n") 

     //Subscribe here, otherwise after connection lost, 
     //you may not receive any message 
     if token := c.Subscribe("test/topic", 0, nil); token.Wait() && token.Error() != nil { 
      fmt.Println(token.Error()) 
      os.Exit(1) 
     } 
    } 

    //create and start a client using the above ClientOptions 
    c := mqtt.NewClient(opts) 
    if token := c.Connect(); token.Wait() && token.Error() != nil { 
     panic(token.Error()) 
    } 

    for { 
     //Lazy... 
     time.Sleep(500 * time.Millisecond) 
    } 
} 
+0

は答えてくれてありがとう、私は[OnConnectionLostHandler](https://github.com/eclipse/paho.mqtt.golang/blob/master/options.go#L100)だと思いますデフォルトで私は接続を失った私に通知する必要があります! –

+1

デフォルトのハンドラはメッセージを出力するだけです(上記の例はメッセージを出力します...)。つまり、カスタム接続が失われたハンドラを割り当てると、メッセージを印刷するだけではなく、さまざまな処理を行うことができます。紛失した接続の数をカウントし、電子メールなどで通知を送信します。 – putu

+0

'OnConnectionLostHandler'は接続を失った場合は何も表示しません。 –

関連する問題