MQTT Client mit Python - Subscriber (unverschlüsselt / plaintext)

Python MQTT Client - Subscriber / Abonnent

In den Beiträgen das MQTT Protokoll und SIMATIC S7-1200/1500 als MQTT Publisher (Teil 1) haben wir uns angeschaut, wie das MQTT Protokoll aufgebaut ist und wie wir mit unserer Siemens SIMATIC Steuerung Daten an einen MQTT Broker pushen können. In diesem Beitrag wollen wir uns anschauen, wie wir mit Python und einer geeigneten MQTT Client Bibliothek die Daten von unserer SIMATIC empfangen können – wir implementieren also einen MQTT Client mit der Rolle Subscriber. Als Bibliothek verwenden wir die Eclipse Paho MQTT Python client library.

Installation der Python MQTT-Client Bibliothek

Wir beginnen mit der Installation der Bibliothek, die sowohl auf Windows, Linux und macOS einfach durchzuführen ist. Im Terminal führen wir nachfolgende Befehle aus (funktioniert natürlich auch in einem virtualenv), um den paho MQTT Client mittels pip zu installieren: 

# paho-mqtt auf Linux / macOS installieren
sudo pip install paho-mqtt

# paho-mqtt auf Windows installieren
py -m pip install paho.mqtt

Python MQTT Client - Subscriber - Script

Jetzt können wir auch schon mit unserem Code für den MQTT Client fortfahren. Die beiden Kernfunktionen sind on_message() und on_connect() , die jeweils beim Verbindungsaufbau bzw. bei Ankunft einer neuen Nachricht aufgerufen werden.

In on_connect() wird - unter anderem - das Topic festgelegt auf das der Client subscribed, in on_message() kann dann bei Ankunft auf die Nachricht zugegriffen und diese verarbeitet werden.


# -*- coding: utf-8 -*-
# python mqtt client - subscriber
import paho.mqtt.client as mqtt

# broker settings
username="simsiincosuser"
password="s71500siincosmqtt"
broker_ip = "127.0.0.1"
broker_port = 1883
keepalive = 30
client_id="pyclient"
topic = '/controller1/data'
 
def on_message(client, userdata, message):
    payload = str(message.payload.decode("utf-8"))
    topic = message.topic
    print("Message: ", payload)
    print("Topic: ", topic)
 
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe(topic)

client = mqtt.Client(client_id=client_id, clean_session=True, userdata=None, protocol=mqtt.MQTTv311, transport="tcp")
client.on_connect = on_connect
client.on_message = on_message

client.username_pw_set(username=username, password=password)
client.connect(broker_ip, broker_port, keepalive)
 
print("Connected to MQTT Broker: " + broker_ip + ":" + str(broker_port))

client.loop_forever()

Unser Client verwendet die Zugangsdaten für den MQTT Broker, wie in SIMATIC S7-1200/1500 als MQTT Publisher (Teil 1) beschrieben. Die client_id muss jedoch unter allen am Broker verbundenen Clients für jeden Client eineindeutig sein (unique). Unser Script abonniert genau das gleiche Topic unter das unsere SIMATIC die Daten pusht: topic = '/controller1/data'. Er empfängt also alle Nachrichten der SIMATIC und gibt diese im Terminal aus.

Terminal Ausgabe unseres Python MQTT Client Skripts

Auch hier muss beachtet werden, dass unser Client sich zwar mit Benutzernamen und Passwort am MQTT Server authentifiziert, die eigentliche Datenübertragung jedoch unverschlüsselt ist.

Habt ihr Fragen? Dann schreibt uns – für mehr spannende Themen, abonniert unseren Siincos IoT Newsletter .