You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Paho Python实现类JavaScript的MQTT订阅并解决收不到消息问题?

解决Paho Python MQTT订阅无法接收消息的问题

我来帮你搞定这个问题!先给你一个最简的仅订阅Paho Python代码,然后再聊聊容易踩的坑,帮你排查为什么收不到消息。

最简订阅代码示例

先把这个基础代码跑起来,记得替换成你自己的MQTT Broker信息和主题:

import paho.mqtt.client as mqtt

# 连接成功后的回调函数
def on_connect(client, userdata, flags, rc):
    # rc=0表示连接成功,其他数值对应不同错误
    print(f"已连接到MQTT Broker,返回码: {rc}")
    # 替换成你JS代码中使用的目标主题,注意大小写和格式完全匹配
    client.subscribe("your/target/topic", qos=0)

# 收到消息时的回调函数
def on_message(client, userdata, msg):
    # 解析消息内容(假设是UTF-8编码的字符串)
    payload = msg.payload.decode("utf-8")
    print(f"\n收到消息:")
    print(f"主题: {msg.topic}")
    print(f"内容: {payload}")

# 创建客户端实例,client_id建议设为唯一值,避免和JS客户端重复
client = mqtt.Client(client_id="python_sub_001", clean_session=True)

# 绑定回调函数
client.on_connect = on_connect
client.on_message = on_message

# --- 以下根据你的Broker配置调整 ---
# 如果Broker需要用户名密码认证,取消注释并填写信息
# client.username_pw_set("your_username", "your_password")

# 如果你的JS代码用的是WebSocket连接(比如ws://或wss://),要指定transport参数
# 示例:WebSocket非加密端口通常是8083,加密是8084
# client.connect("your_broker_host", port=8083, keepalive=60, transport="websockets")

# 默认TCP连接(端口通常1883,加密是8883),替换成你的Broker地址
client.connect("your_broker_address", port=1883, keepalive=60)

# 启动消息循环,保持客户端运行
client.loop_forever()

常见排查点(你大概率是这里出了问题)

  1. 主题完全匹配:MQTT主题区分大小写,通配符也要对应。比如JS订阅的是sensor/temp,Python别写成Sensor/Temp或者sensor/#(除非JS确实在发布子主题消息)。
  2. Broker地址和端口对应:JS如果用的是WebSocket,Python必须指定transport="websockets",端口也要换成WebSocket的(比如8083),不能用默认的TCP端口1883。
  3. 客户端ID唯一性:很多Broker不允许重复的客户端ID,如果你JS和Python用了同一个ID,会被Broker踢掉其中一个,导致收不到消息。
  4. 认证信息一致:如果你的Broker开启了用户名密码认证,Python代码必须加上username_pw_set,和JS用的账号密码保持一致。
  5. QoS等级兼容:订阅的QoS等级要大于等于发布端的QoS。比如JS用QoS=1发布,Python订阅至少要设QoS=1或0(0是兼容的)。
  6. 连接状态验证:看on_connect里的返回码rc,如果不是0,对照错误码排查:
    • rc=1:协议版本不兼容
    • rc=2:客户端ID无效
    • rc=3:Broker不可用
    • rc=4:用户名/密码错误

内容的提问来源于stack exchange,提问作者Arun Pt

火山引擎 最新活动