繁体   English   中英

Python MQTT 订阅响应/确认发布 json

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM