具有 MQTT 订阅的 Python Flask 服务器

标签 python flask server ibm-cloud mqtt

我有一个用 Python 编写的 flask 服务器,运行在 IBM BlueMix 上。我想让这个服务器监听一个 MQTT channel ,并在收到消息时发布一条消息。我有以下代码,但从未调用过 on_connect 和 on_message。

app = Flask(__name__)
def on_connect(client):
    client.publish(topic2, "CONNECTED")


def on_message(client, userdata, msg):
    client.publish(topic2, "MESSAGE")


@app.route('/')
def hello_world():
    return 'Hello World! I am running on port ' + str(port)

if __name__ == '__main__':
    client = mqtt.Client()
    client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect('broker.example.com')
    client.subscribe(topic)
    client.publish(topic2, "STARTING SERVER")

    app.run(host='0.0.0.0', port=port)

我已经尝试过 client.loop 和 client.loop_forever 但它不起作用。

编辑:client.publish(topic2, "STARTING SERVER") 正在运行,我的凭据已被删除。

最佳答案

您需要在 connect() 函数中传递要连接的代理的详细信息

例如

...
client.on_message = on_message
client.connect('broker.example.com')
client.subscribe(topic)
...

编辑:您还需要启动网络循环。鉴于这是 Flask 应用程序,您需要在后台启动循环,因此请使用 loop_start 函数。

...
client.connect('broker.example.com')
client.loop_start()
...

您还应该将 subscribepublish 调用移动到 on_connect 回调,因为它们需要等待之前建立连接正在运行。

EDIT2:添加完整的工作代码:

from flask import Flask
import paho.mqtt.client as mqtt

app = Flask(__name__)

topic = 'foo'
topic2 = 'bar'
port = 5000

def on_connect(client, userdata, flags, rc):
    client.subscribe(topic)
    client.publish(topic2, "STARTING SERVER")
    client.publish(topic2, "CONNECTED")


def on_message(client, userdata, msg):
    client.publish(topic2, "MESSAGE")


@app.route('/')
def hello_world():
    return 'Hello World! I am running on port ' + str(port)

if __name__ == '__main__':
    client = mqtt.Client()
    #client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect('localhost')
    client.loop_start()

    app.run(host='0.0.0.0', port=port)

关于具有 MQTT 订阅的 Python Flask 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43205568/

相关文章:

python - 什么编码看起来完全像 ASCII 但每个字节前都有 NULL 字节?

python - 具有 C 扩展模块的 Python 项目的目录布局

python - 处理Flask路由中的所有异常

python - RethinkDB 中使用 'idna' 编解码器进行编码失败

flask - 如何登录 flask

html - 存储网站文本的最佳方式

python - 双向重复测量方差分析python函数

ruby-on-rails - AWS Cloud9 服务器拒绝连接

安卓服务器套接字

python - python中两个浮点值的比较