【发布时间】:2020-07-04 10:54:44
【问题描述】:
我有我的 python 脚本,我连接到我的 mqtt 代理并订阅了一个主题。当我收到有效负载“hello”时,脚本会执行一个操作,在我的情况下打印“good”。我想要做的是,当收到有效载荷“hello”时,我试图执行一个动作 20 秒,在那段时间我不希望脚本检测任何其他有效载荷,即它应该取消订阅主题(我认为这是一种更好的方法,但我愿意接受建议)。
我不希望在这 20 秒的延迟期间在我的主题中检测到任何有效负载。在我的情况下(脚本)发生的事情是,在这 20 秒的延迟中,脚本仍然订阅了该主题,并且在 20 秒后它再次打印“好”。我不希望这种情况发生;而是在 20 秒后正常恢复,即检测到另一个“你好”。
这是我的代码:
import paho.mqtt.client as mqttClient
import time
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to broker")
global Connected #Use global variable
Connected = True #Signal connection
else:
print("Connection failed")
def on_message(client, userdata, message):
##
if message.payload == "hello":
client.unsubscribe("home/OpenMQTTGateway/433toMQTT")
print("good")
time.sleep(20)
Connected = False #global variable for the state of the connection
broker_address= "192.168.0.6" #Broker address
port = 1883 #Broker port
user = "123456" #Connection username
password = "abcdef" #Connection password
client = mqttClient.Client("Python") #create new instance
client.username_pw_set(user, password=password) #set username and password
client.on_connect= on_connect #attach function to callback
client.on_message= on_message #attach function to callback
client.connect(broker_address,port,60) #connect
client.subscribe("home/OpenMQTTGateway/433toMQTT") #subscribe
client.loop_forever() #then keep listening forever
更新:
@Mike Organek
我现在想要的是,在它打印好之后.. 我需要它打印坏,直到在主题中发布另一个 hello 并且它再打印好 20 秒,所以循环继续。希望这有意义吗?
【问题讨论】:
-
这次有什么消息到达?你需要它来停止处理消息二十秒吗?
-
不,所以你的解决方案很好,我只想添加一个 else 语句,在打印“好”并保持 20 秒后,我需要脚本执行另一件事,即打印“坏”如果有效载荷中的“hello”尚未发布。我希望这是有道理的?
-
我在底部添加了更多代码。如果你告诉我你的用例会更容易理解。看起来您希望消息被拒绝为
bad,然后在收到hello后,忽略所有消息 20 秒,然后开始处理其他消息。我粘贴的代码每次收到hello时都会重新启动二十秒的忽略期。 -
好的,我想做的就是这个。我有一个 RF 运动传感器,它在我的 python 代码中订阅的主题中发布一个六位数的代码。一旦发布了六位数代码,我将让我的显示器打开 5 分钟而不是打印良好。显示器打开 5 分钟后,我希望它关闭,直到在主题中发布另一个 6 位代码,即检测到另一个动作。所以基本上在 if 语句中,我需要一个 else 语句来关闭我的示例中的监视器,我打印不好。希望这是有道理的?
-
明白。我的答案中的更新代码是否可以处理您的用例?
标签: python mqtt paho timedelay