Flask--MQTT的应用(一)

38 篇文章 3 订阅
20 篇文章 62 订阅

首先安装paho.mqtt.client这个python库:


需求描述:

  • 第一步:客户端访问某个路由就可以执行固定的提交到MQTT服务器的操作。
  • 第二步:客户端以get方法访问某个路由,flask提取get中的参数并验证,验证完成以后将参数中的数据提交到MQTT服务器中。
  • 第三步:将前面的代码整合到SockIO中去。

一、flask上的简单应用:

#encoding: utf-8

import paho.mqtt.client as mqtt


# 当连接上服务器后回调此函数
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    # 放在on_connect函数里意味着
    # 重新连接时订阅主题将会被更新
    client.subscribe("chat")

# 从服务器接受到消息后回调此函数
def on_message(client, userdata, msg):
    print("主题:" + msg.topic + " 消息:" + str(msg.payload))


client = mqtt.Client()
# 参数有 Client(client_id="", clean_session=True, userdata=None, protocol=MQTTv311, transport="tcp")
client.on_connect = on_connect  # 设置连接上服务器回调函数
client.on_message = on_message  # 设置接收到服务器消息回调函数
client.connect("www.liefyuan.top", 1883, 60)  # 连接服务器,端口为1883,维持心跳为60秒
client.publish('chat','this is a test!') # 往主题chat里发送消息
client.loop_forever()

二、flaskIO配合MQTT的应用

#encoding: utf-8

from flask import Flask, render_template, request
import eventlet
import json
import paho.mqtt.client as mqtt_client
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'] = 'www.liefyuan.top'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = ''
app.config['MQTT_PASSWORD'] = ''
app.config['MQTT_KEEPALIVE'] = 60
app.config['MQTT_TLS_ENABLED'] = False
app.config['MQTT_LAST_WILL_TOPIC'] = 'home/lastwill'
app.config['MQTT_LAST_WILL_MESSAGE'] = 'bye'
app.config['MQTT_LAST_WILL_QOS'] = 2


# 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_ws = Mqtt(app)
socketio = SocketIO(app)
bootstrap = Bootstrap(app)


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


@app.route('/ws')
def wevsocket():
    return render_template('websocket_mqtt_demo.html')

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


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


@mqtt_ws.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_ws.on_log()
def handle_logging(client, userdata, level, buf):
    print(client, userdata, level, buf)

if __name__ == '__main__':
    socketio.run(app, host='127.0.0.1', port=5001, use_reloader=True, debug=True)

四、flask、flaskIO、加纯Python代码的MQTT

#encoding: utf-8

from flask import Flask, render_template, request
import eventlet
import json
import paho.mqtt.client as mqtt_client
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'] = 'www.liefyuan.top'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = ''
app.config['MQTT_PASSWORD'] = ''
app.config['MQTT_KEEPALIVE'] = 60
app.config['MQTT_TLS_ENABLED'] = False
app.config['MQTT_LAST_WILL_TOPIC'] = 'home/lastwill'
app.config['MQTT_LAST_WILL_MESSAGE'] = 'bye'
app.config['MQTT_LAST_WILL_QOS'] = 2


# 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_ws = Mqtt(app)
socketio = SocketIO(app)
bootstrap = Bootstrap(app)

# 这里的初始化MQTT可以让纯Python代码运行起来
mqtt_client = mqtt_client.Client()
mqtt_client.connect("www.liefyuan.top", 1883, 60)  # 连接服务器,端口为1883,维持心跳为60秒


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


# 每次访问这个路由将向chat主题,提交一次数据data
@app.route('/mqtts')
def mqtts():
    # mqtt_client = myMqtt()
    mqtt_client.publish('chat', 'data')
    return 'ok'


@app.route('/ws')
def wevsocket():
    return render_template('websocket_mqtt_demo.html')


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


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


@mqtt_ws.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_ws.on_log()
def handle_logging(client, userdata, level, buf):
    print(client, userdata, level, buf)


if __name__ == '__main__':
    socketio.run(app, host='127.0.0.1', port=5001, use_reloader=True, debug=True)

【资源说明】 课程设计-基于Flask框架使用MQTT进行消息互动程序源码+项目说明.zip 【需求】: 在机房中,局域网环境下,学生与教师可以简单的在一个web页面中进行消息互动。 因为使用的联想云教室和极域电子教室都是可以接收学生端消息,但不能单独进行回复,所以自己试了下写了个小工具。 正好前段时间在弄物联网,使用MQTT这个消息队列,感觉传递消息很方便。既可以上传消息,也可以同时订阅消息接收服务端发过来的消息。 【实现功能】: 可以多个机房同时使用。 注:以下`127.0.0.1`的ip换成自己服务器在的ip就行。 比如room1教室,学生打开用户页面`127.0.0.1/room1`,用座位号进行登录(方便识别是哪个学生),然后就可以发送消息给教师; 教师登录管理页面`127.0.0.1/admin/room1`,room1的管理台后,可以接收消息,回复指定座位号的学生消息。 【实现过程】: 基于Flask(Python web框架),用Flask的web服务器。 一共3个页面: - 一个每个room的登录页面 login.html - 一个学生用户页 message.html - 一个教师管理后台页面 admin.html # 1.room登录页 login.html 比如通过:`http://127.0.0.1:5012/room1` 访问room1的登录页面 # 2.前端用户页 message.html 学生通过login.html 输入座位号登录。 在学生使用的用户页面上,用javascript 使用MQTT,发送消息; 同时在MQTT成功连接后开始订阅是否有教师端发过来的消息。 比如:输入座位号1登录后的页面是:`http://127.0.0.1:5012/user/room1/1` # 3.管理后台页 admin.html 在管理页面上,也是一样用用javascript 使用MQTT,在MQTT连接成功后开始订阅消息,当接收到消息之后显示出来。 然后当回复消息发送后,把消息发送去学生用户页面上,同时在管理页面上显示历史消息记录。 比如:room1的管理页面是:`http://127.0.0.1:5012/admin/room1` # 4.MQTT服务器 在app.py中配置了MQTT broker。 ```python # MQTT broker 配置 mqtt_account = { 'MQTT_BROKER':"192.168.31.181", 'MQTT_PORT':8083 } ``` 所以你需要有MQTT的服务器,我这用的是EMQX的,用Docker直接部署了一个在局域网环境就可以用。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值