跳转到主要内容

Flask扩展,用于MQTT协议

项目描述

Flask-MQTT

Flask扩展,用于MQTT协议。基本上,它是对paho-mqtt的薄包装,旨在简化Flask中的MQTT集成。MQTT是一种机器到机器的“物联网”协议,专为极轻量级的发布/订阅消息传输而设计。

Inactively Maintained Documentation Status PyPI version CI Coverage Status Downloads Downloads

请访问http://flask-mqtt.readthedocs.io获取文档。

特性

  • 通过Flask配置变量进行配置
  • 在您的Web应用启动时自动连接
  • 发布和订阅消息
  • 连接到多个MQTT服务器
  • 为特定主题使用回调
  • 对所有订阅的主题使用一个回调

限制

Flask-MQTT被开发出来,为与物联网设备交互提供一个易于设置的解决方案。一个典型的场景是在运行mosquitto mqtt服务器的Raspberry Pi上运行Flask网络服务器。

多个工作进程

Flask-MQTT目前不适合与多个工作实例一起使用。 因此,如果您使用像geventgunicorn这样的WSGI服务器,请确保只有一个工作实例。

重新加载

请确保禁用Flask的自动重新加载功能。如果激活,它会启动两个Flask应用程序的实例。这会导致与多个工作进程相同的问题。为了防止Flask-MQTT运行代码两次,有必要禁用自动重新加载。

安装

像往常一样通过pip安装软件包

$ pip install flask-mqtt

或者使用conda-forge通道的conda

$ conda config --add channels conda-forge
$ conda install flask-mqtt

用法

基本设置

from flask import Flask
from flask_mqtt import Mqtt

app = Flask(__name__)
app.config['MQTT_BROKER_URL'] = 'mybroker.com'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = 'user'
app.config['MQTT_PASSWORD'] = 'secret'
app.config['MQTT_REFRESH_TIME'] = 1.0  # refresh time in seconds
mqtt = Mqtt(app)

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

订阅主题

要订阅主题,请使用 mqtt.subscribe()。为确保在启动时正确处理订阅,请将订阅放置在 on_connect() 回调函数内。

@mqtt.on_connect()
def handle_connect(client, userdata, flags, rc):
    mqtt.subscribe('home/mytopic')

要处理订阅的消息,您可以定义一个处理函数,并通过装饰它为 @mqtt.on_message()

@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
    data = dict(
        topic=message.topic,
        payload=message.payload.decode()
    )

要取消订阅,请执行

mqtt.unsubscribe('home/mytopic')

或者,如果您想取消所有主题的订阅,请使用 unsubscribe_all()

mqtt.unsubscribe_all()

发布

要发布消息,您可以使用 publish() 方法。

mqtt.publish('home/mytopic', 'this is my message')

连接到多个MQTT服务器

要连接到多个服务器,您可以在初始化 Mqtt() 时指定 config_prefix,在应用程序中创建多个mqtt客户端。

# default mqtt client
app.config["MQTT_broker_url"] = "example.com"
app.config["MQTT_broker_port"] = 8883
mqtt = Mqtt(app)

# create second mqtt client for a different broker 
app.config["MQTT2_broker_url"] = "example2.com"
app.config["MQTT_broker_port"] = 1883
mqtt2 = Mqtt(app, config_prefix="MQTT2")

# create third mqtt client for a different broker 
app.config["MQTT3_broker_url"] = "example3.com"
app.config["MQTT3_broker_port"] = 1885
mqtt3 = Mqtt(app, config_prefix="MQTT3")

小型发布/订阅MQTT客户端

"""

A small Test application to show how to use Flask-MQTT.

"""

import eventlet
import json
from flask import Flask, render_template
from flask_mqtt import Mqtt
from flask_socketio import SocketIO
from flask_bootstrap import Bootstrap

eventlet.monkey_patch()

app = Flask(__name__)
app.config['SECRET'] = 'my secret key'
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['MQTT_BROKER_URL'] = 'broker.hivemq.com'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = ''
app.config['MQTT_PASSWORD'] = ''
app.config['MQTT_KEEPALIVE'] = 5
app.config['MQTT_TLS_ENABLED'] = False
app.config['MQTT_CLEAN_SESSION'] = True

# Parameters for SSL enabled
# app.config['MQTT_BROKER_PORT'] = 8883
# app.config['MQTT_TLS_ENABLED'] = True
# app.config['MQTT_TLS_INSECURE'] = True
# app.config['MQTT_TLS_CA_CERTS'] = 'ca.crt'

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


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


@socketio.on('publish')
def handle_publish(json_str):
    data = json.loads(json_str)
    mqtt.publish(data['topic'], data['message'])


@socketio.on('subscribe')
def handle_subscribe(json_str):
    data = json.loads(json_str)
    mqtt.subscribe(data['topic'])


@socketio.on('unsubscribe_all')
def handle_unsubscribe_all():
    mqtt.unsubscribe_all()


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


@mqtt.on_log()
def handle_logging(client, userdata, level, buf):
    print(level, buf)


if __name__ == '__main__':
    # important: Do not use reloader because this will create two Flask instances.
    # Flask-MQTT only supports running with one instance
    socketio.run(app, host='0.0.0.0', port=5000, use_reloader=False, debug=False)

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

Flask-MQTT-1.2.1.tar.gz (12.1 kB 查看哈希值)

上传时间

构建分布

Flask_MQTT-1.2.1-py3-none-any.whl (9.2 kB 查看哈希值)

上传时间 Python 3

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面