Python paho-mqtt用户名密码连接MQTT Broker配置问题问询
问题核心原因
你对client.connect()的返回值理解错了,这个方法的返回值0不代表MQTT连接成功完成鉴权,也和用户名密码配置对错没有关系。
paho-mqtt的connect()是异步非阻塞方法,返回0仅代表客户端成功发起了TCP连接请求,后续的MQTT协议握手、用户名密码校验、订阅操作都依赖客户端的网络循环来处理,你当前的代码根本没有启动网络循环,自然永远拿不到真实的连接结果,改不改用户名密码都会拿到相同的connect返回值。
修复步骤
- 补全网络循环启动逻辑
connect()调用之后必须启动网络事件循环,客户端才会处理服务端返回的CONNACK响应、触发你写的on_connect/on_message回调、维持心跳保活。你可以直接在代码最后加client.loop_forever()阻塞监听消息,如果需要在连接后跑其他业务逻辑,就换成client.loop_start()启动后台循环线程。 - 核对端口与连接配置
- 1883是默认非加密MQTT端口,如果你使用的是加密端口(通常为8883),不能直接连1883,还需要在
connect()前调用client.tls_set()加载CA证书配置启用TLS加密,否则连接会直接被服务端断开。 - 启动循环后观察
on_connect回调打印的rc值,这才是MQTT层真实的连接结果码:rc=0:连接成功rc=4:用户名或密码错误rc=5:当前账号无连接权限
其他返回码可以直接对照paho-mqtt官方文档匹配对应错误原因。
- 1883是默认非加密MQTT端口,如果你使用的是加密端口(通常为8883),不能直接连1883,还需要在
- 前置网络连通性校验
如果加上循环后on_connect回调始终不触发,先在本地执行端口探测命令确认网络层连通:
排除本地防火墙、安全组拦截端口的问题。telnet 你的Broker地址 对应端口
修正后可运行的基础代码
import paho.mqtt.client as mqtt import time username="temp" password="temp" # 收到服务端CONNACK响应时的回调 def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) # 连接成功后再订阅,断连重连后会自动重新订阅 client.subscribe("extapi/data/esm") # 收到订阅消息的回调 def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.username_pw_set(username, password) # 如果使用8883加密端口,取消下面这行注释并配置对应CA证书路径 # client.tls_set(ca_certs="你的CA证书路径") client.connect("example.io", 1883, 60) # 启动阻塞网络循环,开始处理消息 client.loop_forever()
内容的提问来源于stack exchange,提问作者Sirre
相关产品推荐
相关产品推荐

