2016-10-15 17 views
1

私は、特定のクライアントIDの新しいMQTTクライアントを作成するために日食PAHOのgolangライブラリを使用しています:MQTT既存のクライアント

func CreateMQTTClient(clientID string) (client MQTT.Client) { 
    username := viper.GetString("messaging.rabbitmq.username") 
    password := viper.GetString("messaging.rabbitmq.password") 
    host := viper.GetString("messaging.rabbitmq.host") 
    mqqtPort := viper.GetString("messaging.rabbitmq.mqqtPort") 
    rabbitMqMQQTURL := "tcp://" + host + ":" + mqqtPort 
    opts := MQTT.NewClientOptions().AddBroker(rabbitMqMQQTURL) 
    opts.SetClientID(clientID) 
    opts.Username = username 
    opts.Password = password 
    opts.SetCleanSession(false) 
    cli := MQTT.NewClient(opts) 

    if (!cli.IsConnected()) { 
     log.Println("I came here for cli:", clientID) 
     if token := cli.Connect(); token.Wait() && token.Error() != nil { 
      log.Print(token.Error()) 
     } 
    } 

    return cli 

} 

私はのclientIdを使用して戻ってこのクライアントを得るのですかわかりません。 CreateMQTTClientを再度呼び出すと、既存のサブスクリプションはすべて失われます。

答えて

1

MQTTサーバーに照会して、クライアントIDに対してどのサブスクリプションがアクティブであるか調べる方法はありません。以前のセッションと同じクライアントIDで接続すると、前回接続したときと同じ状態になっているとサーバーは想定していますが、GoクライアントのトピックでMessageHandlerを事前に接続する方法はありません。それを削除するには、購読/購読解除を行う。

上記のようにクライアントIDを再使用して接続すると、サーバーは以前のサブスクリプションに基づいてメッセージを送信しますが、Goクライアントはそれらの処理を知らないため、デフォルトのメッセージハンドラ。現在これを解決する最善の方法は、OnConnectHandlerでSubscribe()を呼び出すことです。購読したいトピックが動的ではなく事前に決められていると仮定します。

関連する問題