java - 线程“main”中的异常 java.lang.IllegalArgumentException:没有为 URI“http://xxx.xxx.xxx.xxx:xxxx”的方案“http”安装 NetworkModule
问题描述
我目前正在为我的项目使用 MQTT eclipse/paho.mqtt.java 库。这是 eclipse/paho.mqtt.java 库的链接。
https://github.com/eclipse/paho.mqtt.java
我想用 http 协议连接 MQTT。但原始库为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)
那么我该怎么做呢,例如 eclipse 已经tcp
在String broker ="tcp://iot.eclipse.org:1883";
. 但是我想为此设置http
,我尝试将其添加为this,
String broker = "http://xxx.xxx.xxx.xxx:xxxx";
然后出现上述错误,那么应该怎么做。
解决方案
从问题中不清楚您要做什么,但这可能有助于为您澄清一些事情。
- MQTT 是 Pub/Sub 协议,HTTP 是请求响应协议。整个范式是不同的,你不能直接用一个代替另一个。
- MQTT 通常在 TCP/IP 之上本地运行,但它也可以使用 Websockets 作为传输层运行。Websockets 通过 HTTP 进行引导。
Paho 客户端代理 URL 架构(协议)中的 可以是以下之一:
tcp://
这是基于 TCP 的本机 MQTTssl://
这是带有 SSL/TLS 的 TCP 上的本机 MQTTws://
这个基于 Websockets 的 MQTTwss://
这是 MQTT over Websockets with SSL/TLSlocal://
特殊情况在这里没有用。
为了使用除基于 TCP ( tcp://
) 的基本 MQTT 之外的任何内容,您需要配置代理以支持此作为在默认 1883 的不同端口上的额外侦听器。
推荐阅读
- r - 基于结果循环回归和运行列总和
- excel - 我有 4 个从表单中获得的值,我想将这些值粘贴到工作表中
- reactjs - 使用 React 连接到 express 后端时遇到问题
- javascript - 如何使用 useState 设置朋友?
- go - 切片使用不当会导致意想不到的副作用
- sql - 如何在 golang 应用程序中创建具有多个 JSON 参数的 SQL 查询?
- nginx - 谁导致了这个“502 Bad Gateway nginx”?
- r - 如何获取使用 write.xlsx 或 R 中的其他函数保存的文件的文件路径?
- android - Intent 用于打开带有特定搜索文本的谷歌地图
- java - 使用 google bot 的网页收集器