我尝试将我的Flask应用程序用作订阅者,但在收到消息时它不会调用on_message
回调。相反,我得到如下:
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)
我尝试使用另一个Python脚本生成一些虚假数据以发布到主题,但只有当该脚本运行时我才能获得上面的输出。如果该脚本没有运行,那么main.py
似乎在等待消息。这是另一个脚本:
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)
我的问题是为什么Flask应用程序在没有实际处理消息的情况下无休止地连接和断开连接。
答案 0 :(得分:1)
连接到代理的所有客户端的客户端ID必须不同。在您发布的代码中,订阅者和发布者都使用相同的客户端ID(uuid=1234
)。
当具有相同客户端ID的2个客户端连接到代理时,代理将启动最旧的客户端。如果然后将其设置为重新连接,则将关闭第二个。
将uuid
设置为不同的值。
答案 1 :(得分:1)
我知道这是很久以前的事……但我相信我知道答案!万一其他人遇到同样的问题(断开连接和重新连接):您的应用程序必须设置为保持循环客户端。 “client.loop_start()”实际上是按照您的情况设计的。如果您希望无限期运行的程序的连接保持打开状态,请将其替换为“client.loop_forever()”。
我的第一个答案! 干杯!