带有MQTT的Python Flask应用程序

时间:2017-12-03 23:39:49

标签: flask mqtt

我尝试将我的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应用程序在没有实际处理消息的情况下无休止地连接和断开连接。

2 个答案:

答案 0 :(得分:1)

连接到代理的所有客户端的客户端ID必须不同。在您发布的代码中,订阅者和发布者都使用相同的客户端ID(uuid=1234)。

当具有相同客户端ID的2个客户端连接到代理时,代理将启动最旧的客户端。如果然后将其设置为重新连接,则将关闭第二个。

uuid设置为不同的值。

答案 1 :(得分:1)

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

我的第一个答案! 干杯!