python mqtt-отключение paho после публикации

#python #mqtt #paho

#python #mqtt #paho

Вопрос:

Я пытаюсь опубликовать одно сообщение в MQTT и отключиться с помощью следующего кода. Но иногда это работает, иногда работает не так, как ожидалось. Я хочу прослушать тему о том, включается ли ОС switch1, затем выключается, затем включается на основе полученных данных и отключается.

 #!/usr/bin/env python2.7
import json
import time
import os
import paho.mqtt.client as mqtt

mqtt_host = os.getenv('HOST', 'xxxx')
mqtt_port = os.getenv('PORT', 1883)
mqtt_username = os.getenv('USERNAME', 'xxxx')
mqtt_password = os.getenv('PASSWORD', 'xxxx')
mqtt_subacribe_topic = os.getenv('SUBSCRIBE_TOPIC', 'xxxx')
mqtt_publish_topic = os.getenv('PUBLISH_TOPIC', 'xxxx')
sleep_time = os.getenv('SLEEP_TIME', 15)
CLIENT_ID = "lambda"

SWITCH1_ON = { "SWITCH1": "on" }
SWITCH1_OFF = { "SWITCH1": "off" }

def on_publish(client, userdata, mid):
    print ("Message Published...")
    client.disconnect()

def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed: "   str(message.topic)   " "   str(mid)   " "   str(granted_qos))

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to broker")
        client.subscribe(mqtt_subacribe_topic)
    else:
        print("Connection failed")

def on_message(client, userdata, msg):
    payload = json.loads(msg.payload)
    if payload.get('switch1') == 1:
        client.publish(mqtt_publish_topic,json.dumps(SWITCH1_ON))
    elif payload.get('switch1') == 0:
        client.publish(mqtt_publish_topic,json.dumps(SWITCH1_OFF))

def main():
    client = mqtt.Client(CLIENT_ID)
    client.username_pw_set(mqtt_username, password=mqtt_password)
    # Register publish callback function
    client.on_publish = on_publish
    client.on_connect = on_connect
    client.on_message = on_message
    # Connect with MQTT Broker
    client.connect(mqtt_host, port=mqtt_port)
    # Loop forever
    client.loop_start()
    time.sleep(sleep_time)
    client.loop_stop()
    client.disconnect()

if __name__ == "__main__":
    main()
  

Основываясь на ответе hardillb, я попытался :

 #!/usr/bin/env python2.7
import json
import time
import os
import paho.mqtt.subscribe as subscribe
import paho.mqtt.publish as publish

mqtt_host = os.getenv('HOST', 'xxx.cloudmqtt.com')
mqtt_port = os.getenv('PORT', 1883)
mqtt_username = os.getenv('USERNAME', 'xxx')
mqtt_password = os.getenv('PASSWORD', 'xxx')
mqtt_subacribe_topic = os.getenv('SUBSCRIBE_TOPIC', 'xxx')
mqtt_publish_topic = os.getenv('PUBLISH_TOPIC', 'xxx')
sleep_time = os.getenv('SLEEP_TIME', 14)
CLIENT_ID = "lambda"

SWITCH1_ON = { "SWITCH1": "on" }
SWITCH1_OFF = { "SWITCH1": "off" }

auth = {'username':mqtt_username, 'password':mqtt_password}

def on_message(client, userdata, msg):
    payload = json.loads(msg.payload)
    print(payload)
    if payload.get('switch1') == 1:
        publish.single(mqtt_publish_topic,json.dumps(SWITCH1_ON),hostname=mqtt_host,auth=auth)
        print "Turning switch1 ON"
    elif payload.get('switch1') == 0:
        publish.single(mqtt_publish_topic,json.dumps(SWITCH1_OFF),hostname=mqtt_host,auth=auth)
        print "Turning switch1 OFF"

def main():
    subscribe.callback(on_message, mqtt_subacribe_topic,hostname=mqtt_host,auth=auth)

if __name__ == "__main__":
    main()
  

Но скрипт продолжает выполняться, я должен отключить его, чтобы остановить. Возможно ли просто подписаться на тему и после получения первого сообщения обработать его, опубликовать в другой теме и завершить выполнение.

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

1. Вы пробовали client.loop_stop() и client.disconnect() совместно в рамках обратного вызова публикации on_publish()?

Ответ №1:

Если вы просто хотите опубликовать одно сообщение, то в клиенте Paho есть встроенный метод для этого. Вы можете найти документ здесь

 import paho.mqtt.publish as publish

publish.single("paho/test/single", "payload", hostname="iot.eclipse.org")
  

Существует эквивалентный метод также для подписки на тему и получения одного сообщения.