基于GSM的远程设备连接Mosquitto MQTT Broker后连接被关闭求助
问题排查分析
1. 端口匹配疑点
服务器日志显示连接来自端口1833,但你设备代码中指定的是标准MQTT端口1883:
AT+CMQTTCONNECT=0,"tcp://52.XX.XX.XXX:1883",14,1,"userid12","password123"
1833通常是MQTT测试网端口,需重点确认:
- 服务器Mosquitto配置文件
mosquitto.conf中,listener是否正确监听1883端口 - 设备所在网络是否存在路由/防火墙规则,将1883端口的连接请求转发到了1833
- 直接在服务器上执行
netstat -tulpn | grep mosquitto,验证监听端口状态
2. AT命令执行结果未校验
你的代码仅发送AT命令,未读取模组返回的响应结果,这会直接导致无法定位具体失败环节:
- 每个AT命令执行后必须读取串口返回,判断是否成功:
AT+CMQTTSTART应返回OKAT+CMQTTACCQ=0,"xxx"成功会返回+CMQTTACCQ: 0,0AT+CMQTTCONNECT成功返回+CMQTTCONNECT: 0,0,失败会返回对应错误码(如1代表连接被拒绝、2代表网络不可达)
3. MQTT连接参数问题
(1)客户端ID有效性
服务器日志显示Client closed its connection,客户端ID为空是常见拒绝原因:
- 确认
MQTTClientID变量是否被正确赋值,是否为空 - 客户端ID需符合MQTT规范:无空格、长度1-23字符(MQTT 3.1),且不能与其他在线客户端重复
(2)连接超时参数不合理
AT+CMQTTCONNECT第3个参数是超时时间(秒),你设置的14对于GSM/LTE网络来说过短,建议调整为30或60,避免因网络延迟导致连接超时
(3)用户名密码一致性
虽然MQTTBox能正常连接,仍需确认代码中的userid12和password123是否与MQTTBox使用的完全一致,注意大小写、特殊字符的转义
4. 模组与网络连通性验证
- 先确认模组已正常附着网络:发送
AT+CGATT?,返回+CGATT: 1代表附着成功 - 测试服务器可达性:发送
AT+PING="52.XX.XX.XXX",验证能ping通目标服务器 - 尝试建立基础TCP连接:用
AT+CIPSTART="TCP","52.XX.XX.XXX",1883测试模组TCP栈是否正常工作
5. 服务器侧日志排查
- 将Mosquitto日志级别调至
debug,获取更详细的连接失败细节:mosquitto -c mosquitto.conf -v - 确认服务器防火墙是否允许该GSM设备的IP访问1883端口(即使MQTTBox能连,设备可能处于不同网段被拦截)
内容的提问来源于stack exchange,提问作者Lazzy Coder
相关产品推荐
相关产品推荐

