#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";