在java上试图使用org.eclipse.paho.client.mqttv3连接连接本地部署的emq,emqx服务端的认证配置如下 * 内置数据库Password-Based, * 密码加密方式为plain, * 加盐方式为disable 使用"emqx_test"作为用户名,使用"emqx_test_password"作为密码。测试连接时,总是连接失败,提示如下异常org.eclipse.paho.client.mqttv3.MqttSecurityException: 错误的用户名或密码 at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:28) at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:1053) at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:151) at java.base/java.lang.Thread.run(Thread.java:840) 我在mqttx的mqtt协议调试软件上确定了"emqx_test"和"emqx_test_password"的用户名密码时没有问题的 截图: "mqttx测试" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/abd565a57dc62205dcd9519bfc29901d.png) "认证配置" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/365bf12260b88fdb975ac75c9baac904.png) "emqx内置数据库用户密码配置截图" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/aedab974d7175b386fc3f71690845820.png) 相关java设置代码 var brokerUrl="tcp://127.0.0.1:1883"; mqttClient = new MqttAsyncClient(brokerUrl, "test"); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setUserName("emqx_test"); connOpts.setPassword("emqx_test_password".toCharArray()); connOpts.setServerURIs(new String[] { brokerUrl }); connOpts.setCleanSession(true); // 设置回调函数 mqttClient.connect(connOpts, connStatus); 连接失败回调代码,连接总是响应REASON_CODE_FAILED_AUTHENTICATION的状态码 @Override public void onFailure(IMqttToken asyncActionToken, Throwable e) { // System.out.println("Failed to connect to the broker: " + // exception.getMessage()); if (e instanceof MqttException) { MqttException mqttEx = (MqttException) e; int reasonCode = mqttEx.getReasonCode(); if (reasonCode == MqttException.REASON_CODE_CLIENT_TIMEOUT) { log.error("mqtt连接失败,等待超时"); } else if (reasonCode == MqttException.REASON_CODE_FAILED_AUTHENTICATION) { log.error("连接失败,认证无效:",e); } else { System.out.println("Other connection failure reason: " + reasonCode); } } else { log.error("连接失败", e); } } 请问问题出在哪里? 我把emqx上的内置数据库认证功能关了,java的mqtt连接就能成功了。然后打开emqx网站,进入客户端那一页面查看连接的客户端,在用户名那一列发现java的mqtt客户端缺少用户名,是MqttConnectOptions配置缺失了什么东西吗? "无认证模式下的java连接成功的mqtt服务端" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/831fcd467e7454c701aaa11e16f4b1ea.png) emqx测试的版本是emqx-5.3.2-windows-amd64
是每个设备都创建数据库 还是一类设备(产品)创建一个数据库好 从资源消耗和性能方面来说? 我想每个设备都创建一个数据库, 这样可以方便的管理单个设备的数据过期时间等等, 但是每个数据库都会创建一个路径, 设备量大了之后, 比如几W个设备, 会不会影响文件系统性能和增加系统资源消耗 "9d686e38095a0133e18bcb175b56988.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241118/cb919b944545616e4e7204b17d842e51.png) "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241118/c19141334323f600f4b609617821e744.png)
MQTT这边有个消费端,订阅了对应主题,messageArrived接收订阅的消息。handle方法就是不走数据库直接插入到redis,后期再消费。现在五千个设备,如果每隔1小时同时向MQTT这边上报数据,消费端这边设置了10个线程,这种写法会丢失数据吗? ExecutorService executorService = Executors.newFixedThreadPool(10); public synchronized void messageArrived (final String topic, MqttMessage message ) throws Exception { final String msg = new String(message.getPayload()); // System.err.println("【MQTT-消费端】接收消息主题 : " + topic); // System.err.println("【MQTT-消费端】接收消息内容 : " + msg); executorService.execute(new Runnable() { public void run() { handle(topic,msg); } }); }
想请教本地PHP调试远端长连接的方法 人数不足,前端也去帮忙写写后端的服务(PHP)。 我知道出接口的任务,是本地跑测试库,写接口,启动项目,拿postman直接自测。 但是遇到这种与第三方长连接的,同事直接在宝塔上编写代码,再自测。 我心想两个人不走git,直接在服务器上编写,冲突了,或者看历史代码怎么办。 他们的理由是,外面购买的农业相关设备,数据传输到我们指定的ip服务器上,不能在本地环境测试 服务上跑的有tp6 workerman 设备通过mqtt发数据到我们服务器 曾经在长连接的那个php服务加了个xDebug,想接到本地,但是没成功