当前位置: 首页 > 知识库问答 >
问题:

java - 用eclipse.paho的MqttAsyncClient连接本地部署的emqx,用户名密码认证失败,如何解决?

邹嘉石
2024-04-01

在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测试
认证配置
emqx内置数据库用户密码配置截图
相关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服务端

emqx测试的版本是emqx-5.3.2-windows-amd64

共有1个答案

邹嘉石
2024-04-01

自己解决了,是要把"mqttClient.connect(connOpts, connStatus);"这段代码,改成如下的代码,才会启用用户名认证进行连接
mqttClient.connect(connOpts, null,connStatus)
效果反馈截图

 类似资料:
  • 问题内容: 我在应用程序中使用MongoDB 3.2。下面的代码演示了数据库初始化逻辑: 这段代码工作正常,现在我想向数据库引入访问级别分离。 步骤如下: 定义用户: 重新创建认证模式MongoDB的3.2服务: 。并运行它。 将连接字符串更改为 其中= 和= 。 使用相同的凭据检查IDEA中已验证的连接,一切正常。 执行我的应用程序并获取异常。 我的问题: 如何使用用户名和密码连接Java中的M

  • 如何初始化SDK并且让基本的用户名密码认证成功 通过阅读此文档,您可以完成用户密码登录认证,并成功启动VPN SDK 此文档默认已经集成SDK并且工程可以编译通过运行 您完全可以参考demo(特别是 AuthViewController.m)进行代码编写,但此文档仍然列出了必要的步骤 此文档只是参考,您应该根据具体需求因地适宜 此文档会略过如头文件import等基本概念与步骤,只介绍重要的概念 在

  • 我正在使用8.5.0运行时服务器运行我的项目,在部署期间,我发现以下错误 这里是配置。引用密钥存储的xml文件。资源目录中的jks文件

  • 警告:mysqli::mysqli():(HY000/1045):拒绝访问/home/domainname/public_html/autopublish/test.php中的用户'usernam'@'localhost'(使用密码:YES)。第8行连接失败:拒绝访问用户'usernam'@'localhost'(使用密码:YES)

  • 我正在尝试使用内联编辑器重新部署一个以前工作的Python云函数。不改变来源或要求。txt,部署失败,错误消息如下: 功能日志提供以下详细信息: 这种情况从上周五开始,一直持续到今天。我还尝试了使用gcloud函数进行本地部署,在部署时我收到了类似的错误消息:

  • 问题内容: 我正在开发客户端/服务器身份验证程序,但是遇到了问题。客户端可以很好地与服务器建立连接,但是一旦我输入密码和用户名,它就不会返回有效的用户名/密码。如果用户使用正确的用户名/密码服务器登录,则应返回“ Welcome,username”,如果无效,则返回“登录失败”。我查看了printwriter和bufferedreader文档,以确保我使用正确的方法在服务器/客户端之间正确传递文本