2016-11-22 121 views
0

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

回答

0
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

0

與代理的每個連接都必須有一個獨特的客戶端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(); 
    } 
}