1
我对某些应用程序使用MQTT客户机Java库,我认为我正在以不良方式重新连接到Broker。现在我有一个处理MQTT操作的类,如连接,断开连接,发布和订阅。如何使用Paho驱动程序重新连接到MQTT
public class MqttConnection {
private static final String BROKER_ADDRESS = Preferences.getProperty("mqtt-address");
private static final String BROKER_PORT = Preferences.getProperty("mqtt-port");
private static final String BROKER_URI = "tcp://" + BROKER_ADDRESS + ":" + BROKER_PORT;
private static final String VHOST = Preferences.getProperty("mqtt-vhost");
private static final String USERNAME = Preferences.getProperty("mqtt-username");
private static final String PASSWORD = Preferences.getProperty("mqtt-password");
private static MqttClient client;
private static final Logger logger = LogManager.getLogger(MqttConnection.class);
static {
try {
client = new MqttClient(BROKER_URI, MqttClient.generateClientId());
} catch (MqttException ex) {
logger.fatal(ex);
}
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable thrwbl) {
logger.info("MQTT : Perte de connexion...");
MqttConnection.start();
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// CODE HERE
}
@Override
public void deliveryComplete(IMqttDeliveryToken imdt) { }
});
}
public static void start() {
connect();
}
private static void connect() {
if (!client.isConnected()) {
try {
if (Preferences.getProperty("mqtt-isauth").equalsIgnoreCase("true")) {
MqttConnectOptions options = new MqttConnectOptions();
String username = (VHOST.equals("")) ? USERNAME : VHOST + ":" + USERNAME;
options.setUserName(username);
options.setPassword(PASSWORD.toCharArray());
client.connect(options);
} else {
client.connect();
}
logger.info("MQTT : Connecté au broker.");
} catch (MqttException ex) {
logger.fatal(ex);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
logger.fatal(e);
}
connect();
}
}
}
private static void subscribe() {
if (client.isConnected()) {
try {
client.subscribe("+/SWI1");
} catch (MqttException e) {
logger.fatal(e);
}
}
}
}
但它似乎打开许多连接,当它试图重新连接,并使经纪人的错误。 重新连接到MQTT代理的最佳方式是什么?