So verwenden Sie MQTT in Flask

Flasche ist ein leichtgewichtiges, mit Python geschriebenes Webanwendungs-Framework, das als “Mikro-Framework” bezeichnet wird, weil es einen einfachen Kern zur Erweiterung anderer Funktionen verwendet, wie z.

MQTT ist ein leichtgewichtiges Nachrichtenübertragungsprotokoll für das Internet der Dinge (IoT), das auf dem Publish/Subscribe-Modus basiert. Es kann einen zuverlässigen Echtzeit-Nachrichtendienst für vernetzte Geräte mit sehr weniger Code und geringerer Bandbreite bereitstellen. Es ist weit verbreitet in IoT, mobilem Internet, intelligenter Hardware, IoV, Strom- und Energieindustrie usw.

Dieser Artikel stellt hauptsächlich vor, wie man MQTT im Flask-Projekt verwendet und die Verbindung, das Abonnement, das Messaging, das Abbestellen und andere Funktionen zwischen den implementiert MQTT-Client und MQTT-Broker.

Wir werden die verwenden Flask-MQTT Client-Bibliothek, die eine Flask-Erweiterung ist und als Dekorateur von angesehen werden kann paho-mqtt um die MQTT-Integration in Flask-Anwendungen zu vereinfachen.

Projektinitialisierung

Dieses Projekt wurde mit Python 3.8 entwickelt und getestet, und Benutzer können die folgenden Befehle verwenden, um die Version von Python zu überprüfen.

$ python3 --version
Python 3.8.2

Verwenden Sie Pip, um die Flask-MQTT-Bibliothek zu installieren.

pip3 install flask-mqtt

Verwenden Sie Flask-MQTT

Wir übernehmen die Kostenloser öffentlicher MQTT-Broker bereitgestellt von EMQ, das auf der Grundlage von erstellt wird MQTT-Cloud-Dienst – EMQX Cloud. Das Folgende sind die Serverzugriffsinformationen:

  • Makler: broker.emqx.io
  • TCP-Port: 1883
  • Websocket-Port: 8083

Importieren Sie Flask-MQTT

Importieren Sie die Flask-Bibliothek und die Flask-MQTT-Erweiterung und erstellen Sie die Flask-Anwendung.

from flask import Flask, request, jsonify
from flask_mqtt import Mqtt

app = Flask( __name__ )

Konfigurieren Sie die Flask-MQTT-Erweiterung

app.config['MQTT_BROKER_URL'] = 'broker.emqx.io'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = '' # Set this item when you need to verify username and password
app.config['MQTT_PASSWORD'] = '' # Set this item when you need to verify username and password
app.config['MQTT_KEEPALIVE'] = 5 # Set KeepAlive time in seconds
app.config['MQTT_TLS_ENABLED'] = False # If your server supports TLS, set it True
topic="/flask/mqtt"

mqtt_client = Mqtt(app)

Vollständige Konfigurationselemente finden Sie unter Flask-MQTT-Konfigurationsdokument.

Schreiben Sie die Connect-Callback-Funktion

Wir können erfolgreiche oder fehlgeschlagene MQTT-Verbindungen in dieser Callback-Funktion verarbeiten, und dieses Beispiel wird die abonnieren /flask/mqtt Thema nach einer erfolgreichen Verbindung.

@mqtt_client.on_connect()
def handle_connect(client, userdata, flags, rc):
   if rc == 0:
       print('Connected successfully')
       mqtt_client.subscribe(topic) # subscribe topic
   else:
       print('Bad connection. Code:', rc)

Callback-Funktion zum Schreiben von Nachrichten

Diese Funktion druckt die vom empfangenen Nachrichten /flask/mqtt Thema.

@mqtt_client.on_message()
def handle_mqtt_message(client, userdata, message):
   data = dict(
       topic=message.topic,
       payload=message.payload.decode()
  )
   print('Received message on topic: {topic} with payload: {payload}'.format(**data))

Nachrichtenveröffentlichungs-API erstellen

Wir erstellen eine einfache POST-API, um die MQTT-Nachrichten zu veröffentlichen.

In der Praxis benötigt die API möglicherweise eine kompliziertere Verarbeitung der Geschäftslogik.

@app.route('/publish', methods=['POST'])
def publish_message():
   request_data = request.get_json()
   publish_result = mqtt_client.publish(request_data['topic'], request_data['msg'])
   return jsonify({'code': publish_result[0]})

Führen Sie die Flask-Anwendung aus

Wenn die Flask-Anwendung gestartet wird, stellt der MQTT-Client eine Verbindung zum Server her und abonniert das Thema /flask/mqtt.

if __name__ == ' __main__':
   app.run(host="127.0.0.1", port=5000)

Prüfen

Nun verwenden wir die MQTT-Client – MQTT X zum Verbinden, Abonnieren und Veröffentlichen von Tests.

Erhalte Nachricht

Erstellen Sie eine Verbindung in MQTT X und verbinden Sie sich mit dem MQTT-Server.

MQTT X neue Verbindung

Veröffentlichen Hello from MQTT X zum /flask/mqtt Thema in MQTT X.

MQTT X veröffentlicht MQTT-Nachricht

Wir sehen die von MQTT X gesendete Nachricht im Flask-Ausführungsfenster.

Flask empfängt MQTT-Nachricht

Nachricht veröffentlichen

Abonnieren Sie die /flask/mqtt Thema in MQTT X.

MQTT X abonnieren

Verwenden Sie den Postboten, um anzurufen /publish API: Senden Sie die Nachricht Hello from Flask zum /flask/mqtt Thema.

Postboten-Test

Wir können die von Flask gesendete Nachricht in MQTT X sehen.

Flask veröffentlicht MQTT-Nachricht

Vollständiger Code

from flask import Flask, request, jsonify
from flask_mqtt import Mqtt

app = Flask( __name__ )

app.config['MQTT_BROKER_URL'] = 'broker.emqx.io'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_USERNAME'] = '' # Set this item when you need to verify username and password
app.config['MQTT_PASSWORD'] = '' # Set this item when you need to verify username and password
app.config['MQTT_KEEPALIVE'] = 5 # Set KeepAlive time in seconds
app.config['MQTT_TLS_ENABLED'] = False # If your broker supports TLS, set it True
topic="/flask/mqtt"

mqtt_client = Mqtt(app)

@mqtt_client.on_connect()
def handle_connect(client, userdata, flags, rc):
   if rc == 0:
       print('Connected successfully')
       mqtt_client.subscribe(topic) # subscribe topic
   else:
       print('Bad connection. Code:', rc)

@mqtt_client.on_message()
def handle_mqtt_message(client, userdata, message):
   data = dict(
       topic=message.topic,
       payload=message.payload.decode()
  )
   print('Received message on topic: {topic} with payload: {payload}'.format(**data))

@app.route('/publish', methods=['POST'])
def publish_message():
   request_data = request.get_json()
   publish_result = mqtt_client.publish(request_data['topic'], request_data['msg'])
   return jsonify({'code': publish_result[0]})

if __name__ == ' __main__':
   app.run(host="127.0.0.1", port=5000)

Einschränkungen

Flask-MQTT ist derzeit nicht für die Verwendung mit mehreren Worker-Instanzen geeignet. Wenn Sie also einen WSGI-Server wie z entlüften oder Gunicorn Stellen Sie sicher, dass Sie nur eine Worker-Instanz haben.

Bisher haben wir einen einfachen MQTT-Client mit Flask-MQTT fertiggestellt und können Nachrichten in der Flask-Anwendung abonnieren und veröffentlichen.

Ursprünglich erschienen bei emqx.com.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *