Lua开发MQTT客户端连接本地Mosquitto Broker被拒及发布报错排查
问题成因定位与修复方案
代码层面的确定故障点
- 端口配置逻辑缺失且分支写错:当前代码仅在
USE_TLS=true的分支内执行端口设置,实际运行场景下USE_TLS=false,整个端口配置逻辑不会被触发,客户端从未获得明文MQTT连接需要的端口参数。同时TLS分支内将加密连接的端口设为1883,和Mosquitto默认端口规则(明文连接1883、TLS加密连接8883)完全不匹配,就算切到TLS模式也会连接失败。 - 遗漏主动连接流程:初始化完IP参数后没有主动调用
client:connect()建立和Broker的MQTT会话,客户端从未完成TCP握手、MQTT协议交互流程,直接调用publish方法时会抛出连接被拒绝的异常,这和错误栈定位在publish行的表现完全吻合。 - publish参数格式不符合运行时要求:调用
publish时传入的QoS、保留位参数为字符串形式,这类适配IO-Link设备的Lua MQTT客户端,通常要求QoS传入数字(0对应QOS0、1对应QOS1、2对应QOS2),保留位传入布尔值(false对应NO_RETAIN、true对应RETAIN),传入字符串会被参数校验拦截,触发连接类异常。
可能的Broker侧配置诱因
- 若新版Mosquitto修改过强制认证规则,本地连接未提供有效用户名密码时会被直接拒绝,返回连接被拒绝的错误,表现和客户端侧故障完全一致。
修正后的代码实现
客户端初始化逻辑
local client = MQTTClient.create() local BROKER_IP = '127.0.0.1' local USE_TLS = false client:setIPAddress(BROKER_IP) if USE_TLS then -- TLS加密场景使用8883端口,替换原错误的1883配置 client:setPort(8883) client:setTLSEnabled(true) client:setTLSVersion('TLS_V12') client:setCABundle('resources/mosquitto/mybroker-cert.pem') client:setClientCertificate( 'resources/mosquitto/mqtt-client-cert-2.pem', 'resources/mosquitto/mqtt-client-key-2.pem', 'changemeclient' ) -- 主动触发连接流程,根据返回值判断连接状态 local connectCode = client:connect() if connectCode ~= 0 then print("TLS MQTT连接失败,错误码:" .. connectCode) end else -- 明文场景显式配置1883端口,补全原有缺失的逻辑 client:setPort(1883) -- 主动触发连接流程 local connectCode = client:connect() if connectCode ~= 0 then print("明文MQTT连接失败,错误码:" .. connectCode) end end
数据发布逻辑
if dataValid == 'PI_STATUS_VALID' then local sDistance = string.format('%d', distance) -- 替换字符串形式的QoS、retain参数为库要求的原生类型 client:publish('/topic/test', sDistance, 0, false) end
排查验证步骤
- 调用系统自带的Mosquitto命令行工具验证连通性:运行
mosquitto_pub -h 127.0.0.1 -t /topic/test -m "test" -q 0,如果命令行也返回连接拒绝,说明问题出在Broker配置侧,可检查mosquitto.conf中1883监听器启用状态、匿名连接开关、强制认证规则的配置。 - 若Broker开启了账号密码认证,需要在客户端连接前补充调用
client:setUsername("Broker配置的用户名")、client:setPassword("Broker配置的密码")参数。
内容的提问来源于stack exchange,提问作者WhatIsProtocoll
相关产品推荐
相关产品推荐

