[英]Python MQTT subscribe response/ack to publish with json
我正在尝试通过向发布者发送消息/确认来获取 MQTT 订阅者响应。 如果我使用字符串,效果很好,但是当我使用简单的 JSON 时,我会崩溃。 我不明白我做错了什么?
def on_message(client, userdata, msg):
print(msg.topic+' '+str(msg.payload))
message = json.loads(msg.payload)
id = message['id']
if id == 'foo123':
mqttc.connect(broker,broker_port,60)
time.sleep(3)
mqttc.publish(topic, 'ACK')
client = mqtt.Client()
client.connect(broker, broker_port, 60)
client.on_connect = on_connect
client.on_message = on_message
client.loop_forever()
有了这段代码,我得到了关注
client.loop_forever()
File "/usr/local/lib/python3.9/site-packages/paho/mqtt/client.py", line 1779, in loop_forever
rc = self.loop(timeout, max_packets)
File "/usr/local/lib/python3.9/site-packages/paho/mqtt/client.py", line 1181, in loop
rc = self.loop_read(max_packets)
File "/usr/local/lib/python3.9/site-packages/paho/mqtt/client.py", line 1572, in loop_read
rc = self._packet_read()
File "/usr/local/lib/python3.9/site-packages/paho/mqtt/client.py", line 2310, in _packet_read
rc = self._packet_handle()
File "/usr/local/lib/python3.9/site-packages/paho/mqtt/client.py", line 2936, in _packet_handle
return self._handle_publish()
File "/usr/local/lib/python3.9/site-packages/paho/mqtt/client.py", line 3216, in _handle_publish
self._handle_on_message(message)
File "/usr/local/lib/python3.9/site-packages/paho/mqtt/client.py", line 3444, in _handle_on_message
self.on_message(self, self._userdata, message)
File "", line 22, in on_message
message = json.loads(msg.payload)
File "/usr/local/Cellar/python@3.9/3.9.0_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python@3.9/3.9.0_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python@3.9/3.9.0_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
我不明白的是为什么它适用于字符串但不适用于 JSON。应该是同一回事吗?
编辑
问题是当 ACK 字符串返回时,它期望 JSON 而不是字符串。
def on_message(client, userdata, msg):
print(msg.topic+' '+str(msg.payload))
if msg.payload != b'ACK':
try:
message = json.loads(msg.payload)
except Exception as e:
print("Couldn't parse raw data: %s" % msg.payload, e)
id = message['id']
print(type(id))
print(id)
if id == 'foo123':
time.sleep(3)
client.publish(topic, 'ACK')
在str()
中包装msg.payload
例如
def on_message(client, userdata, msg):
print(msg.topic+' '+str(msg.payload))
message = json.loads(str(msg.payload))
id = message['id']
if id == 'foo123':
client.publish(topic, 'ACK')
msg.payload
是字节数组而不是字符串,而json.loads()
需要一个字符串。
您也不应该创建新的客户端来发布消息,只需使用已连接的客户端即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.