Как продолжить выполнение моей программы, даже если мой клиент MQTT не подключается? - PullRequest
2 голосов
/ 28 марта 2019

Я пишу программу на python, которая работает на Raspberry Pi и подключается к Pic-камере.Как я использую MQTT, когда клиент не подключается, программа зависает.Есть ли способ продолжить запуск программы, даже если клиент не подключается, т.е. я не получаю никаких данных, но камера все еще работает.

В качестве примера, как мне напечатать x, даже есликлиент не подключается?

import time
import paho.mqtt.client as mqtt
import json


def on_connect(client, userdata, rc):
    print ("Connected with rc: " + str(rc))
    client.subscribe("demo/test1")

def on_message(client, userdata, msg):
    data_json = msg.payload
    data = json.loads(data_json)

print(data['ant_plus_power'])

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

x = client.connect("118.138.47.99", 1883, 60)
print(x)

client.loop_forever()

1 Ответ

2 голосов
/ 28 марта 2019

Редактировать: я выполнил ваш код на своем конце, и примерно через 30 секунд я получил исключение TimeoutError: "A connection attempt failed because the connected party did not properly respond after a period of time".Вам необходимо обработать это исключение в своем коде, чтобы программа продолжала работать, даже если она не может подключиться:

try:
    client.connect("118.138.47.99", 1883, 60)
    client.loop_forever()
except:
    print("failed to connect, moving on")

print("rest of the code here")

Это выводит:

failed to connect, moving on
rest of the code here

Однако, используя connect()и loop_forever() не подходит для ваших нужд, так как они блокируют функции (то есть они блокируют выполнение вашего кода и не позволяют ему делать что-либо еще).С кодом выше, если клиент успешно соединяется, print("rest of the code here") никогда не будет достигнут из-за loop_forever().

Вместо этого попробуйте использовать connect_async() в сочетании с loop_start() для подключения в неблокирующем режиме.образом (это означает, что ваша программа может продолжать делать другие вещи при попытке подключения в фоновом режиме):

client.connect_async("118.138.47.99", 1883, 60)
client.loop_start()

print("rest of the code here")

while True:
    time.sleep(1)

Это выводит rest of the code here и продолжает работать бесконечно (в бесконечном цикле while) независимо от того,соединение было успешным или нет.

Обратите внимание, что в вашем определении on_connect() отсутствует один аргумент.Это должно быть:

on_connect(client, userdata, flags, rc)

Также было бы неплохо проверить код возврата on_connect и подписаться только в случае успешного подключения:

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        client.connected_flag = True # set flag
        print("Connected OK")
        client.subscribe("demo/test1")
    else:
        print("Bad connection, RC = ", rc)
        mqtt.Client.bad_connection_flag = True

# create flags so you can check the connection status throughout the script
mqtt.Client.connected_flag = False 
mqtt.Client.bad_connection_flag = False

См. https://www.eclipse.org/paho/clients/python/docs/ и http://www.steves -internet-guide.com / client-connections-python-mqtt / .

Для быстрого тестирования успешного соединения,Вы можете подключиться к test.mosquitto.org (см. https://test.mosquitto.org/).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...