使用 Paho MQTT 订阅消息时如何读取标头键:值对

问题描述

我在使用 pika like 向我的 rabbitmq 代理发布消息时添加一个标头键:值对

channel.basic_publish(exchange=self.exchange,routing_key=self.routing_key,properties=pika.BasicProperties(
                          headers={'key': 'value'} 
                      ),body=message)

在我的客户端,我使用 websockets 订阅 Paho MQTT 的主题。如何使用 Paho MQTT 检索相同的消息标头。我尝试了以下对我不起作用的方法

def onMessage(client,userdata,message):

    print("topic: " + message.topic + ",message: " + str(message.payload,'utf-8'))
    print(client.headers)
    print(userdata.headers)
    print(message.headers)

更新

我发现该消息具有“属性属性。但是当我尝试 print(message.properties) 时,它给了 AttributeError: properties

解决方法

Pika 是一个 AMQP 客户端,以 AMQP 格式发布消息。

Paho 是一个 MQTT 客户端,因此只能处理该格式的消息。在 MQTT v3(Paho Python 客户端尚不支持 MQTT v5)中,该协议没有任何范围来保存消息属性。 MQTT v3 消息的唯一属性是 topicpayloadQOSretained 位。

因此,在将消息从队列移动到 MQTT 主题之前,RabbitMQ 代理必须进行格式转换并剥离属性。

所以基本上我是说 MQTT 消息中没有要读取的属性。

编辑: 看起来最新版本的 Paho Python 客户端确实支持 MQTTv5(该文档尚未更新)。虽然 MQTTv5v 确实支持标头中的键/值对属性,但这将取决于使用 MQTTv5 和 RabbitMQ 实际连接的客户端是否支持 MQTTv5 并将值复制到新格式。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...