Исключение NullPointerException при подключении к онлайн-брокеру Mqtt

#java #mqtt #mosquitto #paho

#java #mqtt #mosquitto #paho

Вопрос:

Я пытаюсь подключиться к онлайн-брокеруhttps://test.mosquitto.org используя приведенный ниже код и библиотеку Paho на Java:

 private final String brokerURI = "test.mosquitto.org:1883"; //should be changed to 8883 with SSL
try { //tentativo di creazione del client
        client = new MqttClient(brokerURI, idClient); <--NullPointerException here
        client.setCallback(new ClientCallback(codaTopic, codaMessaggi, finestra)); //set delle callback
        setConnectionOptions(); //set delle opzioni connessione
        client.connect(opzioni); //connessione al server
    } catch (MqttException e) {
        System.err.println(e.getMessage());
        System.err.println("Connessione fallita Client, riavviare il sistema.");
    }
  

Здесь задаются параметры подключения:

     private void setConnectionOptions() {
    opzioni = new MqttConnectOptions();
    opzioni.setAutomaticReconnect(true);
    opzioni.setCleanSession(false);
    opzioni.setConnectionTimeout(30);
    opzioni.setKeepAliveInterval(60);
}
  

но оно продолжает показывать a NullPointerException при создании MqttClient . В частности, консоль отображает:

 Exception in thread "Thread-3" java.lang.NullPointerException
at org.eclipse.paho.client.mqttv3.MqttConnectOptions.validateURI(MqttConnectOptions.java:489)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:291)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:185)
at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:226)
at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:138)
at client.Client.run(Client.java:78)
  

Как я могу подключиться и использовать SSL?
В сети ни одно из руководств не было полезным, я уже скачал mosquitto.org.crt файл для SSL-соединения, но я не знаю, где его использовать, и я не нашел никаких руководств.

РЕДАКТИРОВАТЬ
Изменение BrokerUri на
private final String brokerURI = "tcp://test.mosquitto.org:1883"; //indirizzo broker
консоль показывает ошибку

 Client non connesso (32104)
at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:31)
at org.eclipse.paho.client.mqttv3.internal.ClientComms.sendNoWait(ClientComms.java:166)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.subscribe(MqttAsyncClient.java:835)
at org.eclipse.paho.client.mqttv3.MqttClient.subscribe(MqttClient.java:322)
at org.eclipse.paho.client.mqttv3.MqttClient.subscribe(MqttClient.java:315)
at client.Client.subscribe(Client.java:214)
at client.Client.run(Client.java:89)
  

при попытке подписаться на раздел с инструкцией

 client.subscribe(topic, 1);
  

Аргумент темы — это строка, содержащая название темы.

Комментарии:

1. И что такое idClient?

2. idClient представляет собой простую строку, обычно с именем типа «mario» или подобным

Ответ №1:

URI Mosquitto нуждается в протоколе. Взглянув на его исходный код, вот где генерируется ваше исключение, класс MqttConnectOpts.java :

 protected static int validateURI(String srvURI) {
    try {
        URI vURI = new URI(srvURI);
        if (!vURI.getPath().equals("")) {
            throw new IllegalArgumentException(srvURI);
        }
        if (vURI.getScheme().equals("tcp")) {
            return URI_TYPE_TCP;
        }
        else if (vURI.getScheme().equals("ssl")) {
            return URI_TYPE_SSL;
        }
        else if (vURI.getScheme().equals("local")) {
            return URI_TYPE_LOCAL;
        }
        else {
            throw new IllegalArgumentException(srvURI);
        }
    } catch (URISyntaxException ex) {
        throw new IllegalArgumentException(srvURI);
    }
}
  

Таким образом, он принимает 3 типа префиксов протокола: tcp, ssl, local . Что касается вашего примера, вы могли бы попробовать это таким образом:

  • TCP

      private final String brokerURI = "tcp://test.mosquitto.org:1883";
      
  • SSL

     private final String brokerURI = "ssl://test.mosquitto.org:8883";