Подписчик клиента MQTT: как разорвать цикл, получив новое сообщение от издателя?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Подписчик клиента MQTT: как разорвать цикл, получив новое сообщение от издателя?

Сообщение Anonymous »

Может ли кто-нибудь мне в этом помочь?
Я пытаюсь прервать таймлапс (записанный как цикл функции) на моем RPI, начатом с сообщения «Начать сканирование», получив сообщение «Выход».
Извините за мои познания в программировании, но я действительно застрял на этом последнем шаге!
Здесь блок кода подписчика (который представляет собой RPI и его PiCamera)

Код: Выделить всё

import time
import paho.mqtt.client as mqtt

from time import sleep
from datetime import datetime, timedelta
from picamera import PiCamera
import subprocess
import pathlib

import socket

camera = PiCamera()

Broker = "192.168.1.100"
Port = 1883

# topics
pub_topic = "DIC/scanning"
sub_topic = "DIC/keyboard"

# on connect
def on_connect(mqttc, obj, flags, reason_code):
print(f"rc :" + str(reason_code))
mqttc.subscribe(sub_topic)

# on message
def on_message(mqttc, obj, msg):
print(str(msg.topic) + " " +  str(msg.qos) + " " + str(msg.payload))

if if msg.payload.decode() == "StartScanning":
while True:
timelapse()
elif msg.payload.decode() == "Quit" :
timelapse.hasbeencalled=False

#fonction scanning avec timelapse
def timelapse():
hostName = socket.gethostname()
pathlib.Path('/home/pi/Desktop/DIC_' + hostName).mkdir(parents=True,exist_ok=True)
fileName= datetime.now().strftime("%Y%m%d_%H-%M-%S-%f")+".jpg"
camera.resolution = (2592, 1944) #picture resolution
camera.capture('/home/pi/Desktop/DIC_' + hostName + '/' + fileName)
#camera.capture('/home/pi/Desktop/DIC_RPI1/RPI1_' + fileName)
sleep(1)

#on subscribe
def on_subscribe(mqttc, obj, mid, reason_code_list):
print("Subscribed: " + str(mid) + " " + str(reason_code_list))

#on log
def on_log(mqttc, obj, level, string):
print(string)

# on publish
def on_publish(mqttc, obj, mid):
print(f"risposta inviata con message  id:" + str(mid))

# connect MQTT client
mqttc = mqtt.Client() #(mqtt.CallbackAPIVersion.VERSION1)

mqttc.on_subscribe = on_subscribe
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.on_publish = on_publish

mqttc.connect("192.168.1.100", 1883, 60)
#mqttc.subscribe(sub_topic)

mqttc.loop_forever()

Я пытался вставить в функцию timelapse() ' while msg.payload=="StartScanning": ', но это не сработало.
Я также пытался опубликовать два сообщения «Начать сканирование» и «Выход» в двух темах и подписаться на них, но поскольку работает функция цикла, я не могу получать другие сообщения от издателя.

Подробнее здесь: https://stackoverflow.com/questions/785 ... e-from-a-p
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»