Python Mqtt client.loop_forever如何跳转n行

问题描述

此代码使我订阅了代理,并且我输出了针对该特定主题系列的消息。现在,当我第一次开始时,我有一个与设备数量一样多的消息列表……一种在所有设备上的状态检查。在为每行编写的代码中,通过pyautogui库在远程屏幕上产生了一个动作。是否可以告诉他,在前n行中,他让我什么也不做,然后开始执行我告诉他的动作?

import paho.mqtt.client as paho
import pandas as pd
import pyautogui
import os
import platform


def on_subscribe(client,userdata,mid,granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos))


def on_message(client,msg):
    pyautogui.FAILSAFE=False
    os_system=platform.system()


    # Selezione area dello screenshot

    if os_system == 'Darwin':
        region=(10,80,850,100) #MAC
    else:
        region=(60,130,900,250) #RASP

    tab_pos=pd.read_csv('table_position.csv')
    print(msg.topic+"  "+str(msg.payload)+" "+str(msg.qos))
    mqtt_name=str(msg.topic).split("click/")[0]+str(msg.topic).split("click/")[1]
    mqtt_payload=msg.payload.decode('utf-8')
    index_loc=tab_pos.index[tab_pos['mqtt_topic'] == mqtt_name].tolist()
    x_loc=tab_pos.iloc[index_loc[0]][0]
    y_loc=tab_pos.iloc[index_loc[0]][1]
    new_xloc=x_loc+region[0]
    new_yloc=y_loc+region[1]
    if tab_pos.iloc[index_loc[0]][5] == "cover":
        if str(mqtt_payload) == "OPEN":
            if str(mqtt_payload) == "STOP":
                pyautogui.click(new_xloc+8,new_yloc+2)
                pyautogui.moveTo(region[0],region[1])
                print(str(new_xloc)+","+str(new_yloc))
            else:
                pyautogui.click(new_xloc+8,"+str(new_yloc))
        if str(mqtt_payload) == "CLOSE":
            if str(mqtt_payload) == "STOP":
                pyautogui.click(new_xloc+8,new_yloc+25)
                pyautogui.moveTo(region[0],"+str(new_yloc))
    else:
        pyautogui.click(new_xloc+10,new_yloc+10)
        pyautogui.moveTo(region[0],region[1])
        print(str(new_xloc)+","+str(new_yloc))


client = paho.Client(client_id = "atena_mqtt_click")
client.on_subscribe = on_subscribe
client.on_message = on_message
client.username_pw_set("xxxx","xxxxx")
client.connect("XXX.XXX.XXX.XXX",1883)
client.subscribe("house/click/#",qos=1)
client.loop_forever()

这是输出

Subscribed: 1 (1,)
house/click/xxxxxx/light b’OFF’ 0
711,104
house/click/xxxxxx/alarm b’OFF’ 0
454,134
house/click/xxxxxx/light b’OFF’ 0
795,104
house/click/xxxxxxx/cover b’STOP’ 0

解决方法

否,您不能告诉MQTT客户端库忽略有关已订阅主题的消息。

正如您之前问这个问题的答案中提到的那样,这些是最有可能发布的带有保留标志集的消息。订阅带有保留消息的主题的任何客户端将在发布任何新消息之前始终收到此消息。

在这种情况下,听起来好像保留的消息保留了系统的当前状态,因此忽略它们是没有意义的,您应该使用它们来确保所创建的GUI与系统同步。

如果您已将发布者更改为不再设置保留标志,并且由于它们不再反映系统的当前状态,而现在正尝试从代理中删除这些消息,则可以发布带有NULL负载的消息,并保留但已设置。例如使用mosquitto_pub命令行工具:

mosquittto_pub -t house/click/xxxxxxx/cover -n

您可以在HiveMQ博客here

上了解有关保留的MQTT消息的更多信息。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...