Исключение в потоке "main" java.lang.IllegalArgumentException: не установлен NetworkModule для схемы "http" URI "http://xxx.xxx.xxx.xxx:xxxx" - PullRequest
0 голосов
/ 19 сентября 2019

В настоящее время я использую библиотеку eclipse / paho.mqtt.java для MQTT для своего проекта.это ссылка на библиотеку eclipse / paho.mqtt.java.

https://github.com/eclipse/paho.mqtt.java

Я хотел соединиться с MQTT по протоколу http.но оригинальная библиотека делает для протокола tcp.Я попытался установить соединение с mqtt, сделав клиент mqtt.Я покажу свой код ниже,

Извините за использование символов xxx в IP-адресах и URL-адресах.

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;


public class MQTT {
  public static void main(String[] args) {

    String topic        = "MQTT Examples";
    String content      = "Message from MqttPublishSample";
    int qos             = 2;
    //String broker       = "tcp://iot.eclipse.org:1883";
    String broker       = "http://xxx.xxx.xxx.xxx:xxxx";
    String clientId     = "JavaSample";
    MemoryPersistence persistence = new MemoryPersistence();

    try {
        MqttClient sampleClient = new MqttClient(broker, clientId, null);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        String accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        String pass = "";
        char[] charArr = pass.toCharArray();
        //I added in here my access token of the server
        connOpts.setUserName(accessToken);
        connOpts.setPassword(charArr);
        System.out.println("Connecting to broker: "+broker);
        sampleClient.connect(connOpts);
        System.out.println("Connected");
        System.out.println("Publishing message: "+content);
        MqttMessage message = new MqttMessage(content.getBytes());
        message.setQos(qos);
        sampleClient.publish(topic, message);
        System.out.println("Message published");
        sampleClient.disconnect();
        System.out.println("Disconnected");
        System.exit(0);
    } catch(MqttException me) {
        System.out.println("reason "+me.getReasonCode());
        System.out.println("msg "+me.getMessage());
        System.out.println("loc "+me.getLocalizedMessage());
        System.out.println("cause "+me.getCause());
        System.out.println("excep "+me);
        me.printStackTrace();
    }
  }
}

Отображается следующая ошибка,

Exception in thread "main" java.lang.IllegalArgumentException: no NetworkModule installed for scheme "http" of URI "http://xxx.xxx.xxx.xxx:xxxx"
at org.eclipse.paho.client.mqttv3.internal.NetworkModuleService.validateURI(NetworkModuleService.java:70)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:454)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:320)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:315)
at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:227)
at MQTT.main(MQTT.java:17)

Так, что я должен сделать для этого, например, затмение использовало протокол tcp в String broker ="tcp://iot.eclipse.org:1883";.но я хочу установить http для этого, я попытался добавить его как это, String broker = "http://xxx.xxx.xxx.xxx:xxxx"; затем получил ошибку выше, так что нужно сделать для этого.

1 Ответ

1 голос
/ 19 сентября 2019

Из вопроса неясно, что вы пытаетесь сделать, но это может помочь вам кое-что прояснить.

  1. MQTT - протокол Pub / Sub, HTTP - протокол ответа на запрос.,Вся парадигма отличается, вы не можете просто напрямую заменить одну на другую.
  2. MQTT обычно работает изначально поверх TCP / IP, но он также может работать с использованием Websockets в качестве транспортного уровня.Веб-сокеты загружаются через HTTP.

Схема URL-адресов брокера Paho (протоколы) может быть одной из следующих:

  • tcp:// Это собственный MQTTчерез TCP
  • ssl:// Это собственный MQTT через TCP с SSL / TLS
  • ws:// Это MQTT через веб-сокеты
  • wss:// Это MQTT через веб-сокеты с SSL/ TLS
  • local:// особый случай здесь не полезен.

Чтобы использовать что-либо, кроме базового MQTT через TCP (tcp://), вам необходимо настроить посредник наподдержите это как дополнительный слушатель на другом порту по умолчанию 1883.

...