【问题标题】:python mqtt to stop subscribing for 20 seconds after particular payload has been receivedpython mqtt 在收到特定有效负载后停止订阅 20 秒
【发布时间】: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


【解决方案1】:

你真的不应该在 on_message() 中调用 sleep。

on_message() 回调在 MQTT 客户端网络线程上运行,在运行时客户端无法发布或接收任何其他消息,包括保持活动数据包。

通常,您不应执行长时间运行的任务或可能在回调中阻塞的事情。如果您需要执行长时间运行的任务,则需要在单独的线程上执行这些任务。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多