无法将文件从 linux 机器传输到 windows 机器(通过 mqtt)

物联网 MQTT
2021-06-25 13:44:01

我正在使用 Mosquitto 代理在我的 Windows 机器上运行一个 MQTT 代理。我已经通过 Paho MQTT python 库在同一台 Windows 机器上设置了一个客户端。另一个客户端是在我拥有的 Linux 机器上使用相同的 python 库设置的。

因此,当我从 Windows 客户端发布文件时,它可以轻松到达 Linux 客户端,没有任何问题。但是,当我尝试从 Linux 客户端发布文件时,它无法到达我的 Windows 客户端。后来我注意到如果文件大小大于50KB,文件不会从linux机器传输。如果文件大小超过 50KB,来自代理的日志不会显示“收到的发布消息”。

Windows机器发布的代码:

import paho.mqtt.client as mqtt
import time


client = mqtt.Client("P2")
client.on_message=on_message
print("COnnecting")
client.connect("localhost")
print("Connected")
f = open("D:/Downloads/test.txt",'rb')
imagestring = f.read()
byteArray = bytearray(imagestring)



print("Publishing")

client.publish("photo", byteArray)

Linux机器订阅代码:

import paho.mqtt.client as mqtt
import time


def on_message(mosq, obj, msg):
  with open('test.txt', 'wb') as fd:
    fd.write(msg.payload)
    print("message topic=",msg.topic)

client = mqtt.Client("P1")
client.on_message=on_message
print("COnnecting")
client.connect("192.168.1.115")

client.loop_start()

print("Subbing")
client.subscribe("photo")

time.sleep(1000)

client.loop_stop()

Windows机器订阅的代码:

import paho.mqtt.client as mqtt
import time


def on_message(mosq, obj, msg):
  with open('test.txt', 'wb') as fd:
    fd.write(msg.payload)
    print("message topic=",msg.topic)

client = mqtt.Client("P2")
client.on_message=on_message
print("COnnecting")
client.connect("localhost")

client.loop_start()

print("Subbing")
client.subscribe("photo")

time.sleep(1000)

client.loop_stop()

Linux机器发布的代码:

import paho.mqtt.client as mqtt
import time

client = mqtt.Client("P1")
print("COnnecting")
client.connect("192.168.1.115")
print("Connected")
f = open("/opt/plcnext/test.txt","rb")
imagestring = f.read()
byteArray = bytearray(imagestring)



print("Publishing")

client.publish("photo", byteArray)

Linux机器端有什么限制吗?还是我在这里做错了什么?

1个回答

您的发布代码也需要运行客户端循环,否则它只会发送 1 个 TCP/IP 数据包,这会将发送大小限制为网络上的 MTU。

添加与客户端循环运行相同的时间段将起作用,但更好的解决方案是使用 Paho 库中包含的单发包装器,以确保在关闭连接之前完全发送消息。文档可以在这里找到

import paho.mqtt.publish as publish

f = open("/opt/plcnext/test.txt","rb")
imagestring = f.read()
byteArray = bytearray(imagestring)

publish.single("paho/test/single", byteArray, hostname="192.168.1.115")