0

現在、MQTT、Python、および OpenHab を使用して簡単なアプリケーションを作成しようとしています。したがって、MQTT サーバーに接続し、トピックにサブスクライブして、そこに配置されたデータ/メッセージを読み取りたいだけです。すべてが正常に機能しますが、「制限」があります。MQTT への接続、サブスクライブ、および... BOOM に接続できる Python クライアント 何もない!サブスクライブしたトピックからメッセージを読み取ることはできますが、クライアント接続後にトピックを更新する必要があります。クライアント接続後にトピック データを再更新しないと、実際のデータがあっても何も表示されません。つまり、簡単に言えば

  • Python クライアント (paho MQTT 1.3v) は MQTT (mosquitto) サーバーに接続します
  • 指定されたトピックを購読します (ここで現在のトピック データを表示したい)
  • 誰かがトピックを再更新するまで何も起こりません。

そのトピックを再更新せずにトピック データを読み取るにはどうすればよいですか?

これが私のコードクラス MQTTBroker(object) です:

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)
4

1 に答える 1

2

MQTT はそのようには機能しません。メッセージはトピックから「読み取られません」。

通常の状況では、サブスクライブし、新しいメッセージが公開されるまで待ちます。この時点で、ブローカーは新しいメッセージをサブスクライバーに配信します。

サブスクライブした時点でトピックに発行された最後のメッセージを受信したい場合は、メッセージが保持フラグを true に設定して発行されていることを確認する必要があります。このフラグが (パブリッシャーによって) メッセージに設定されると、ブローカーはそのメッセージを保存し、新しいサブスクライバーが接続した時点で配信します。

パブリッシャーのコードが含まれていないため、何を変更するかを指摘することはできませんが、paho doc で説明する必要があります: https://pypi.python.org/pypi/paho-mqtt/1.1#publishing

于 2017-07-03T14:21:29.737 に答える