Flask extension for the MQTT protocol
Flask-MQTT的Python项目详细描述
烧瓶MQTT
用于MQTT protocol的烧瓶扩展。基本上是薄包装 围绕paho-mqtt,旨在简化烧瓶中的mqtt集成。mqtt是 机器到机器的“物联网”协议 轻量级发布/订阅消息传输。
找到http://flask-mqtt.readthedocs.io上的文档。
功能
- 通过烧瓶配置变量进行配置
- Web应用程序启动时自动连接
- 发布和订阅消息
- 对某些主题使用回调
- 对所有订阅的主题使用一次回调
限制
Flask MQTT的开发是为了提供一个易于设置的交互解决方案 使用物联网设备。一个典型的场景是树莓皮运行 Mosquito MQTT服务器与Flask Web服务器相结合。
多个工人
flask mqtt当前不适合与多个工作进程一起使用 实例。因此,如果使用像gevent或gunicorn这样的wsgi服务器,请确保 您只有一个工作实例。
重载器
确保禁用烧瓶自动转载器。如果激活它会产生两个 烧瓶应用实例。这会导致与multiple相同的问题 工人。为了防止flask mqtt运行两次代码,必须 停用自动换料机。
安装
只需像往常一样通过pip:
$ pip install flask-mqtt
用法
基本设置
fromflaskimportFlaskfromflask_mqttimportMqttapp=Flask(__name__)app.config['MQTT_BROKER_URL']='mybroker.com'app.config['MQTT_BROKER_PORT']=1883app.config['MQTT_USERNAME']='user'app.config['MQTT_PASSWORD']='secret'app.config['MQTT_REFRESH_TIME']=1.0# refresh time in secondsmqtt=Mqtt(app)@app.route('/')defindex():returnrender_template('index.html')
订阅主题
要订阅主题,只需使用mqtt.subscribe()
。以确保
在启动时正确处理订阅将订阅放入
一个on_connect()
回调函数。
@mqtt.on_connect()defhandle_connect(client,userdata,flags,rc):mqtt.subscribe('home/mytopic')
要处理订阅的消息,可以通过
用@mqtt.on_message()
装饰它。
@mqtt.on_message()defhandle_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客户端
"""A small Test application to show how to use Flask-MQTT."""importeventletimportjsonfromflaskimportFlask,render_templatefromflask_mqttimportMqttfromflask_socketioimportSocketIOfromflask_bootstrapimportBootstrapeventlet.monkey_patch()app=Flask(__name__)app.config['SECRET']='my secret key'app.config['TEMPLATES_AUTO_RELOAD']=Trueapp.config['MQTT_BROKER_URL']='broker.hivemq.com'app.config['MQTT_BROKER_PORT']=1883app.config['MQTT_USERNAME']=''app.config['MQTT_PASSWORD']=''app.config['MQTT_KEEPALIVE']=5app.config['MQTT_TLS_ENABLED']=False# 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('/')defindex():returnrender_template('index.html')@socketio.on('publish')defhandle_publish(json_str):data=json.loads(json_str)mqtt.publish(data['topic'],data['message'])@socketio.on('subscribe')defhandle_subscribe(json_str):data=json.loads(json_str)mqtt.subscribe(data['topic'])@mqtt.on_message()defhandle_mqtt_message(client,userdata,message):data=dict(topic=message.topic,payload=message.payload.decode())socketio.emit('mqtt_message',data=data)@mqtt.on_log()defhandle_logging(client,userdata,level,buf):print(level,buf)if__name__=='__main__':socketio.run(app,host='0.0.0.0',port=5000,use_reloader=True,debug=True)