【问题标题】:python Mqtt subscribe how to delete first session/messagepython Mqtt订阅如何删除第一个会话/消息
【发布时间】:2020-12-06 01:08:40
【问题描述】:

我使用具有 HA 作为代理的 python 创建了一个 Mqtt 订阅……当我建立第一个连接时,我启动了我连接的所有 mqtt 按钮的一系列消息,即使我没有激活它们,因为我的订阅是“house/点击/ # ”。列表完成后……如果您按下按钮,我就会开始收到我需要的消息……有没有办法删除它给我的第一个列表。

这是我使用的代码:

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, userdata, 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,new_yloc+2)
                pyautogui.moveTo(region[0],region[1])
                print(str(new_xloc)+","+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],region[1])
                print(str(new_xloc)+","+str(new_yloc))
            else:
                pyautogui.click(new_xloc+8,new_yloc+25)
                pyautogui.moveTo(region[0],region[1])
                print(str(new_xloc)+","+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

在所有这些消息汇集在一起​​之后,由于我对按钮的操作,我可以开始收到消息

有人可以告诉我如何在没有这些第一行的情况下进行干净的会话?

谢谢

【问题讨论】:

  • 您使用的是哪个代理?
  • 你的问题没有解释清楚。所以你的意思是说当你第一次运行你的代码时你会自动收到消息?然后你会收到正常的消息?
  • @Hsn 经纪人是 Hassio(蚊子经纪人)。 “所以你的意思是说当你第一次运行你的代码时你会自动收到消息?然后你会收到正常的消息?”是的,是的
  • 如果您还可以访问发布者端,那么您可以将保留标志设置为 false。如果不是,那么它真的很难,你必须采取 n 解决方法,比如为每个主题设置一个标志等。

标签: python-3.x mqtt publish-subscribe home-assistant


【解决方案1】:

检查您的 MQTT 发布者标志。如果您的发布商使用“保留标志”,您需要将其设为 false。

并且要从主题中删除保留的消息,客户端必须将其替换为保留标志设置为 True 的另一条消息,或者客户端必须在该主题上发布保留标志设置为 True 的空白消息。这是删除保留消息的唯一方法。

“保留消息是一条普通的 MQTT 消息,保留标志设置为 true。代理存储最后保留的消息和该主题的相应 QoS。每个订阅与保留的主题匹配的主题模式的客户端消息订阅后立即收到保留消息。代理每个主题仅存储一条保留消息“。 来源:https://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages/

【讨论】:

  • retained 标志不是代理配置 - 这是由发布者为主题设置/取消设置的,以告诉代理保留该消息,以便订阅该主题的任何新客户端都能够获取它。由于他只是想跳过第一条发布的消息,我猜这不会有任何帮助
  • 我认为他首先需要在发布主题时设置retain=False,另一方面在他的订阅客户端实例上设置clean_session=True。然后,如果订阅客户端在发布客户端之前连接,他只会收到不需要的消息。
  • 是的,你是对的。但我认为首先,他需要删除已在代理中发布和保留的保留消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多