2017-07-03 115 views
0

目前,我正在尝试使用MQTT,Python和OpenHab来制作一个简单的应用程序。所以,我只想连接到MQTT服务器,订阅主题并阅读放置在那里的数据/消息。 Everthing工作正常,但有“限制”。 Python客户端能够连接到MQTT,订阅和... BOOM!没有!我能够从订阅的主题中读取消息,但是我需要在客户端连接后更新主题。客户端连接后,如果没有重新更新主题数据,即使存在真实数据,我也无法看到任何内容。 因此,在短暂的阅读关于订阅的MQTT主题

  • Python客户端(PAHO MQTT 1.3V)连接到MQTT(mosquitto)服务器
  • 订阅了指定的主题(想在这里看到当前主题数据)
  • 没有任何反应,直到有人会重新更新主题。

如何在不重新更新该主题的情况下阅读主题数据?

这里是我的代码 类MQTTBroker(对象):

def __init__(self, Trigger, ipAddress, userName, password, fileNameTopic, volumeTopic, enabledTopic): 
    self.ipaddress = ipAddress 
    self.username = userName 
    self.password = password 
    self.topic = topic 
    self.fileNameTopic = fileNameTopic 
    self.volumeTopic = volumeTopic 
    self.enabledTopic = enabledTopic 
    self.state = 0 
    self.client = mqtt.Client() 
    self.client.on_connect = self.on_connect 
    self.client.on_message = self.on_message 
    self.logger = logging.getLogger(__name__) 
    self.client.enable_logger(logger) 

    self.client.connect(self.ipaddress, 1883, 60) 
    self.client.loop_start() 

def __exit__(self, exc_type, exc_val, exc_tb): 
    self.client.loop_stop() 

# The callback for when the client receives a CONNACK response from the server. 
def on_connect(self, client, userdata, flags, rc): 
    print("Connected with result code " + str(rc)) 

    # Subscribing in on_connect() means that if we lose the connection and 
    # reconnect then subscriptions will be renewed. 
    self.client.subscribe(self.fileNameTopic, 0) 
    self.client.subscribe(self.volumeTopic, 0) 
    self.client.subscribe(self.enabledTopic, 0) 

# The callback for when a PUBLISH message is received from the server. 
def on_message(self, client, userdata, msg): 
    self.state = msg.payload 
    if msg.topic == self.fileNameTopic: 
     Trigger.change_file_name(msg.payload) 
    elif msg.topic == self.volumeTopic: 
     Trigger.change_volume(msg.payload) 
    elif msg.topic == self.enabledTopic: 
     Trigger.change_state(msg.payload) 

回答

1

MQTT不工作的方式,从主题的消息不是 “读”。

在正常情况下,您订阅,然后等待直到发布新消息,此时代理将向订户传递新消息。

如果您希望在订阅时接收发布到某个主题的最后一条消息,则需要确保该消息已发布且保留标志设置为true。当该消息(由发布者)设置该标志时,代理将存储该消息并在新订户连接的点传送该消息。

您尚未包含发布商的代码,因此我无法指出要更改的内容,但paho文档应解释为:https://pypi.python.org/pypi/paho-mqtt/1.1#publishing