Ubuntu Docker部署ThingsBoard发MQTT数据连接被拒排查
ThingsBoard Docker环境MQTT发布报错定位
核心错误根因
从堆栈报错io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record可直接确定问题本质:
- 你访问的1883端口上,ThingsBoard的MQTT服务端开启了SSL/TLS加密校验逻辑
- 你通过mosquitto_pub发送的是无加密的明文MQTT报文,协议层不匹配,服务端会在TCP握手完成后直接丢弃报文,不会进入后续的设备认证、数据处理环节
已发现的操作误区
- 执行
lsof -i :1883查询不到端口监听结果,是因为未加sudo权限:Docker的端口代理进程归属root用户,普通权限的lsof无法读取其他用户的端口占用信息,正确查询命令为sudo lsof -i :1883 - 检索日志的路径存在错误:启动容器时已经将容器内的
/var/log/thingsboard目录映射到宿主机的~/.mytb-logs,宿主机本地的/var/log/thingsboard路径和当前Docker容器无关联,正确的日志查询命令为cat ~/.mytb-logs/thingsboard.log | grep ERROR - 原有mosquitto_pub命令存在两处格式问题:
- 消息载荷
{"temperature":28}未加单引号包裹,会被shell语法解析错误 -u参数后填写的占位符token没有替换为ThingsBoard平台对应设备生成的真实访问凭证
修复操作步骤
- 进入容器确认实际端口监听规则,执行命令:
sudo docker exec -it mytb netstat -tulpn | grep -E '1883|8883'
官方tb-postgres镜像的默认端口规则为:1883提供无加密的明文MQTT服务,8883提供强制SSL加密的MQTTS服务 - 若查询发现1883端口的监听逻辑被修改为强制SSL,可备份数据卷后删除旧容器,按默认配置重新启动:
docker run -it -p 9090:9090 -p 1883:1883 -p 8883:8883 -p 5683:5683/udp -v ~/.mytb-data:/data -v ~/.mytb-logs:/var/log/thingsboard --name mytb --restart always thingsboard/tb-postgres - 待容器启动完成后,使用修正后的命令发布测试数据:
mosquitto_pub -h "localhost" -p "1883" -t "v1/devices/me/telemetry" -u "替换为设备真实访问token" -m '{"temperature":28}'
内容的提问来源于stack exchange,提问作者bilirubina
相关产品推荐
相关产品推荐

