MQTT现有客户端

MQTT existing client

我正在使用 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,所有现有订阅都会丢失。

不幸的是,没有办法查询 MQTT 服务器以找出它为您的客户端 ID 激活了哪些订阅。当您使用与前一个会话相同的客户端 ID 连接时,服务器假定您具有与上次连接时相同的状态,但是没有办法在 Go 客户端中预先连接一个 MessageHandler 和一个主题,唯一的方法是添加并使用 Subscribe/Unsubscribe.

删除它们

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