2016-10-15 6 views
1

Я использую затмение Pāho библиотеки golang создать новый клиент MQTT для конкретного идентификатора клиента: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, чтобы узнать, какие подписки он активен для вашего идентификатора клиента. Когда вы подключаетесь к тому же идентификатору клиента, что и предыдущий сеанс, сервер предполагает, что у вас такое же состояние, как и в последний раз, когда вы были подключены, но нет возможности предварительно подключить MessageHandler с темой в клиенте Go, единственный способ добавить и удалить их с помощью Подписки/Отказаться от подписки.

Предполагая, что сервер работает правильно, если вы подключаетесь, как указано выше, повторно используя идентификатор клиента, сервер будет продолжать отправлять вам сообщения в соответствии с вашими предыдущими подписками, но клиент Go не знает, что с ними делать, поэтому вызывается обработчик сообщения по умолчанию. Лучшим способом решения этой проблемы будет вызов функции Subscribe() в OnConnectHandler, предполагая, что темы, на которые вы хотите подписаться, являются предопределенными, а не динамическими.