【问题标题】:Mqtt broker, closing old connectionMqtt broker,关闭旧连接
【发布时间】:2017-04-06 08:18:18
【问题描述】:

mqtt 客户端具有相同的客户端 ID。 如何关闭旧连接? 就这样。

New connection from 192.168.3.57 on port 1883.
1479826181: Client paho166768969170988 already connected, closing old connection.
1479826181: Client paho166768969170988 disconnected.
1479826181: New client connected from 192.168.3.57 as paho166768969170988 (c1, k60, u'admin').

编辑:

 String clientId ="**public_cloud**";
    try {
        MqttClient sampleClient = new MqttClient(config.getBroker(), clientId);
        sampleClient.setCallback(new PushCallback());

        MqttTopic mtopic = sampleClient.getTopic(config.getTopic());

        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        connOpts.setConnectionTimeout(100);
        connOpts.setKeepAliveInterval(200);
        connOpts.setUserName(config.getUsername());
        connOpts.setPassword(config.getPassword().toCharArray());
        connOpts.setWill(mtopic, "close".getBytes(), 0, true);

        sampleClient.connect(connOpts);
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

如果clientid相同,则有错误。

连接丢失,原因:(32109) - java.io.EOFException

【问题讨论】:

  • 请在这里更清楚地解释您的要求。

标签: connection mqtt broker


【解决方案1】:

到代理的每个连接都必须有一个唯一的客户端 ID。这是 MQTT 规范的一部分。代理如何处理具有现有客户端 ID 的新连接,但大多数会断开最旧的连接。

在您看到的情况下,通常的解决方法是使用随机生成的客户端 ID 或当前时间戳

long time = new Date().getTime();
String clientId ="public_cloud" + time;
    try {
        MqttClient sampleClient = new MqttClient(config.getBroker(), clientId);
        sampleClient.setCallback(new PushCallback());

        MqttTopic mtopic = sampleClient.getTopic(config.getTopic());

        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        connOpts.setConnectionTimeout(100);
        connOpts.setKeepAliveInterval(200);
        connOpts.setUserName(config.getUsername());
        connOpts.setPassword(config.getPassword().toCharArray());
        connOpts.setWill(mtopic, "close".getBytes(), 0, true);

        sampleClient.connect(connOpts);
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

【讨论】:

    【解决方案2】:
     String clientId ="**public_cloud**";
        try {
            MqttClient sampleClient = new MqttClient(config.getBroker(), clientId);
            sampleClient.setCallback(new PushCallback());
    
            MqttTopic mtopic = sampleClient.getTopic(config.getTopic());
    
            MqttConnectOptions connOpts = new MqttConnectOptions();
            connOpts.setCleanSession(true);
            connOpts.setConnectionTimeout(100);
            connOpts.setKeepAliveInterval(200);
            connOpts.setUserName(config.getUsername());
            connOpts.setPassword(config.getPassword().toCharArray());
            connOpts.setWill(mtopic, "close".getBytes(), 0, true);
    
            sampleClient.connect(connOpts);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
    

    如果clientId相同,则报错:

    连接丢失,原因:(32109) - java.io.EOFException

    【讨论】:

    • 您应该编辑问题以添加此内容,而不是将其添加为答案。这次我给你加了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2015-11-14
    • 2015-08-17
    相关资源
    最近更新 更多