python 中的简单 mqtt 脚本 [关闭]

问题描述 投票:0回答:1

我的代码按预期运行良好,但我想改进它。当循环进入 100 秒这样的长时间睡眠时,我如何强制它立即改变。如果我错过输入并输入 400s 而不是 4s,我将不得不重新启动程序,这很烦人。在这里你可以看到代码 我尝试了很多东西,比如制作其他变量等,但我是新手,安静地迷失了。

`import paho.mqtt.client
import time
import threading

monClientMqtt = paho.mqtt.client.Client()
monClientMqtt.connect("localhost",1883)
monClientMqtt.loop_start()


monClientMqtt.subscribe("option")
monClientMqtt.subscribe("periodeX")
monClientMqtt.subscribe("mesureX")
monClientMqtt.subscribe("periodeY")
monClientMqtt.subscribe("mesureY")
monClientMqtt.subscribe("valeurX")
monClientMqtt.subscribe("valeurY")

periodeX =1
mesureX=0
x=0
y=0
periodeY=1
mesureY=0

def CallBack (client, userdata,message) :
    global x,periodeX,mesureX,y, periodeY,mesureY
  
    print(message.topic)
    print(message.payload)
    if message.topic == "option" :
        if message.payload.decode() == "restartX" :
            x=0
        if message.payload.decode()=="restartY":
            y=0
    if message.topic =="mesureX":
        try:
            mesureX=float(message.payload.decode()) 
        except ValueError:
            print("0 ou 1") 
        
    if message.topic =="periodeX" :

        try:
            periodeX=float(message.payload.decode())
        except ValueError :
            print("Veuillez entrer un nombre")   
        
    if message.topic =="mesureY":
        try:
            mesureY=float(message.payload.decode()) 
        except ValueError:
            print("0 ou 1") 
        
    if message.topic =="periodeY" :

        try:
            periodeY=float(message.payload.decode())
        except ValueError :
            print("Veuillez entrer un nombre")              



def prendremesureX():
    while True:
        if mesureX==0:
            global x,periodeX  
            x+=1
            monClientMqtt.publish("valeurX",x)
            time.sleep(periodeX)          
def prendremesureY():
    while True :
        if mesureY==0:
            global y,periodeY  
            y+=1
            monClientMqtt.publish("valeurY",y)
            time.sleep(periodeY)  
        


threadX=threading.Thread(target=prendremesureX)
threadY=threading.Thread(target=prendremesureY)

monClientMqtt.on_message=CallBack


threadX.start()
threadY.start()
python mqtt mosquitto
1个回答
0
投票

请参阅其他指导您如何正确提问/如何使用堆栈溢出的评论。

抛开问题,如果我正确理解你的问题,你就是在问; “如果有紧急需要,我该如何调整支票的延迟?”

您的 current 实施的问题是您正在使用 time.sleep(),它在功能上暂停任何处理,直到时间范围到期。正如您所发现的那样,这是行不通的,因为在睡眠期间无法进行任何更改。

你要做的是创建一个任务调度程序。您可能希望为特定任务分配日期或时间,并有一个任务处理程序可以根据特定时间处理每个任务。

后续如果有需要紧急处理的,可以更新任务的预定时间,按需处理。

© www.soinside.com 2019 - 2024. All rights reserved.