Как прочитать ключ заголовка: пара значений при подписке на сообщение с помощью Paho MQTT

#python-3.x #rabbitmq #mqtt #paho #pika

#python-3.x #rabbitmq #mqtt #paho #pika

Вопрос:

Я добавляю пару ключ заголовка: значение при публикации сообщения моему брокеру rabbitmq, используя pika, например

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

На моей стороне клиента я подписываюсь на тему с помощью Paho MQTT с помощью websockets. Как я могу получить тот же заголовок сообщения, используя 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

Ответ №1:

Pika — это клиент AMQP, публикующий сообщения в формате AMQP.

Paho является клиентом MQTT и, как таковой, может обрабатывать сообщения только в этом формате. В MQTT v3 (клиент Paho Python еще не поддерживает MQTT v5) протокол не имеет какой-либо области для хранения атрибутов сообщения. Единственными свойствами, которые имеет сообщение MQTT v3, являются topic , payload , QOS и retained бит.

Таким образом, брокер RabbitMQ должен выполнять преобразование формата и удаление атрибутов перед перемещением сообщения из очереди в раздел MQTT.

Итак, по сути, я говорю, что в сообщении MQTT нет атрибутов для чтения.

РЕДАКТИРОВАТЬ: похоже, что последняя версия клиента Paho Python поддерживает MQTTv5 (документ просто не был обновлен). Хотя MQTTv5v поддерживает атрибуты пары ключ / значение в заголовке, это будет зависеть от того, действительно ли клиент подключается с помощью MQTTv5 и RabbitMQ, поддерживающих как MQTTv5, так и копирование значений в новый формат.

Комментарии:

1. Привет @hardillb, если мы опубликуем полезную нагрузку и заголовок с помощью paho MQQT в rabbitmq, можем ли мы получить заголовок с помощью paho MQQT на стороне клиента?

2. Нет, как я уже сказал, в MQTT v3 нет поддержки пар ключ-значение

3. итак, вы предполагаете, что в настоящий момент для этого нет решения, верно?

4. Я думаю, что уже несколько раз говорил это очень четко

5. На самом деле похоже, что последняя версия клиента Paho Python поддерживает MQTT v5. Я отредактировал ответ, чтобы прояснить это.