Da die Software für die IoT-Devices in Python entwickelt wird, müssen MQTT-Nachrichten aus Python heraus versendet und empfangen werden können. Dazu wird der Paho-MQTT-Client für Python verwendet.

Installation

Die Installation erfolgt mittels pip, dem Package Manager für Python. Damit das Paket nicht systemweit installiert wird, wird zunächst eine virtuelle Umgebung angelegt und aktiviert.

python -m venv mqtt
source mqtt/bin/activate

Die Installation wird mit folgendem Befehl ausgeführt.

pip install paho_mqtt

Das Paket kann nun innerhalb der virtuellen Umgebung verwendet werden.

Verbindung zum Broker herstellen

Unabhängig davon, ob Nachrichten empfangen oder versendet werden, ist eine Verbindung zu einem Broker notwendig. Damit die Verbindung hergestellt werden kann, muss der Hostname bzw. die IP-Adresse des Brokers sowie der verwendete Port bekannt sein. Zu Testzwecken wurde ein Broker ohne Authentifizierung aufgesetzt.

Damit eine Instanz des MQTT-Client erzeugt werden kann, muss zunächst die oben installierte Bibliothek importiert werden.. Anschließend kann die connect-Methode der Instanz mit den Verbindungsparametern aufgerufen werden. Damit die geöffnete Verbindung gehalten wird und auf eingehende Nachrichten überwacht wird, muss eine Schleife verwendet werden, die verhindert, dass das Skript weiterläuft und beendet wird. Dafür bringt der Client verschiedene Methoden mit, deren Namen mit loop beginnen. Die einfachste Variante ist die Methode loop_forever, die den Ablauf des Skripts an der Stelle ihres Aufrufs solange hält, bis durch den User abgebrochen wird.

Damit die Verbindung zum Broker nach Abbruch ordnungsgemäß getrennt wird, läuft die Schleife in einem try-Block. Zum Beenden kann Strg+C verwendet werden.

import paho.mqtt.client as mqtt

client = mqtt.Client()
client.connect("193.41.237.111", 1883, 60) # Daten des Brokers

try:
	client.loop_forever()
finally:
	client.disconnect()

Dies ist ein Minimalbeispiel und wird in den folgenden Schritten erweitert.

Subscribe

Das oben gezeigte Minimalbeispiel hält zwar eine Verbindung zum Broker, ist jedoch soweit nutzlos, da der Client für kein Topic registriert ist und somit keine Nachrichten empfängt. Um direkt nach dem Verbindungsaufbau ein Topic zu abonnieren, kanndem Client eine Handler-Methode übergeben werden. Diese wird nach Aufbau der Verbindung aufgerufen. Im Rumpf dieser Methode wird neben einer Meldung zum Status der Verbindung dann ein Topic abonniert. Dadurch werden alle Nachrichten dieses Topic empfangen.

def on_connect_handler(client, userdata, flags, return_code):
	print("Return Code: " + str(return_code))
	client.subscribe("iot")

Um empfangene Nachrichten zu verarbeiten, wird eine weitere Handler-Methode benötigt. Diese wird beim Empfang einer Nachricht aufgerufen und gibt das Topic sowie den Inhalt der empfangenen Nachricht aus.

def on_message_handler(client, userdata, message):
	print(message.topic)
	print(str(message.payload))

Wird nun wieder die Methode loop_forever des Client aufgerufen, wird jede empfangene Nachricht auf der Konsole ausgegeben. Das gesamte Skript sieht so aus:

import paho.mqtt.client as mqtt

def on_connect_handler(client, userdata, flags, return_code):
	print("Return Code: " + str(return_code))
	client.subscribe("iot")

def on_message_handler(client, userdata, message):
	print(message.topic)
	print(str(message.payload))

client = mqtt.Client()
client.on_connect = on_connect_handler
client.on_message = on_message_handler
client.connect("193.41.237.111", 1883, 60)

try:
	client.loop_forever()
finally:
	client.disconnect()

Die reine Konsolenausgabe der Nachrichten dient hier zu Demonstrationszwecken. Für einen Anwendungsfall müssen die Daten natürlich verarbeitet werden.

Publish

Im obigen Beispiel wurde zwar das Topic iot abonniert, jedoch werden keine Nachrichten empfangen, solange kein Client in diesem Topic Nachrichten veröffentlicht. Deshalb folgt hier das Skript für einen anderen Client, der Nachrichten veröffentlicht. Im späteren Anwendungsfall werden dies vor allem die IoT-Devices sein.

Der Client muss zunächst mit dem selben Broker wie der empfangende Client verbunden werden. Anschließend werden in einer Schleife solange Nachrichten veröffentlicht bis das Skript beendet wird. Im Beispiel wird alle 10 Sekunden die aktuelle Zeit veröffentlicht.

import paho.mqtt.client as mqtt
from datetime import datetime
from time import sleep

client = mqtt.Client()
client.connect("193.41.237.111", 1883, 60)

try:
	while True:
		payload = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
		client.publish("iot", payload=payload)
		print("Veröffentliche in iot: " + payload)
		sleep(10)
finally:
		client.disconnect()
		print("Verbindung getrennt")

Startet man nun die beiden Skripte parallel, sieht man wie einerseits Nachrichten veröffentlicht werden und andererseits die gleichen Nachrichten empfangen werden. Beide Skripte können mit Strg+C beendet werden.

MQTT mit Python

Ein Kommentar zu „MQTT mit Python

Schreibe einen Kommentar