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(),假设您要订阅的主题是预先确定的而不是动态的。
我正在使用 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(),假设您要订阅的主题是预先确定的而不是动态的。