python-3.x - paho mqtt:使用 python 3 编译时输出不正确
问题描述
我想建立一个 mqtt 连接。我想在 Python3 中做到这一点。
这是客户端代码的一部分:
def on_message(client, userdata, message):
print("Received message '" + str(message.payload) + "' on topic '"
+ message.topic + "' with QoS " + str(message.qos))
if message.payload == "Hello":
print("Received message #1. Do something.")
# do something
if message.payload == "World":
print("Received message #2. Do something else.")
# do something
我基本上是在给定主题下向该客户端发布消息“World”和“Hello”,但根据我使用的 python 版本,我收到不同的结果。
这是输出,当我用 python2 编译时:(这是我想要的输出)
pi@raspberrypi:~/Desktop $ python Client.py Connection returned result: 0 Received message 'Hello' on topic 'Wulff/test' with QoS 0 Received message #1. Do something. Received message 'World' on topic 'Wulff/topic' with QoS 0 Received message #2. Do something else.
这是我使用 python3 编译时的输出:
pi@raspberrypi:~/Desktop $ python3 Client.py Connection returned result: 0 Received message 'b'Hello'' on topic 'Wulff/test' with QoS 0 Received message 'b'World'' on topic 'Wulff/topic' with QoS 0 Received message 'b'Hello'' on topic 'Wulff/test' with QoS 0 Received message 'b'World'' on topic 'Wulff/topic' with QoS 0`
我不明白为什么程序无法识别此处的消息有效负载。
使用不同版本的python运行程序时需要注意什么?我已经在 Python2 和 Python3 上安装了必要的模块。
解决方案
这是因为在 Python 3 中,消息负载现在被认为是一个字节数组(实际上应该一直这样对待它)
可以使用以下内容将其转换为字符串:
def on_message(client, userdata, message):
payload = message.payload.decode()
print("Received message '" + payload + "' on topic '"
+ message.topic + "' with QoS " + str(message.qos))
if payload == "Hello":
print("Received message #1. Do something.")
# do something
if payload == "World":
print("Received message #2. Do something else.")
# do something
推荐阅读
- selenium - 如何在 selenium webdriver 中的 java 页面中的重复标签中选择一个
- java - AlarmManager 有更好的选择吗?
- python - 相关对象的 Django 模型约束
- c++ - 链接 OpenCV 4.1.0,包括工作,库不
- javascript - 我可以将 JS 脚本放在页脚上方而不是标签之前的页脚下方吗
- image - 如何从 Matlab 中的每个循环中收集值?
- java - @WebInitParam 值在 JSP 中为空
- postgresql - postgresql:在命令行中使用 psql 运行 SQL 命令
- sql - VBA - 将 SQL 表中的所有行导入 Excel
- oracle - 如何在线获取 Oracle SQL Worksheet 中未命名的 PL/SQL 块的输出?它显示 SET SERVEROUTPUT ON 的命令不受支持;