You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用paho-mqtt实现跨VM的MQTT消息触发发布功能

问题排查与修正方案

你的代码存在几个关键问题,导致无法实现预期的跨VM消息响应功能,具体问题和修正方案如下:

核心问题分析

  • 未订阅目标主题:客户端没有订阅"test"主题,根本接收不到该频道的消息
  • 回调函数设置时机错误:client.on_message 应该在客户端连接前设置,而非放在死循环里反复赋值
  • payload字符串处理错误:str(msg.payload) 会把字节流转换成类似"b'hello'"的格式,无法和"Hello"匹配,需要解码为UTF-8字符串
  • 未启动消息循环:paho-mqtt客户端需要通过消息循环处理网络通信、接收消息等逻辑,你的代码没有启动循环,客户端无法正常工作

修正后的代码

#!/usr/bin/env python3

import paho.mqtt.client as mqtt

server = "192.168.200.221"

# 先定义消息回调函数
def on_message(client, userdata, msg):
    # 将字节类型的payload解码为UTF-8字符串,去除首尾空白字符
    received_msg = msg.payload.decode('utf-8').strip()
    # 匹配消息内容(统一大小写判断,避免大小写差异导致匹配失败)
    if received_msg.lower() == "hello":
        # 发布回复消息到"test"频道
        client.publish("test", "hi")
        print("已自动回复'hi'")

# 创建客户端实例,客户端ID需在MQTT服务器中唯一
client = mqtt.Client("VM2")
# 设置消息接收回调
client.on_message = on_message

# 连接MQTT服务器
client.connect(server)
# 订阅"test"主题
client.subscribe("test")

# 启动阻塞式消息循环,保持客户端持续运行以接收消息
client.loop_forever()

额外说明

  • 确保两台VM都能正常访问MQTT服务器(192.168.200.221),网络连通性无问题
  • VM1的消息发布示例代码(供参考):
#!/usr/bin/env python3
import paho.mqtt.client as mqtt

server = "192.168.200.221"
client = mqtt.Client("VM1")
client.connect(server)
client.publish("test", "hello")
client.disconnect()
  • 客户端ID(如"VM1"、"VM2")必须在MQTT服务器中唯一,否则会导致连接冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:05:19