我有一个用 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()
...
您还应该将 subscribe
和 publish
调用移动到 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/