Поместите темы MQTT и сообщение в массив

Я ПОЛНЫЙ новичок в python и имею очень базовые знания MQTT.

Я пытаюсь написать скрипт Python, который подписывается на тему с подстановочным знаком, а затем создает список тем под подстановочным знаком. Я понимаю, что протокол MQTT для этого не подходит, поэтому мне нужно сделать это через python. Я думал о размещении темы и сообщения в массиве.

У меня есть следующие темы:

/погода/текущая/температура

/погода/текущее/влажность

/погода/течение/давление

/погода/текущее/время

В моем скрипте Python я подписываюсь на /weather/current/#.

Например, я думаю, что массив будет примерно таким:

[/погода/текущая/температура,сообщение]

[/погода/текущая/влажность,сообщение]

[/погода/текущее/давление,сообщение]

[/погода/текущее/время,сообщение]

Мой сценарий в значительной степени представляет собой стандартный пример, в котором я попробовал несколько методов для достижения этого, но потерпел неудачу. Я думаю, что моя основная проблема заключается в непонимании функции on_message. Выполняется ли он один раз для всех тем или один раз для каждой темы?

def on_connect(mqttc, obj, rc):
    print("rc: "+str(rc))

def on_message(mqttc, obj, msg,):
    # print(msg.topic+" "+str(msg.payload))
    payload = str(msg.payload)
    print(msg.topic+" Payload -> "+payload)

def on_publish(mqttc, obj, mid):
    print("mid: "+str(mid))

def on_subscribe(mqttc, obj, mid, granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_log(mqttc, obj, level, string):
    print(string)

try:
    mqttc = mqtt.Client("Python-MQTT-Sub")

    mqttc = mqtt.Client()
    mqttc.on_message = on_message
    mqttc.on_connect = on_connect
    mqttc.on_publish = on_publish
    mqttc.on_subscribe = on_subscribe
    # Uncomment to enable debug messages
    #mqttc.on_log = on_log
    mqttc.connect("localhost", 1883, 60)
    mqttc.subscribe("/weather/current/#", 0)

    mqttc.loop_forever()

except KeyboardInterrupt:
    print("\ninterrupt received, exiting...")

person Gregg    schedule 26.03.2014    source источник


Ответы (2)


Как сказал @ralight выше, on_message вызывается при получении сообщения (которое может быть или не быть сохраненным сообщением). Чтобы проиллюстрировать это, я немного изменил ваш код, добавив массив с именем topic_names, который заполняется по мере поступления сообщений в программу.

import paho.mqtt.client as mqtt 

topic_names = []

def on_message(mqttc, obj, msg,):
    # print(msg.topic + " " + str(msg.payload))
    payload = str(msg.payload)
    print(msg.topic + " Payload -> " + payload)

    topic_names.append(msg.topic)

try:
    mqttc = mqtt.Client()
    mqttc.on_message = on_message

    mqttc.connect("localhost", 1883, 60)
    mqttc.subscribe("weather/current/#", 0)

    mqttc.loop_forever()

except KeyboardInterrupt:
    print "Received topics:"
    for topic in topic_names:
        print topic

Запуск этой программы и публикация в ней двух сообщений показывает

weather/current/temp Payload -> Fair
weather/current/humidity Payload -> 10
^C
weather/current/temp
weather/current/humidity
person jpmens    schedule 26.03.2014

on_message будет вызываться при получении сообщения от брокера. Это может быть сообщение для любой темы, на которую вы подписаны, /weather/current и выше. Все сообщения — это отдельные события, даже если вы использовали только одну подписку.

Еще один незначительный момент - обычно не рекомендуется жестко кодировать идентификатор клиента, если только вы не используете clean session, установленный в false. Повторяющиеся идентификаторы клиентов приводят к тому, что вы отключаетесь от брокера. Либо сгенерируйте что-то уникальное самостоятельно, либо оставьте client_id отсутствующим в вызове Client(), который затем будет использовать значение по умолчанию None, что означает, что идентификатор клиента генерируется для вас случайным образом.

И последнее: нет реальной необходимости начинать темы с косой черты, если у вас нет других причин для этого. Начальная косая черта фактически добавляет дополнительный уровень иерархии, при этом первый уровень представляет собой пустую строку. Это не совсем то, что вы могли бы ожидать, поэтому в некоторых ситуациях это может сбивать с толку.

person ralight    schedule 26.03.2014
comment
Большое спасибо за указатели. Я использую ponte в качестве брокера, и я думаю, что ему нужна косая черта в начале, я не дома для тестирования. Я проверю и дам вам знать. - person Gregg; 28.03.2014
comment
(Момент лампочки!!!) Ваше объяснение идентификатора клиента и on_message также объяснило бы, почему я боролся с mqtt на моем Arduino YUN. Еще раз, большое спасибо за указатели, высоко присвоено. - person Gregg; 28.03.2014