带有MQTT的Python Flask应用程序

带有MQTT的Python Flask应用程序,flask,mqtt,Flask,Mqtt,我试图将我的Flask应用程序用作订户,但它在收到消息时不会调用on_消息回调。相反,我的行动方式如下: Connected with result code 0 Closing data file... Connected with result code 0 Closing data file... 以下是我运行Flask应用程序的方式: main.py: from flask import Flask, render_template, redirect, url_for from f

我试图将我的Flask应用程序用作订户,但它在收到消息时不会调用
on_消息
回调。相反,我的行动方式如下:

Connected with result code 0
Closing data file...
Connected with result code 0
Closing data file...
以下是我运行Flask应用程序的方式:

main.py:

from flask import Flask, render_template, redirect, url_for
from flask_bootstrap import Bootstrap
from flask_nav import Nav
from flask_nav.elements import *
import paho.mqtt.client as mqtt
import time

broker_address = <broker_ip>
port = 1883
timeout = 60
username = "first"
password = "last"
uuid = "1234"
topic = "mytopic"
qos = 0



def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))

    client.subscribe(topic)

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload) + '\n')

def on_disconnect(client, userdata, rc):
    print("Closing data file...")

client = mqtt.Client(client_id=uuid)
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.username_pw_set(username, password)

client.connect(broker_address, port, 60)
client.loop_start()

<other Flask code>

if __name__ == "__main__":
    app.run(debug=True)

我的问题是为什么Flask应用程序不断地连接和断开连接,而没有实际处理消息。

对于连接到代理的所有客户端,客户端id都需要不同。在您发布的代码中,订阅者和发布者都使用相同的客户端id(
uuid=1234

当两个具有相同客户端id的客户端连接到代理时,代理将启动最旧的客户端。如果设置为重新连接,则会启动第二个


uuid
设置为不同的值。

对于连接到代理的所有客户端,客户端id需要不同。在您发布的代码中,订阅者和发布者都使用相同的客户端id(
uuid=1234

当两个具有相同客户端id的客户端连接到代理时,代理将启动最旧的客户端。如果设置为重新连接,则会启动第二个


将uuid设置为不同的值。

我知道这是很久以前的事了……但我相信我知道答案!如果其他人也有同样的问题(断开和重新连接):你的应用程序必须设置为保持循环客户端。“client.loop_start()”实际上按照您案例中的设计运行。如果您希望一个无限期运行的程序的连接保持打开状态,请将其替换为“client.loop_forever()”

我的第一个答案!
干杯

我知道这是很久以前的事了……但我相信我知道答案!如果其他人也有同样的问题(断开和重新连接):你的应用程序必须设置为保持循环客户端。“client.loop_start()”实际上按照您案例中的设计运行。如果您希望一个无限期运行的程序的连接保持打开状态,请将其替换为“client.loop_forever()”

我的第一个答案!
干杯

我这样做了,它确实起作用了。但是,
客户端
在接收和打印消息后仍会连接和断开连接。虽然这不会阻止我的应用程序,但我认为预期的行为是连接保持打开状态,直到我关闭整个应用程序。你知道为什么不是这样吗?我这么做了,而且很有效。但是,
客户端
在接收和打印消息后仍会连接和断开连接。虽然这不会阻止我的应用程序,但我认为预期的行为是连接保持打开状态,直到我关闭整个应用程序。你知道为什么不是这样吗?这是不对的,如果你调用
loop\u forever()
脚本将在该点阻塞,并且永远不会运行它后面的任何代码。这是不对的,如果你调用
loop\u forever()
脚本将在该点阻塞,并且永远不会运行它后面的任何代码。
fake_data.py:

import paho.mqtt.client as mqtt
import time

broker_address = <broker_ip>
port = 1883
timeout = 60
username = "first"
password = "last"
uuid = "1234"
topic = "mytopic"
qos = 0



def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))

client = mqtt.Client(client_id=uuid, clean_session=True)
client.on_connect = on_connect

client.username_pw_set(username, password)

client.connect(broker_address, port, 60)


client.loop_start()

while True:
    count = 0
    while count != 30:
        print("Publishing {0}".format(count))
        client.publish(topic, count, qos=0)
        count += 1
        time.sleep(1)