当前位置: 首页 > 面试题库 >

如何在python中使用Mosquitto发布文件?

呼延臻
2023-03-14
问题内容

我正在使用python-mosquitto订阅我的MQTT代理,该代理支持文件类型上传。从命令行在Mosquitto上使用-
f标志可以很好地使用它。但是,当我从python脚本中进行操作时,我无法弄清楚如何使用client.publish(topic,有效负载)指定要发布的文件。

TypeError: payload must be a string, bytearray, int, float or None.当我尝试向它扔一些奇怪的东西时,Python mosquitto给了我错误。我已经有一个文件存储在本地目录中,我想将其指定为发布的有效负载。

我对MQTT很有经验,但是我的python非常生锈,我假设我需要在此处执行某种类型的文件流功能,但不确定如何做到这一点。

我想在这里指定图片: mqttc.publish("/v3/device/file", NEED_TO_SPECIFY_HERE)

我尝试通过执行以下操作打开图像:

    f = open("/home/pi/mosq/imagecap/imagefile.jpg", "rb")
    imagebin = f.read()
    mqttc.publish("/v3/device/file", imagebin)

但这没有用,也没有用 mqttc.publish("/v3/device/file", bytearray(open('/tmp/test.png', 'r').read()))

client.publish不会引发错误,但是代理未正确接收文件。有任何想法吗?

谢谢!!


问题答案:

值得注意的是,这是Python 2和Python 3之间可能存在差异的领域之一。

Python 2file.read()返回a,str而Python
3返回bytesmosquitto.publish()处理这两种类型,因此在这种情况下应该可以,但这是需要注意的。

我在下面的@hardillb的代码中添加了我认为有一些小的改进。请不要优先接受我的回答,因为他是最初写的,并且先到达那里!我本来可以编辑他的答案,但是我认为看到差异很有用。

#!/usr/bin/python

import mosquitto

def on_publish(mosq, userdata, mid):
  # Disconnect after our message has been sent.
  mosq.disconnect()

# Specifying a client id here could lead to collisions if you have multiple
# clients sending. Either generate a random id, or use:
#client = mosquitto.Mosquitto()
client = mosquitto.Mosquitto("image-send")
client.on_publish = on_publish
client.connect("127.0.0.1")

f = open("data")
imagestring = f.read()
byteArray = bytes(imagestring)
client.publish("photo", byteArray ,0)
# If the image is large, just calling publish() won't guarantee that all 
# of the message is sent. You should call one of the mosquitto.loop*()
# functions to ensure that happens. loop_forever() does this for you in a
# blocking call. It will automatically reconnect if disconnected by accident
# and will return after we call disconnect() above.
client.loop_forever()


 类似资料:
  • 问题内容: 我使用JSoup使用以下代码发布值: 现在我也要提交文件。就像带有文件字段的表单一样。这可能吗 ?如果比怎么? 问题答案: 从Jsoup 1.8.2(2015年4月13日)开始,通过新方法才支持此功能。 在旧版本中,不支持发送请求。最好的选择是为此使用一个值得使用的HTTP客户端,例如Apache HttpComponents Client 。最终,您可以获得HTTP客户端响应,以便可

  • 问题内容: Python实际包含布尔值吗?我知道您可以做到: 但是我相当学究,喜欢在Java中看到布尔值。例如: Python中是否有布尔值之类的东西?我似乎在文档中找不到类似的内容。 问题答案: [编辑] 有关更多信息:http : //docs.python.org/library/functions.html#bool 您的代码也可以工作,因为在需要时会转换为。实际上,Python很长一段时

  • 我试图使用FetchAPI从一个输入中发布多个文件,但表单数据在附加后仍然为空 我看了看这里,这里,这里,这里和这里的答案,并尝试了他们都没有用 我使用Laravel框架作为后端,这是我的刀片视图文件 控制台记录一个空表单数据对象 这是后端的代码 在其中我得到一个空数组 真的不知道为什么这不起作用!你知道我做错了什么吗?

  • 问题内容: 我正在尝试在Django中使用jQuery / AJAX发布数据,并且遇到了麻烦。当我运行下面的代码并单击“测试”按钮时,整个页面将再次重新加载,这不是我想要的(这就是我使用AJAX的原因)。 我也无法确认AJAX请求正在进入Django视图。 编辑:我对return false和进行了编辑。无法加载新页面,但仍无法在该字段中看到更新的文本。我不确定是否正在发送数据。我在控制台中看到:

  • 问题内容: 我需要将主机上的端口映射到容器上的端口。我可以通过运行带有该选项的命令来实现。如何通过来实现这一目标?使用以下给出 我还能如何通过dockerfile公开暴露的端口? 问题答案: 你不能 究竟在Docker主机上发布哪些端口是本地管理员应做出的决定,而不是由他们试图运行的映像决定。这将是(a)一个安全问题(嘿,我刚刚打开了对您系统的ssh访问权限!),并且(b)容易出现故障(我的Web

  • 问题内容: 当我使用以下命令将文件发布到烧瓶服务器时,使用原始HTML可以从烧瓶请求全局访问文件: 在烧瓶中: 当我尝试对Axios执行相同操作时,烧瓶请求全局为空: 如果我使用上面相同的uploadFile函数,但从axios.post方法中删除标头json,则会在flask请求对象的表单键中获得字符串值的csv列表(文件为.csv)。 如何获取通过axios发送的文件对象? 问题答案: 将文件