【问题标题】:Python flask mqtt socketio and subscribing on startupPython烧瓶mqtt socketio并在启动时订阅
【发布时间】:2021-09-24 01:36:20
【问题描述】:

在启动烧瓶、mqtt 和 socketio 应用程序时,我如何在应用程序启动时但在浏览器首次连接之前订阅主题?

我曾假设我可以使用before_first_request,但它只在第一次请求时被调用,还假设我可以使用mqtt.on_connect,但在使用套接字 io 时以及如果我在__main__ 启动应用程序之前订阅,则不会调用然后我订阅了两个线程而不是一个。

#!/usr/bin/env python3
import json
from flask import Flask, render_template
from flask_mqtt import Mqtt
from flask_socketio import SocketIO
from flask_bootstrap import Bootstrap

# Flask App
app = Flask(__name__)
app.config['MQTT_BROKER_URL'] = '192.168.109.135'
print('Configured MQTT IP Address: ' + app.config['MQTT_BROKER_URL'])

mqtt = Mqtt(app)
socketio = SocketIO(app)

@app.route("/")
def roots():
    return render_template('index.html')

@app.route('/mqtt')
def mqtt_index():
    return render_template('mqtt.html')

@socketio.on('subscribe')
def handle_subscribe(json_str):
    print('Subscribe ' + json_str)

@socketio.on('unsubscribe_all')
def handle_unsubscribe_all():
    print('Socket IO unsubscribe all')
    mqtt.unsubscribe_all()

@socketio.on('connect')
def handle_connect():
    print('Socket IO Connected')

@socketio.on('discconnect')
def handle_connect():
    print('Socket IO Discconnect')

@mqtt.on_connect()
def handle_mqtt_connect():
    print('MQTT Connected')

@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
    print('MQTT Message')
    data = dict(
        topic=message.topic,
        payload=message.payload.decode(),
        qos=message.qos,
    )
    print(mqttresponse)
    socketio.emit('mqtt_message', data=data)

@mqtt.on_log()
def handle_logging(client, userdata, level, buf):
    print('MQTT log', level, buf)
    pass

@app.before_first_request
def before_first_request():
    print("before_first_request")
    mqtt.subscribe('homeassistant/+/+/set', 0)

if __name__ == "__main__":
    # Main http web server for firmware downloading and the main frontend.
    socketio.run(app, host='0.0.0.0', port='6080', use_reloader=True)

mqtt.subscribe 应该去哪里以便它在第一次连接到网络服务器之前订阅我想要的主题?

【问题讨论】:

  • 您是否尝试在socketio.run() 呼叫上方执行此操作?我想那是最早的地方。

标签: python-3.x flask flask-socketio


【解决方案1】:

我发现已经有一个相关的问题是 on_connect 回调没有被调用,这里也有一个问题。所以这是重复的。

Flask MQTT on_connect is never called when used with SocketIO

https://github.com/stlehmann/Flask-MQTT/issues/82

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多