MQTT现有客户端

时间:2016-10-15 08:19:58

标签: go mqtt paho

我正在使用eclipse paho golang库为特定客户端ID创建新的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 个答案:

答案 0 :(得分:1)

遗憾的是,没有办法查询MQTT服务器以找出它对您的客户端ID有效的订阅。当您使用与上一个会话相同的客户端ID连接时,服务器假定您具有与上次连接时相同的状态,但无法在Go客户端中预先连接MessageHandler和主题,这是添加的唯一方法并删除它们与订阅/取消订阅。

假设服务器工作正常,如果您按上述方式连接重用客户端ID,服务器将继续根据您以前的订阅向您发送消息,但Go客户端不知道如何处理它们因此将调用默认的消息处理程序。当前解决此问题的最佳方法是在OnConnectHandler中调用Subscribe(),假设您要订阅的主题是预先确定的而不是动态的。