线程 "main" java.lang.IllegalArgumentException 中的异常:没有为 URI "http://xxx.xxx.xxx.xxx:xxxx" 的方案 "http" 安装 NetworkModule

Exception in thread "main" java.lang.IllegalArgumentException: no NetworkModule installed for scheme "http" of URI "http://xxx.xxx.xxx.xxx:xxxx"

我目前正在为我的项目使用 MQTT eclipse/paho.mqtt.java 库。这是 eclipse/paho.mqtt.java 库的 link。

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

我想通过 http 协议连接 MQTT。但是原始库是为 tcp 协议制作的。我试图通过制作一个 mqtt 客户端来与 mqtt 建立连接。我将在下面显示我的代码,

抱歉在 IP 地址和 URL 中使用 xxx 符号。

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)

那么我应该为此做些什么,例如eclipse在String broker ="tcp://iot.eclipse.org:1883";中使用了tcp协议。 但我想为此设置 http,我尝试将其添加为这样, String broker = "http://xxx.xxx.xxx.xxx:xxxx";然后得到上面的错误,那么应该怎么做。

从问题中不清楚您要做什么,但这可能有助于为您澄清一些事情。

  1. MQTT是Pub/Sub协议,HTTP是请求响应协议。整个范式是不同的,你不能直接用一个代替另一个。
  2. MQTT 通常 运行 在 TCP/IP 之上,但它也可以 运行 使用 Websockets 作为传输层。 Websockets 通过 HTTP 进行引导。

Paho 客户端代理中的 URL 架构(协议)可以是以下之一:

  • tcp:// 这是基于 TCP 的原生 MQTT
  • ssl:// 这是基于 TCP 的原生 MQTT SSL/TLS
  • ws:// 这个基于 Websockets 的 MQTT
  • wss:// 这是基于 Websockets 的 MQTT SSL/TLS
  • local:// 特例在这里没有用。

为了使用除基于 TCP 的基本 MQTT (tcp://) 以外的任何东西,您需要将代理配置为支持它作为与默认 1883 不同的端口上的额外侦听器。