Python MQTT订阅响应/ack以使用json发布



我正试图获得一个MQTT订阅者响应,其中包含一条到发布者的消息/ack。如果我使用字符串,它可以很好地工作,但当我使用简单的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()需要一个字符串。

您还应该NOT创建一个新的客户端来发布消息,只需使用已连接的客户端即可。

最新更新