You need to enable JavaScript to run this app. Lua开发MQTT客户端连接本地Mosquitto Broker被拒及发布报错排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 07:54:03