带有MQTT的Python Flask应用程序
我试图将我的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
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)