Python MQTT-Paho отключить после публикации - PullRequest
0 голосов
/ 10 марта 2019

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

#!/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 Ответ

1 голос
/ 10 марта 2019

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

import paho.mqtt.publish as publish

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

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

...