HiveMQ Java客户端自动重连未携带用户名密码导致Mosquitto认证失败问询
问题根因
当前认证参数配置在单次connectWith()调用中,仅对首次连接生效,HiveMQ客户端自动重连逻辑不会复用单次连接请求的参数,导致重连时未携带用户名密码触发鉴权失败。
修复方案
将simpleAuth认证配置移到MQTT客户端全局Builder初始化阶段,全局配置会被自动重连逻辑复用,修改后代码如下:
val mqttClient = MqttClient.builder().useMqttVersion5() .identifier(UUID.randomUUID().toString()) .serverHost("10.0.2.2") .serverPort(1883) .automaticReconnectWithDefaultConfig() // 全局配置认证信息,自动重连时会自动携带 .simpleAuth() .username("guest") .password("guest".toByteArray()) .applySimpleAuth() .addConnectedListener { Log.d("MqttHelper", "addConnectedListener => $it") } .addDisconnectedListener { Log.d("MqttHelper", "addDisconnectedListener => ${it.cause}") } .buildAsync() // 首次连接无需重复配置认证参数 mqttClient.connectWith().send() .whenComplete { connAck, throwable -> if (throwable != null) { Log.e("MqttHelper", "connect error", throwable) // handle failure } else { Log.d("MqttHelper", "Connected successfully => connAck: $connAck") } }
验证说明
- 首次连接成功后断开网络,待网络恢复时可通过客户端日志确认重连是否成功
- 如有需要可在Mosquitto broker侧查看连接日志,确认重连请求是否携带用户名密码参数
内容的提问来源于stack exchange,提问作者AR Soft
相关产品推荐
相关产品推荐

