Mqtt代理,关闭旧连接

问题描述:

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

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(); 
    } 
} 

如果客户端ID是一样的,有错误。

ConnectionLost,原因:(32109) - java.io.EOFException的

+0

请解释清楚你问这里。 – hardillb

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是一样的,它有错误:

ConnectionLost,cause:(32109) - java.io.EOFException

+0

你应该编辑这个问题来添加它,而不是添加它作为答案。这次我为你添加了它。 – hardillb

与代理的每个连接都必须有一个独特的客户端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(); 
    } 
}