2016-04-22 108 views
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代理的最佳方式是什么?

回答

0

您可以使用MqttConnectOptions.setAutomaticReconnect(true)启用自动重新连接。

相关问题