使用Paho MQTT客户端通过Mosquitto传输文件失败问题求助
MQTT文件传输故障排查与修复
问题分析
你的代码存在两个关键问题,导致文件无法正常传输:
- 发布端未等待连接与消息发送完成:Paho MQTT的
connect()是异步非阻塞方法,直接调用publish后立即disconnect,会导致消息还未发送就断开连接,代理根本没收到消息。 - 接收端存在错误冗余代码:接收端里的
client.publish(topic, message, retain=True)完全多余,且message变量未定义,会触发NameError,导致接收端无法正常运行。
修正后的发布端代码
import paho.mqtt.client as mqtt # 代理配置 broker_address = "127.0.0.1" port = 1883 topic = "test" keep_alive_time = 18 * 60 * 60 file_path = "D:/FSP/OTA//ftpserverpython/public/u2a16_startup.mot" # 读取文件二进制内容 with open(file_path, 'rb') as file: message = file.read() client = mqtt.Client() # 连接成功回调(可选,用于确认连接状态) def on_connect(client, userdata, flags, rc): if rc == 0: print("已成功连接到MQTT代理") else: print(f"连接失败,错误码:{rc}") client.on_connect = on_connect # 连接代理并启动后台网络事件循环 client.connect(broker_address, port, keep_alive_time) client.loop_start() # 发布消息,设置QoS=1确保消息送达,等待发布完成 publish_result = client.publish(topic, message, qos=1, retain=True) publish_result.wait_for_publish() # 停止循环并断开连接 client.loop_stop() client.disconnect() print("二进制文件已成功发布")
修正后的接收端代码
import paho.mqtt.client as mqtt # 代理配置 broker_address = "127.0.0.1" port = 1883 topic = "test" keep_alive_time = 18 * 60 * 60 output_file_path = "D:/FSP/OTA/mqttclient//file/b.mot" # 消息接收回调 def on_message(client, userdata, message): with open(output_file_path, 'wb') as file: file.write(message.payload) print(f"文件已保存至:{output_file_path}") client = mqtt.Client() # 先设置消息回调,再连接代理 client.on_message = on_message client.connect(broker_address, port, keep_alive_time) # 订阅主题 client.subscribe(topic) print("等待接收文件...") # 启动永久循环处理网络事件 client.loop_forever()
额外注意事项
- 如果文件大小超过1MB,需要修改Mosquitto配置文件(
mosquitto.conf),添加message_size_limit 10485760(以10MB为例),并重启代理。 - 使用
QoS=1或QoS=2可以提升大文件传输的可靠性,避免丢包。 - 确保接收端的输出目录(
D:/FSP/OTA/mqttclient//file/)已存在,否则会触发文件写入错误。
内容的提问来源于stack exchange,提问作者Tất Đạt Nguyễn
相关产品推荐
相关产品推荐

