MQTT client Python paho.mqtt.client Quellcode (als Bild)

 

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 mit pip recht einfach durchzuführen ist. Im Terminal führen wir nachfolgende Befehle aus (funktioniert natürlich auch in einem Python virtualenv): 

# 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.

 

Python MQTT Subscriber zeigt Nachrichten eines SIMATIC S7-1500 MQTT Publishers

 

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.

 

Weiterführende Links und Quellen