Beruflich Dokumente
Kultur Dokumente
Rechtliche Hinweise
Nutzung der Anwendungsbeispiele
In den Anwendungsbeispielen wird die Lösung von Automatisierungsaufgaben im Zusammen-
spiel mehrerer Komponenten in Form von Text, Grafiken und/oder Software-Bausteinen
beispielhaft dargestellt. Die Anwendungsbeispiele sind ein kostenloser Service der Siemens AG
und/oder einer Tochtergesellschaft der Siemens AG ("Siemens"). Sie sind unverbindlich und
erheben keinen Anspruch auf Vollständigkeit und Funktionsfähigkeit hinsichtlich Konfiguration
und Ausstattung. Die Anwendungsbeispiele stellen keine kundenspezifischen Lösungen dar,
sondern bieten lediglich Hilfestellung bei typischen Aufgabenstellungen. Sie sind selbst für den
sachgemäßen und sicheren Betrieb der Produkte innerhalb der geltenden Vorschriften
verantwortlich und müssen dazu die Funktion des jeweiligen Anwendungsbeispiels überprüfen
und auf Ihre Anlage individuell anpassen.
Sie erhalten von Siemens das nicht ausschließliche, nicht unterlizenzierbare und nicht
übertragbare Recht, die Anwendungsbeispiele durch fachlich geschultes Personal zu nutzen.
Jede Änderung an den Anwendungsbeispielen erfolgt auf Ihre Verantwortung. Die Weitergabe an
Dritte oder Vervielfältigung der Anwendungsbeispiele oder von Auszügen daraus ist nur in
Kombination mit Ihren eigenen Produkten gestattet. Die Anwendungsbeispiele unterliegen nicht
zwingend den üblichen Tests und Qualitätsprüfungen eines kostenpflichtigen Produkts, können
Funktions- und Leistungsmängel enthalten und mit Fehlern behaftet sein. Sie sind verpflichtet, die
Nutzung so zu gestalten, dass eventuelle Fehlfunktionen nicht zu Sachschäden oder der
Verletzung von Personen führen.
Haftungsausschluss
Siemens schließt seine Haftung, gleich aus welchem Rechtsgrund, insbesondere für die
Verwendbarkeit, Verfügbarkeit, Vollständigkeit und Mangelfreiheit der Anwendungsbeispiele,
sowie dazugehöriger Hinweise, Projektierungs- und Leistungsdaten und dadurch verursachte
Schäden aus. Dies gilt nicht, soweit Siemens zwingend haftet, z.B. nach dem Produkthaftungs-
gesetz, in Fällen des Vorsatzes, der groben Fahrlässigkeit, wegen der schuldhaften Verletzung
des Lebens, des Körpers oder der Gesundheit, bei Nichteinhaltung einer übernommenen
© Siemens AG 2019 All rights reserved
Garantie, wegen des arglistigen Verschweigens eines Mangels oder wegen der schuldhaften
Verletzung wesentlicher Vertragspflichten. Der Schadensersatzanspruch für die Verletzung
wesentlicher Vertragspflichten ist jedoch auf den vertragstypischen, vorhersehbaren Schaden
begrenzt, soweit nicht Vorsatz oder grobe Fahrlässigkeit vorliegen oder wegen der Verletzung
des Lebens, des Körpers oder der Gesundheit gehaftet wird. Eine Änderung der Beweislast zu
Ihrem Nachteil ist mit den vorstehenden Regelungen nicht verbunden. Von in diesem Zusammen-
hang bestehenden oder entstehenden Ansprüchen Dritter stellen Sie Siemens frei, soweit
Siemens nicht gesetzlich zwingend haftet.
Durch Nutzung der Anwendungsbeispiele erkennen Sie an, dass Siemens über die beschriebene
Haftungsregelung hinaus nicht für etwaige Schäden haftbar gemacht werden kann.
Weitere Hinweise
Siemens behält sich das Recht vor, Änderungen an den Anwendungsbeispielen jederzeit ohne
Ankündigung durchzuführen. Bei Abweichungen zwischen den Vorschlägen in den Anwendungs-
beispielen und anderen Siemens Publikationen, wie z. B. Katalogen, hat der Inhalt der anderen
Dokumentation Vorrang.
Ergänzend gelten die Siemens Nutzungsbedingungen (https://support.industry.siemens.com).
Securityhinweise
Siemens bietet Produkte und Lösungen mit Industrial Security-Funktionen an, die den sicheren
Betrieb von Anlagen, Systemen, Maschinen und Netzwerken unterstützen.
Um Anlagen, Systeme, Maschinen und Netzwerke gegen Cyber-Bedrohungen zu sichern, ist es
erforderlich, ein ganzheitliches Industrial Security-Konzept zu implementieren (und kontinuierlich
aufrechtzuerhalten), das dem aktuellen Stand der Technik entspricht. Die Produkte und Lösungen
von Siemens formen nur einen Bestandteil eines solchen Konzepts.
Der Kunde ist dafür verantwortlich, unbefugten Zugriff auf seine Anlagen, Systeme, Maschinen
und Netzwerke zu verhindern. Systeme, Maschinen und Komponenten sollten nur mit dem
Unternehmensnetzwerk oder dem Internet verbunden werden, wenn und soweit dies notwendig
ist und entsprechende Schutzmaßnahmen (z.B. Nutzung von Firewalls und Netzwerk-
segmentierung) ergriffen wurden.
Zusätzlich sollten die Empfehlungen von Siemens zu entsprechenden Schutzmaßnahmen
beachtet werden. Weiterführende Informationen über Industrial Security finden Sie unter:
https://www.siemens.com/industrialsecurity.
Die Produkte und Lösungen von Siemens werden ständig weiterentwickelt, um sie noch sicherer
zu machen. Siemens empfiehlt ausdrücklich, Aktualisierungen durchzuführen, sobald die
entsprechenden Updates zur Verfügung stehen und immer nur die aktuellen Produktversionen zu
verwenden. Die Verwendung veralteter oder nicht mehr unterstützter Versionen kann das Risiko
von Cyber-Bedrohungen erhöhen.
Um stets über Produkt-Updates informiert zu sein, abonnieren Sie den Siemens Industrial
Security RSS Feed unter: https://www.siemens.com/industrialsecurity.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 2
Inhaltsverzeichnis
Inhaltsverzeichnis
Rechtliche Hinweise .................................................................................................... 2
1 Einführung .......................................................................................................... 4
1.1 Überblick............................................................................................... 4
1.2 Funktionsweise ..................................................................................... 6
1.3 Verwendete Komponenten ................................................................... 7
2 Engineering ........................................................................................................ 9
2.1 Bausteinbeschreibung .......................................................................... 9
2.1.1 Schnittstellenbeschreibung "LMQTT_Client" ....................................... 9
2.1.2 Übersicht der Datentypen................................................................... 12
2.2 Projektierung ...................................................................................... 18
2.2.1 TIA Portal Projekt erstellen................................................................. 18
2.3 Integration des Funktionsbausteins in das Anwenderprogramm ....... 19
2.3.1 Globale Bibliothek "LMQTT_Client" öffnen ........................................ 19
2.3.2 Funktionsbaustein und Datentyp ins Anwenderprogramm
kopieren .............................................................................................. 21
2.3.3 Globalen Datenbaustein erstellen ...................................................... 22
2.3.4 Funktionsbaustein im Anwenderprogramm aufrufen ......................... 25
2.4 Konfiguration der Security-Funktion ................................................... 27
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 3
1 Einführung
1 Einführung
1.1 Überblick
Motivation
Die Digitalisierung hat einen großen Einfluss auf die Wirtschaft und die
Gesellschaft und schreitet unaufhaltsam voran. Das "Internet of Things" (Internet
der Dinge, Kurzform: IoT) ist einer der Haupttreiber der Digitalisierung. Der Begriff
"Internet of Things" steht synonym für eine der größten aktuellen
Veränderungsdynamiken: die zunehmende Vernetzung und Automatisierung von
Geräten, Maschinen und Produkten.
Das Protokoll "Message Queue Telemetry Transport" (Kurzform: MQTT) wird im
"Internet of Things" als Kommunikationsprotokoll eingesetzt. Durch seinen
leichtgewichtigen Ansatz eröffnet es ganz neue Möglichkeiten in der
Automatisierung.
Applikative Umsetzung
Um das MQTT-Protokoll in eine SIMATIC S7-Steuerung zu implementieren, wird
Ihnen mit der Bibliothek "LMQTT_Client" eine adäquate Lösung angeboten.
Die Bibliothek "LMQTT_Client" stellt Ihnen einen Funktionsbaustein für die
SIMATIC S7-1500 und SIMATIC S7-1200 zur Verfügung. Der Funktionsbaustein
"LMQTT_Client" integriert die MQTT-Client-Funktion und ermöglicht es Ihnen,
MQTT-Nachrichten an einen Broker zu übermitteln (Publisher-Rolle) und
Abonnements zu erstellen (Subscriber-Rolle). Die Kommunikation kann dabei über
eine TLS-Verbindung gesichert werden.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 4
1 Einführung
Abbildung 1-1
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 5
1 Einführung
1.2 Funktionsweise
Schematische Darstellung
Die folgende Abbildung zeigt die wichtigsten Zusammenhänge zwischen den
beteiligten Komponenten und Schritte, die für eine gesicherte MQTT-
Kommunikation (MQTT over TLS) notwendig sind.
Abbildung 1-2
Engineering MQTT-Broker
Cert_xy
STEP 7 (TIA Portal) MQTT-Server
2
Certificate Store
idx Cert_Name 1
1 Cert_xy
Topic x Topic z
3
S7-CPU Message Message
Topic y
(MQTT-Client) Message
Topic y
© Siemens AG 2019 All rights reserved
Message
Publish
(Un)Subscribe
Tabelle 1-1
Schritt Beschreibung
1 Ermitteln Sie das CA-Zertifikat des MQTT-Brokers.
2 Importieren Sie das Fremdzertifikat in STEP 7 (TIA Portal). Das Zertifikat
befindet sich nun im globalen Zertifikatsmanager von STEP 7.
3 Das importierte Zertifikat müssen Sie der S7-CPU zuordnen. Um das Zertifikat
als gültig anzuerkennen, muss die Uhrzeit der S7-CPU aktuell sein.
4 Der Funktionsbaustein "LMQTT_Client" übernimmt folgende Rollen:
• Publisher, um MQTT-Nachrichten an den MQTT-Broker zu senden
• Subscriber, um MQTT-Nachrichten zu abonnieren oder Abonnements zu
beenden
Die MQTT-Nachricht ist über eine gesicherte Verbindung (MQTT over TLS)
verschlüsselt.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 6
1 Einführung
höher
– CP 1243-7 LTE
(6GK7243-7KX30-0XE0 /
6GK7243-7SX30-0XE0)
mit Firmware V3.2 oder
höher
TIA Portal V15.1 - DVD: -
6ES7822-1AA05-0YA5
Download:
6ES7822-1AE05-0YA5
TIA Portal V16 - DVD: -
6ES7822-1AA06-0YA5
Download:
6ES7822-1AE06-0YA5
MQTT-Broker - - Wenn Sie die Kommunikation
verschlüsseln möchten, muss der
MQTT-Broker SSL/TLS-Verfahren
unterstützen.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 7
1 Einführung
Hinweis Mit S7-1500 CPUs können Sie den MQTT-Broker über eine statische IP-Adresse
oder einen Domänennamen ("Qualified Domain Name", kurz: QDN) zu
erreichen, wenn Sie die Bibliothek "LMQTT_Client" einsetzen.
Mit S7-1200 CPUs können Sie den MQTT-Broker über eine statische IP-Adresse
erreichen, wenn Sie die Bibliothek "LMQTT_Client" einsetzen.
Mit S7-1200 CPUs können Sie den MQTT Broker mit der TIA Portal V16
Bibliothek und Firmware 4.4 auch über einen Domänennamen ("Qualified
Domain Name", kurz: QDN) erreichen.
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 8
2 Engineering
2 Engineering
2.1 Bausteinbeschreibung
2.1.1 Schnittstellenbeschreibung "LMQTT_Client"
Eingangsparameter
Tabelle 2-1
Parameter Datentyp Funktion
enable BOOL Steuerparameter
TRUE: Die Verbindung zum
MQTT-Broker wird aufgebaut
und gehalten.
FALSE: Die Verbindung wird
abgebaut.
publishData LMQTT_typePublishData Bei bestehender Verbindung
können Daten zum
MQTT-Broker gesendet
(publish) werden.
Tabelle 2-7 zeigt den Aufbau
des Datentyps
"LMQTT_typePublishData".
subscribeToTopic LMQTT_typeSubscribeData Bei bestehender Verbindung
können Daten vom
MQTT-Broker abonniert
(subscribe) werden.
Wenn Daten empfangen
werden, dann werden diese am
Ausgang "subscriptionMessage"
bereitgestellt.
Tabelle 2-8 zeigt den Aufbau
des Datentyps
"LMQTT_typeSubscribeData".
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 9
2 Engineering
Ausgangsparameter
Tabelle 2-2
Parameter Datentyp Funktion
tcpEstablished BOOL True, wenn die TCP-Verbindung
aufgebaut wurde
mqttEstablished BOOL True, wenn die MQTT-
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 10
2 Engineering
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 11
2 Engineering
Hinweis Wenn Sie die Bibliothek für TIA Portal V16 verwenden, gilt die Beschreibung des
Datentyps auch für die S7-1200.
Tabelle 2-3
Parameter Datentyp Bedeutung
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 12
2 Engineering
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 13
2 Engineering
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 14
2 Engineering
– "willQoS_1"
– "willQoS_2"
– "willRetain"
3. Wenn Sie die Flags "username" und "password" auf "true" setzen, müssen
Sie bei den Variablen "userName" und "password" eine Zeichenkette mit den
Login-Daten hinterlegen. Diese Login-Daten müssen mit den Login-Daten
übereinstimmen, die Sie am MQTT-Broker hinterlegt haben.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 15
2 Engineering
LMQTT_typePublishData
Dieser Datentyp beinhaltet Topic, Nachrichtentext und Flags für die MQTT-
Nachricht, die zum MQTT-Broker gesendet wird.
Die folgende Tabelle zeigt den Aufbau des Datentyps "LMQTT_typePublishData.
Tabelle 2-7
Parameter Datentyp Bedeutung
publishMessage BOOL Setzten Sie den Parameter "publishMessage" auf
"TRUE", um Daten an den MQTT-Broker zu senden.
Wenn die Daten erfolgreich an den MQTT-Broker
übertragen wurden (Ausgang "done" des
FB "LMQTT_Client" wird für einen Zyklus auf "TRUE"
gesetzt), kann der Parameter "publishMessage" auf
"FALSE" zurückgesetzt werden.
publishTopic WString [250] Name für das Topic
Die Größe muss in den folgenden Konstanten im FB
angepasst werden:
• MAX_SENDBUFFER
• MAX_PUBLISH_MESSAGE
Hinweis
Der Parameter "publishTopic" darf kein leere
Zeichenkette enthalten.
publishMessageData • STEP 7 V15.1 Nachrichtentext
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 16
2 Engineering
LMQTT_typeSubscribeData
Dieser Datentyp ermöglicht es Ihnen, ein Topic zu abonnieren oder abzumelden.
Damit können Sie Daten vom MQTT-Broker empfangen.
Die folgende Tabelle zeigt den Aufbau des Datentyps
"LMQTT_typeSubscribeData".
Tabelle 2-8
Parameter Datentyp Bedeutung
subscribeToTopic Bool True, um das Topic zu abonnieren, das mit dem Parameter
"subscriptionTopic" indiziert wird.
unsubscribeFromTopic Bool True, um das Topic zu abzumelden, das mit dem Parameter
"subscriptionTopic" indiziert wird.
subscriptionTobic WString [250] Name des Topic, das vom MQTT-Broker abonniert oder
abgemeldet werden soll.
Hinweis
Der Parameter "subscriptionTopic" darf kein leere
Zeichenkette enthalten
subscriptionQoS Int Definiert den QoS-Level für die MQTT-Nachricht im
Abonnenten. Mögliche Werte sind:
• "0" für QoS-Stufe 0
• "1" für QoS-Stufe 1
© Siemens AG 2019 All rights reserved
LMQTT_typeSubscriptionData
Dieser Datentyp enthält die Empfangsdaten.
Die folgende Tabelle zeigt den Aufbau des Datentyps
"LMQTT_typeSubscriptionData".
Tabelle 2-9
Parameter Datentyp Bedeutung
newMessageReceived BOOL True für einen Zyklus, wenn Daten erfolgreich empfangen
wurden.
messageInvalid BOOL True, wenn eine der folgenden Bedingungen erfüllt ist:
• Der interne Puffer des FB "LMQTT_Client" ist zu klein.
• Die Länge der Zeichenkette "receivingTopic" oder
"receivedMessageData" ist zu klein.
receivingTopic WString [400] Name des abonnierten Topics
receivedMessageData WString [2400] Empfangsdaten (Nachrichtentext zum abonnierten Topic)
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 17
2 Engineering
2.2 Projektierung
2.2.1 TIA Portal Projekt erstellen
1. Erstellen Sie ein TIA Portal Projekt mit der CPU, die Sie für das
Anwendungsbeispiel verwenden möchten.
2. Parametrieren Sie die Ethernet-Schnittstelle der CPU mit einer IP-Adresse, die
im gleichen Subnetz wie der MQTT-Broker liegt.
3. Wenn Sie einen Cloud-Service wie AWS verwenden, dann parametrieren Sie
einen Router und einen DNS-Sever.
4. Verbinden Sie die CPU und dem MQTT-Broker über Ethernet.
Hinweis Für die gesicherte MQTT-Kommunikation über TLS benötigen Sie eine S7-1500
CPU ab Firmware-Version 2.0 oder eine S7-1200 CPU ab Firmware V4.3.
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 18
2 Engineering
1. Klicken Sie im TIA Portal Projekt auf die Task Card "Bibliotheken" ("Libraries")
und öffnen Sie die Palette "Globale Bibliotheken" ("Global libraries").
2. Klicken Sie auf die Schaltfläche "Globale Bibliothek öffnen" ("Open global
library").
Der Dialog "Globale Bibliothek öffnen" ("Open global library") wird geöffnet.
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 19
2 Engineering
3. Wählen Sie die globale Bibliothek "LMQTT_Client" aus und bestätigen Sie die
Auswahl über die Schaltfläche "Öffnen" ("Open").
4. Die Bibliothek "LMQTT_Client" wird geöffnet und unter der Palette "Globale
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 20
2 Engineering
2. Fügen Sie den Funktionsbaustein für Ihre CPU per Drag & Drop in den Ordner
"Programmbausteine" ("Program blocks") Ihres Geräts, z. B. S7-1500 CPU,
ein.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 21
2 Engineering
Dieses Kapitel zeigt Ihnen, wie Sie einen globalen Datenbaustein (DB) erstellen.
Dieser DB dient zum Speichern der folgenden Daten:
• TCP-Verbindungsparameter
• MQTT-Verbindungsparameter
• Topic und Nachricht, die an den MQTT-Broker gesendet werden soll (publish)
• Empfangsdaten, d. h. Nachricht und Name des abonnierten Topic (subscribe)
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 22
2 Engineering
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 23
2 Engineering
Tabelle 2-10
Name Datentyp Verschaltung am
FB
enable Bool Eingang "enable"
tcpParam LMQTT_typeTCPConnParamData Eingang
"tcpConnParam"
mqttParam LMQTT_typeParamData Eingang
"mqttParam""
mqttDataPublish LMQTT_typePublishData Eingang
"publishData"
mqttDataSubscribe LMQTT_typeSubscribeData Eingang
"subscribeToTopic"
mqttSubscriptionMessage LMQTT_typeSubscriptionData Ausgang
"subscription
Message"
tcpEstablished Bool Ausgang
"tcpEstablished"
mqttEstablished Bool Ausgang
"mqttEstablished"
done Bool Ausgang "done"
busy Bool Ausgang "busy"
error Bool Ausgang "error"
status Word Ausgang "status"
statusID Int Ausgang "statusID"
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 24
2 Engineering
Programmeditor zu öffnen.
3. Ziehen Sie per Drag & Drop den FB "LMQTT_Client" aus der Projektnavigation
in ein beliebiges Netzwerk des OB 1.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 25
2 Engineering
6. Belegen Sie die Ein- und Ausgänge des FBs mit den variablen, die Sie im
globalen Datenbaustein angelegt haben (siehe Kapitel 2.3.3).
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 26
2 Engineering
Hinweis Sie müssen die Security-Funktion nur konfigurieren, wenn Sie eine gesicherte
MQTT-Verbindung über TLS verwenden.
Die Verschlüsselung über SSL/TLS funktioniert über Zertifikate. Ein Zertifikat ist ein
vom Inhaber signierter öffentlicher Schlüssel, der dessen Authentizität und
Integrität garantiert. Zur Authentifizierung des Brokers benötigt der MQTT-Client
das CA-Zertifikat des Brokers.
Dieses Kapitel zeigt Ihnen, wie Sie das Zertifikat des MQTT-Brokers in die CPU
(MQTT-Client) importieren können. Nur mit diesem Zertifikat ist eine verschlüsselte
© Siemens AG 2019 All rights reserved
MQTT-Kommunikation möglich.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 27
2 Engineering
("Protection & Security > Certificate manager") aus. Aktivieren Sie die Option
"Globale Security-Einstellungen für den Zertifikatsmanager verwenden" ("Use
global security settings for certificate manager").
Ergebnis
In der Projektnavigation erscheint der neue Eintrag "Security-Einstellungen"
("Security settings").
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 28
2 Engineering
Benutzer anmelden
Nachdem Sie die globalen Security-Einstellungen für den Zertifikatsmanager
aktiviert haben, müssen Sie sich bei den Security-Einstellungen anmelden. Ohne
Anmeldung können Sie nicht auf den globalen Zertifikatsmanager zugreifen.
Melden Sie sich als Security-Benutzer für die Security-Einstellungen wie folgend
beschrieben an:
1. Doppelklicken Sie in der Projektnavigation unter "Security-Einstellungen"
("Security settings") auf den Eintrag "Einstellungen" ("Settings").
2. Der Editor für die Benutzerverwaltung wird geöffnet und der Bereich für den
Projektschutz wird angezeigt.
Klicken Sie auf die Schaltfläche "Dieses Projekt schützen" ("Protect this
project").
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 29
2 Engineering
Ergebnis
Sie haben die Benutzerverwaltung aktiviert. Sie sind als Projektadministrator
angemeldet und können die Security-Einstellungen nutzen.
Wenn Sie sich angemeldet haben, erscheint unter dem Eintrag "Security-
Einstellungen > Sicherheitsfunktionen" ("Security settings > Security features")
unter anderem eine Zeile "Zertifikatsmanager" ("Certificate manager").
Abbildung 2-1
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 30
2 Engineering
2. Wählen Sie für das zu importierende Zertifikat das passende Register aus,
z. B. "Vertrauenswürdige Zertifikate und Stammzertifizierungsstellen".
3. Klicken Sie mit der rechten Maustaste in das Register, um das Kontextmenü
zu öffnen. Klicken Sie auf "Importieren" ("Import").
© Siemens AG 2019 All rights reserved
Ergebnis
Das CA-Zertifikat des MQTT-Brokers befindet sich nun im globalen
Zertifikatsmanager.
Abbildung 2-2
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 31
2 Engineering
• Das Client-Zertifikat muss von derselben CA signiert sein, wie das Server-
Zertifikat.
• Das Client-Zertifikat muss als PK12-Container (mit Zertifikat und privatem
Schlüssel) in den globalen Zertifikatsmanager importiert werden.
• Das Client-Zertifikat muss in die Tabelle "Geräte Zertifikate" ("Device
certificates") importiert werden.
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 32
2 Engineering
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 33
2 Engineering
4. Klicken Sie in die neue Zeile. Die Auswahl für neue Zertifikate öffnet sich.
Wählen Sie das zuvor importierte CA-Zertifikat aus dem globalen
Zertifikatsmanager aus und klicken Sie auf den grünen Haken.
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 34
2 Engineering
Ergebnis
Das ausgewählte Zertifikat wurde der CPU zugewiesen und mit einer ID versehen.
Die ID ist die Nummer des Zertifikats. Diesen Wert tragen Sie in den
Verbindungsparametern für den Parameter "idTlsServerCertificate" ein
(siehe Tabelle 2-3).
Abbildung 2-3
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 35
2 Engineering
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 36
2 Engineering
Anwendungsbeispiel bedienen
Wenn Sie alle Parameter eingestellt haben und das CA-Zertifikat des MQTT-
Brokers in den lokalen Zertifikatsmanager der CPU hinzugefügt haben, können Sie
das Anwendungsbeispiel testen.
Bevor Sie das Anwendungsbeispiel testen, überprüfen Sie folgende Punkte:
1. Das Projekt ist in die CPU geladen.
2. Die CPU und der MQTT-Broker sind miteinander über Ethernet verbunden und
erreichbar.
3. Der MQTT-Broker ist ordnungsgemäß konfiguriert und gestartet.
4. Das Logging am MQTT-Broker ist bei Bedarf gestartet, um die Anmeldung des
MQTT-Clients und den Publish-Mechanismus mitzuversorgen.
Wenn die genannten Punkte erfüllt sind, können Sie die MQTT-Kommunikation
zwischen CPU und MQTT-Broker anstoßen. Triggern Sie dafür die Variable
"enable" am Funktionsbaustein "LMQTT_Client“. Solange der Eingang auf „True“
gesetzt ist, bleibt die Verbindung bestehen. Wird Enable auf „False“ gesetzt, wird
die Verbindung abgebaut.
Im positiven Fall werden die internen Zustandsautomaten durchlaufen und stellen
eine TCP- bzw. MQTT-Verbindung zum MQTT-Broker her. Die Ausgangsvariablen
"tcpConnected" und "mqttConnected" werden gesetzt und signalisieren eine
bestehende TCP- bzw. MQTT-Verbindung.
Nun können Sie eine MQTT-Nachricht senden oder eine MQTT-Nachricht zu
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 37
2 Engineering
2.6 Fehlerhandling
Wenn ein Fehler im Programm auftritt, wird der aktuelle Zustand der
Zustandsautomaten und die Fehlerursache in den Ausgangsparametern "statusID"
und "status" geschrieben.
"statusID"
Am Ausgang "statusID" wird die Nummer des Zustands ausgegeben, in dem der
Fehler aufgetreten ist. Die Zustände sind durchnummeriert und haben folgende
Bedeutung.
Tabelle 2-11
Wert Beschreibung
-1 TCP_DISCONNECT
2 TCP_CONNECTING
3 TCP_CONNECTED
9 MQTT_DISCONNECT_STATE
10 MQTT_CONNECT_FLAG_CHECK_STATE
11 MQTT_CONNECT_STATE
12 MQTT_CONNACK_STATE
13 MQTT_PUBLISH_STATE
© Siemens AG 2019 All rights reserved
14 MQTT_PUBACK_STATE
15 MQTT_SUBSCRIBE_STATE
17 MQTT_PING
19 MQTT_PUBREC_ACK_STATE
20 MQTT_PUBCOMP_STATE
21 MQTT_SUBACK_STATE
22 MQTT_UNSUBSCRIBE_STATE
23 MQTT_UNSUBACK_STATE
26 MQTT_RECEIVED_QOS1_STATE
54 MQTT_MSG_TYPE_PUB_INC_MESSAGE_BAD
-13 MQTT_TIMEOUT_ID
-14 MQTT_BAD_ID
-16 TIME_MONITORING_ID
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 38
2 Engineering
"status"
Der Ausgangsparameter "status" zeigt den Fehlercode an:
Tabelle 2-12
statusID status Beschreibung Abhilfe
-1 Statusmeldung Siehe Handbuch ─
vom Baustein
"TDISCON"
2 Statusmeldung Siehe Handbuch Erreichbarkeit des MQTT-
vom Baustein Brokers prüfen:
"TCON" • IP-Adresse
• Port
• Firewall
3 Statusmeldung Siehe Handbuch Netzwerkverbindung prüfen
vom Baustein
"TRCV"
9 Statusmeldung Siehe Handbuch ─
vom Baustein
"TSEND"
10 W#16#80F0 Fehler bei den Flags "Will" Prüfen Sie die folgenden
im Datentyp Parameter im Datentyp
"LMQTT_typeConnectFlags": "LMQTT_typeConnectFlags":
Der Parameter "willRetain" • will
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 39
2 Engineering
3 MQTT-Service nicht
verfügbar.
4 Die Daten im
Benutzernamen und
Passwort sind inkorrekt.
5 Der MQTT-Client ist nicht
berechtigt sich zu verbinden.
13 W#80F4 Die Serverqualität QoS der Folgende Werte sind möglich
zu versendenden Nachricht für QoS:
ist nicht korrekt. • QoS = 0: fire and forget
• QoS = 1: Nachricht
kommt mindestens
einmal an
© Siemens AG 2019 All rights reserved
• QoS = 2: Nachricht
kommt genau einmal an
W#80F5 Name des Topic, an das Sie Tragen Sie im Parameter
Nachrichten senden "publishTopic" des
möchten, wurde nicht Datentyps
definiert. "LMQTT_typePublishData"
den Namen des Topic ein,
an das Nachrichten
gesendet werden sollen.
14 W#80F2 Falsche Paket-ID im ─
"PUBACK"-Paket (Publish
Acknowledgement)
15 W#80F4 Die Serverqualität QoS der Folgende Werte sind möglich
empfangenen Nachricht ist für QoS:
nicht korrekt. • QoS = 0: fire and forget
• QoS = 1: Nachricht
kommt mindestens
einmal an
• QoS = 2: Nachricht
kommt genau einmal an
W#80F5 Name des Topic, das Tragen Sie im Parameter
abonniert werden soll, wurde "subscriptionTopic" des
nicht definiert. Datentyps
"LMQTT_typeSubcripeData"
den Namen des Topic ein,
das abonniert werden sollen.
17 Statusmeldung Siehe Handbuch ─
vom Baustein
"TSEND"
19 W#80F2 Falsche Paket-ID im ─
"PUBREC"-Paket (Publish
Received)
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 40
2 Engineering
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 41
3 Wissenswertes
3 Wissenswertes
3.1 Grundlagen zu MQTT
3.1.1 Terminologie
MQTT-Nachricht
Eine Nachricht bei MQTT besteht aus mehreren Teilen:
• Einem definierten Betreff ("Topic")
• Ein zugewiesenes Merkmal zur Qualitätssicherung ("Quality of Service")
• Dem Nachrichtentext
MQTT-Client
Ein MQTT-Client ist ein Programm oder ein Gerät, das MQTT nutzt. Ein Client baut
© Siemens AG 2019 All rights reserved
immer aktiv die Verbindung zum Broker auf. Ein Client kann folgende Funktionen
ausführen:
• Nachrichten mit einem definierten Betreff ("Topic") an den MQTT-Broker
senden, an denen andere Clients interessiert sein könnten (Publish-
Mechanismus)
• Nachrichten beim MQTT-Broker abonnieren, die einem bestimmten Betreff
("Topic") folgen (Subscriber-Mechanismus)
• Sich selbst von abonnierten Nachrichten abmelden
• Die Verbindung zum Broker trennen
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 42
3 Wissenswertes
MQTT-Broker
Ein MQTT-Broker ist die zentrale Komponente von MQTT und kann ein Programm
oder ein Gerät sein. Der MQTT-Broker agiert als Vermittler zwischen dem
sendenden MQTT-Client und dem abonnierenden MQTT-Client. Der MQTT-Broker
verwaltet die Topics inklusive der darin enthaltenen Nachrichten und regelt den
Zugriff auf die Topics. Der MQTT-Broker hat folgende Funktionen:
• Netzwerkverbindungen von den MQTT-Clients akzeptieren
• Nachrichten eines MQTT-Client entgegennehmen
• Abonnement-Anfragen von MQTT-Clients bearbeiten
• Nachrichten an die MQTT-Clients weiterleiten, die mit Ihrem Abonnement
übereinstimmen
Hinweis Der MQTT-Broker ist nicht Teil dieses Anwendungsbeispiels und wird als
gegeben vorausgesetzt.
Topics
MQTT-Nachrichten sind in Topics organisiert. Ein Topic "beschreibt" ein
Themengebiet. Die Topics können von den MQTT-Clients abonniert werden
(Subscriber-Mechanismus). Dem Absender einer Nachricht (Publisher-
© Siemens AG 2019 All rights reserved
Mechanismus) obliegt die Aufgabe, Inhalt und Topic beim Versand der Nachricht
festzulegen. Der Broker kümmert sich dann darum, dass die Subscriber die
Nachrichten von den abonnierten Topics bekommen. Die Topics folgen einem
definierten Schema. Sie ähneln einem Verzeichnispfad und bilden eine Hierarchie
ab.
ISO Standard
MQTT definiert einen OASIS- bzw. ISO-Standard (ISO/IEC PRF 20922).
Je nach verwendeten Sicherheitsprotokollen läuft MQTT auf unterschiedliche
Zugriffs-Ports. Angebotene Ports sind:
• 1883: MQTT, unverschlüsselt
• 8883: MQTT, verschlüsselt
• 8884: MQTT, verschlüsselt, Client Zertifikat notwendig
• 8080: MQTT über WebSockets, unverschlüsselt
• 8081: MQTT über WebSockets, verschlüsselt
Architektur
MQTT ist ein Publish- und Subscribe-Protokoll. Dieser Mechanismus entkoppelt
einen Client, der Nachrichten sendet (Publisher) von einen oder mehreren Clients,
welche die Nachrichten empfangen (Subscriber). Das bedeutet auch, dass die
"Publisher" nichts von der Existenz der "Subscriber" wissen (und umgekehrt).
Es gibt eine dritte Komponente in der MQTT-Architektur, der MQTT-Broker. Der
MQTT-Broker befindet sich zwischen "Publisher" und "Subscriber". Der MQTT-
Broker sorgt für die Kommunikationssteuerung.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 43
3 Wissenswertes
3.1.3 Features
Quality of Service
Für die Qualitätssicherung bei der Nachrichtenübermittlung sieht die MQTT-
Spezifikation drei Servicequalitäten vor:
• QoS "0": Bei der niedrigsten Stufe 0 handelt es sich um ein "fire and forget"-
Verfahren. Es gibt also keine Garantie, dass die Nachricht überhaupt
ankommt.
• QoS "1": Bei dem QoS-Level 1 ist sichergestellt, dass die Nachricht
mindestens einmal in der Topic-Queue landet. Der MQTT Broker quittiert den
Erhalt der Nachricht.
• QoS "2": In der höchsten Stufe 2 garantiert der MQTT-Broker durch
mehrfachen Handshake mit dem MQTT-Client, dass die Nachricht genau
einmal abgelegt wird.
Last will
MQTT unterstützt die Funktion "Last Will and Testament". Diese Funktion wird
verwendet, um anderen MQTT-Clients zu unterrichten, wenn die Verbindung zu
einem MQTT-Client unvorhergesehen getrennt wurde.
Jeder MQTT-Client kann während des Verbindungsaufbaus zum MQTT-Broker
© Siemens AG 2019 All rights reserved
seinen letzten Willen spezifizieren und dem MQTT-Broker mitteilen. Dieser letzte
Wille ist wie eine normale MQTT-Nachricht aufgebaut, inklusive Topic, QoS und
Payload. Der MQTT-Broker speichert den letzten Willen. Sobald der MQTT-Broker
merkt, dass die Verbindung mit dem betreffenden MQTT-Client unvorhergesehen
abgebrochen wurde, schickt der MQTT-Broker an alle Abonnenten, die sich für das
Topic registriert haben, den letzten Willen als MQTT-Nachricht heraus. Auf diese
Weise erfahren auch die Abonnenten, dass der MQTT-Client getrennt wurde.
KeepAlive
MQTT unterstützt die Funktion "KeepAlive". Diese gewährleistet, dass die
Verbindung noch offen ist sowie MQTT-Client und MQTT-Broker miteinander
verbunden sind.
Für das KeepAlive definieren die MQTT-Clients ein Zeitintervall und teilen es dem
MQTT-Broker während ihres Verbindungsaufbaus mit. Dieses Intervall ist die
größtmögliche, geduldete Zeitperiode, in welcher der MQTT-Client und der MQTT-
Broker ohne Kontakt verharren dürfen. Wird die Zeit überschritten, muss der
MQTT-Broker die Verbindung trennen.
Das bedeutet, solange der MQTT-Client regelmäßig Nachrichten innerhalb des
KeepAlive-Intervalls an den Broker schickt, muss der MQTT-Client keine
besondere Aktion ausführen, um die Verbindung aufrecht zu erhalten. Wenn der
MQTT-Client aber keine Nachrichten innerhalb des KeepAlive-Intervalls sendet,
muss er vor Ablauf der Frist ein Ping-Paket an den MQTT-Broker absetzen. Mit
diesem PING signalisiert der MQTT-Client dem MQTT-Broker, dass er weiterhin
verfügbar ist.
Wenn eine Nachricht oder ein Ping-Paket an den MQTT-Broker geschickt wurde,
beginnt die Zeitmessung für das KeepAlive-Intervall von vorne.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 44
3 Wissenswertes
Hinweis • Der Client bestimmt das KeepAlive-Intervall. So kann er das Intervall seiner
Umgebung anpassen, z. B. wegen einer langsamen Bandbreite.
• Der größtmögliche Wert für das KeepAlive-Intervall ist 18 h 12 m 15 s.
• Wenn der Client das KeepAlive-Intervall auf den Wert "0" setzt, wird der
KeepAlive-Mechanismus deaktiviert.
Message Persistence
Wird die Verbindung zu einem MQTT-Client unterbrochen, so kann der Broker
neue Nachrichten für diesen Client für eine spätere Zustellung zwischenspeichern.
Retained Messages
Abonniert ein MQTT-Client zum ersten Mal ein Topic, bekommt er normalerweise
erst dann eine Nachricht, wenn ein anderer MQTT-Client das nächste Mal eine
Nachricht mit dem abonnierten Topic sendet. Mit "Retained Messages" bekommt
der Abonnent den letzten Wert, der vor seiner Abonnementsanfrage an das Topic
gesendet wurde, sofort zugestellt.
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 45
3 Wissenswertes
Fixed header
Pflicht für alle Kontrollpakete
Variable header
Pflicht für einige Kontrollpakete
Payload
Pflicht für alle Kontrollpakete
Der "Variable Header" ist nur bei einigen Kontrollpaketen erforderlich. Der Inhalt
des "Variable Header" ist abhängig vom Kontrollpakettyp.
Der Payload ist bei den meisten Kontrollpaketen Pflicht. Auch hier ist der Inhalt
vom Kontrollpakettyp abhängig. Für jedem Kontrollpakettyp gibt es klare
Regelungen, mit was und in welcher Reihenfolge der Payload befüllt werden kann.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 46
3 Wissenswertes
3.1.5 MQTT-Verbindungsaufbau
Eine MQTT-Verbindung wird immer zwischen einem MQTT-Client und dem MQTT-
Broker hergestellt. Eine direkte Client-Client-Verbindung ist nicht möglich.
Die Verbindung wird von einem MQTT-Client initiiert, sobald der MQTT-Client ein
"CONNECT"-Paket an den MQTT-Broker schickt. Im positiven Fall antwortet der
MQTT-Broker mit einem "CONNACK"-Paket und einem Statuscode.
MQTT-Kontrollpaket "CONNECT"
Tabelle 3-1 zeigt den Aufbau des "Fixed Header" des "CONNECT"-Pakets.
Tabelle 3-1
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 1 (dez)
© Siemens AG 2019 All rights reserved
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
"Variable Header" + "Payload"
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 47
3 Wissenswertes
Tabelle 3-2 zeigt den Aufbau des "Variable Header" des "CONNECT"-Pakets.
Tabelle 3-2
Variable Header
Bit 7 6 5 4 3 2 1 0
Protokollname
Byte 1 Länge MSB = 0 (dez)
Byte 2 Länge LSB = 4 (dez)
Byte 3 'M'
0 1 0 0 1 1 0 1
Byte 4 'Q'
0 1 0 1 0 0 0 1
Byte 5 'T'
0 1 0 1 0 1 0 0
Byte 6 'T'
0 1 0 1 0 1 0 0
Protokolllevel
Byte 7 Protokolllevel = 4 (dez)
Connect Flags
Byte 8 Benutzer- Passwort- Will Will QoS-Flag Will- Clean Reserve
name- Flag Retain- Flag Session-
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 48
3 Wissenswertes
MQTT-Kontrollpaket "CONNACK"
Tabelle 3-3 zeigt den Aufbau des "Fixed Header" des "CONNACK"-Pakets:
Tabelle 3-3
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 2 (dez)
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
"Variable Header" = 2 Byte
Tabelle 3-4 zeigt den Aufbau des "Variable Header" des "CONNACK"-Pakets.
Tabelle 3-4
Variable Header
Bit 7 6 5 4 3 2 1 0
Connect Acknowledge Flags
Byte 1 Reserve Session
Present
Connect Return Code
Byte 2 • 0x00 = Der MQTT-Broker akzeptiert die Verbindung. Der MQTT-
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 49
3 Wissenswertes
3.1.6 MQTT-Push-Mechanismus
Sobald sich ein MQTT-Client mit dem MQTT-Broker verbunden hat, kann er
Nachrichten an den MQTT-Broker schicken. Dazu nutzt der Client das "PUBLISH"-
Paket. Da die Nachrichten bei MQTT topic-basiert gefiltert und verwaltet werden,
muss jede MQTT-Nachricht ein Topic beinhalten. Das Topic ist Teil des "Variable
Header". Der eigentliche Nachrichtentext ist im "Payload" untergebracht.
"PUBLISH"-Paket
Tabelle 3-5 zeigt den Aufbau des "Fixed Header" des "PUBLISH"-Pakets.
Tabelle 3-5
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- DUP- QoS-Level Retain-
Kontrollpakettyp = 3 (dez) Flag Flag
0 0 1 1 X X X X
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
"Variable Header" + Payload
Hinweis Nähere Informationen zu der Qualitätssicherung QoS finden Sie in Kapitel 3.1.3.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 50
3 Wissenswertes
Tabelle 3-7 zeigt den Aufbau des "Fixed Header" des "PUBREC"-Pakets.
Tabelle 3-7
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 5 (dez)
0 1 0 1 0 0 0 0
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
"Variable Header" = 2 Byte
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 51
3 Wissenswertes
Hinweis Die Reserve-Bits im "Fixed Header" müssen wie folgt gesetzt werden:
• Bit 3 = 0
• Bit 2 = 0
• Bit 1 = 1
• Bit 0 = 0
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 52
3 Wissenswertes
3.1.7 MQTT-Sub-Mechanismus
Sobald sich ein MQTT-Client mit dem MQTT-Broker verbunden hat, kann er
Abonnements erstellen oder abmelden.
"SUBSCRIBE"-Paket
Um ein Abonnement zu erstellen, nutzt der MQTT-Client das "SUBSCRIBE"-Paket.
Eine Liste der Topics, die der MQTT-Client abonnieren möchte, ist im "Payload"
untergebracht.
Tabelle 3-10 zeigt den Aufbau des "Fixed Header" des "SUBSCRIBE"-Pakets.
Tabelle 3-10
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 8 (dez)
1 0 0 0 0 0 1 0
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
"Variable Header" + "Payload"
© Siemens AG 2019 All rights reserved
Hinweis Die Reserve-Bits im "Fixed Header" müssen wie folgt gesetzt werden:
• Bit 3 = 0
• Bit 2 = 0
• Bit 1 = 1
• Bit 0 = 0
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 53
3 Wissenswertes
Return Code
Byte 1 • 0x00: Erfolgreich: Servicequalität maximal QoS 0
• 0x01: Erfolgreich: Servicequalität maximal QoS 1
• 0x02: Erfolgreich: Servicequalität maximal QoS 2
• 0x80: Fehler
"UNSUBSCRIBE"-Paket
Um ein Abonnement abzumelden, nutzt der MQTT-Client das "UNSUBSCRIBE"-
Paket. Eine Liste der Topics, die der MQTT-Client abmelden möchte, ist im
"Payload" untergebracht.
Tabelle 3-14 zeigt den Aufbau des "Fixed Header" des "UNSUBSCRIBE"-Pakets.
Tabelle 3-14
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 10 (dez)
1 0 1 0 0 0 1 0
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
"Variable Header" + "Payload"
Hinweis Die Reserve-Bits im "Fixed Header" müssen wie folgt gesetzt werden:
• Bit 3 = 0
• Bit 2 = 0
• Bit 1 = 1
• Bit 0 = 0
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 54
3 Wissenswertes
"UNSUBACK"-Paket
Der MQTT-Broker beantwortet das "UNSUBSCRIBE"-Paket mit dem
"UNSUBACK"-Paket.
Tabelle 3-16 zeigt den Aufbau des "Fixed Header" des "UNSUBACK"-Pakets.
Tabelle 3-16
Fixed Header
© Siemens AG 2019 All rights reserved
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 11 (dez)
1 0 1 1 0 0 0 0
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
"Variable Header" = 2 Byte.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 55
3 Wissenswertes
3.1.8 MQTT-Ping-Mechanismus
Wenn das KeepAlive-Intervall größer als "0" ist, ist die KeepAlive-Funktion aktiv.
Wenn die KeepAlive-Funktion aktiv ist, muss der MQTT-Client innerhalb des
KeepAlive-Intervalls mindestens eine Nachricht an den MQTT-Broker schicken. Ist
das nicht der Fall, muss der MQTT-Broker die Verbindung zum MQTT-Client
beenden. Um solch einen Zwangsabbruch zu verhindern, muss der MQTT-Client
vor Ablauf der KeepAlive-Zeit ein Ping-Request an den MQTT-Broker absetzen.
Dafür dient das Kontrollpaket "PINGREQ".
"PINGREQ"-Paket
Tabelle 3-17 zeigt den Aufbau des "Fixed Header" des "PINGREQ"-Pakets
Tabelle 3-17
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 12 (dez)
1 1 0 0 0 0 0 0
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
0 Byte.
© Siemens AG 2019 All rights reserved
"PINGRESP"-Paket
Der MQTT-Broker beantwortet das "PINGREQ"-Paket mit dem "PINGRESP"-Paket
und signalisiert dem MQTT-Client damit seine Verfügbarkeit.
Tabelle 3-18 zeigt den Aufbau des "Fixed Header" des "PINGRESP"-Pakets.
Tabelle 3-18
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 13 (dez)
1 1 0 1 0 0 0 0
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
0 Byte.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 56
3 Wissenswertes
3.1.9 MQTT-Verbindungsabbau
"DISCONNECT"-Paket
Tabelle 3-19 zeigt den Aufbau des "Fixed Header" des "DISCONNECT"-Pakets.
Tabelle 3-19
Fixed Header
Bit 7 6 5 4 3 2 1 0
Byte 1 Kennungsnummer für MQTT- Reserve
Kontrollpakettyp = 14 (dez)
1 1 1 0 0 0 0 0
Byte 2 Remaining Length: Die Anzahl der folgenden Bytes nach dem "Fixed Header" =
0 Byte.
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 57
3 Wissenswertes
Hinweis Ein MQTT-Verbindungsaufbau ist nur möglich, wenn die TCP-Verbindung zum
MQTT-Broker erfolgreich aufgebaut ist und anschließend gehalten wird.
Eine MQTT-Nachricht oder ein KeepAlive kann nur gesendet werden, wenn eine
TCP- und MQTT-Verbindung zum MQTT-Broker besteht.
© Siemens AG 2019 All rights reserved
Übersicht
Um die genannten Voraussetzungen zu erfüllen, wurden im Programm mehrere
Zustandsautomaten realisiert:
• Zustandsautomat "TCP state machine": Verwaltung der TCP-Verbindung
• Zustandsautomat "MQTT state machine": Verwaltung der MQTT-Verbindung
• Interner Zustandsautomat "MQTT job state machine": Abwicklung des
Sendevorgangs
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 58
3 Wissenswertes
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 59
3 Wissenswertes
Der Zustandsautomat "MQTT state machine" wird automatisch gestartet, wenn der
Zustandsautomat "TCP state machine" den Zustand "TCP_CONNECTED" erreicht.
Dieser Zustandsautomat hat folgende Funktionen:
• Er regelt das Handshake-Verfahren zum Aufbau der MQTT-Verbindung
• Er sorgt für den Verbindungsabbau
• Er verwaltet den internen Zustandsautomaten "MQTT job state machine", um
Nachrichten zu senden
• Er kümmert sich, dass vor Ablauf des KeepAlive-Intervalls ein PING-Paket
verschickt wird
Der Zustandsautomat "MQTT state machine" beinhaltet folgende Zustände
• MQTT_DISCONNECTED_STATE
• MQTT_CONNECT_FLAG_CHECK_STATE
• MQTT_CONNECT_STATE
• MQTT_CONNACK_STATE
• MQTT_CONNECTED
• MQTT_DISCONNECT
• MQTT_ERROR
Die Bedeutung der Zustände listet die folgende Tabelle:
© Siemens AG 2019 All rights reserved
Tabelle 3-21
Zustand Beschreibung
MQTT_DISCONNECTED_ Solange keine TCP-Verbindung besteht, ist der
STATE Zustandsautomat im Zustand
"MQTT_DISCONNECTED_STATE".
Erst wenn eine TCP-Verbindung aufgebaut ist, wird
automatisch die Weiterschaltbedingung auf den Zustand
"MQTT_CONNECT_FLAG_CHECK_STATE" aktiviert.
MQTT_CONNECT_ In diesem Zustand werden die Flags und Parameter für den
FLAG_CHECK_STATE MQTT-Verbindungsaufbau eingelesen und validiert. Wenn
es bei der Überprüfung zu Unstimmigkeiten kommt, wechselt
der Zustandsautomat in den Zustand "MQTT_ERROR" und
es wird eine entsprechende Fehlermeldung am
Ausgangsparameter "status" ausgegeben. Im fehlerfreien
Zustand wechselt der Zustandsautomat ohne
Weiterschaltbedingung in den Zustand
"MQTT_CONNECT_STATE".
MQTT_CONNECT_STATE In diesem Zustand wird die MQTT-Verbindung zum MQTT-
Broker aufgebaut. Dafür wird ein "CONNECT"-Paket mit den
eingelesenen Parametern zusammengebaut und
anschließend mit dem Baustein "TSEND" an den MQTT-
Broker geschickt.
Der Zustandsautomat wechselt in den Zustand
"MQTT_CONNACK_STATE".
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 60
3 Wissenswertes
Zustand Beschreibung
MQTT_CONNACK_ Wenn beim Senden des "CONNECT"-Pakets ein Fehler
STATE auftrat, wechselt der Zustandsautomat in den Zustand
"MQTT_ERROR_STATE".
Wenn das "CONNECT"-Paket erfolgreich versendet wurde,
wird der Zustand erst verlassen, wenn am Baustein "TRCV"
eine Nachricht empfangen wird.
Der MQTT-Client erwartet ein "CONACK"-Paket" vom
MQTT-Broker als Quittierung auf das "CONNECT"-Paket. Es
wird überprüft, ob es sich bei der empfangen Quittierung um
ein "CONACK"-Paket handelt.
Wenn der MQTT-Broker den Erhalt der Nachricht bestätigt
hat, wechselt der Zustandsautomat in den Zustand
"MQTT_CONNECTED_STATE" und der Zustandsautomat
"MQTT job state machine" wechselt in den Zustand "IDLE".
Die Ausgangsvariable "mqttEstablished" wird gesetzt. Das
KeepAlive-Intervall wird bei Bedarf gestartet.
Wenn der Baustein "TRCV" einen Fehler erkennt oder das
empfangene MQTT-Kontrollpaket kein "CONNACK"-Paket
ist, wechselt der Zustandsautomat in den Zustand
"MQTT_ERROR_STATE".
MQTT_CONNECTED_ In diesem Zustand verweilt der Funktionsbaustein solange,
STATE bis die MQTT-Verbindung oder TCP-Verbindung abgebaut
wird. In dem Zustand "MQTT_CONNECTED" wird geprüft,
ob ein Sendeauftrag für eines der folgenden MQTT-
Kontrollpakete vorliegt:
© Siemens AG 2019 All rights reserved
• PUBLISH
• SUBSCRIBE
• UNSUBSCRIBE
Wenn das KeepAlive-Intervall bald endet, muss das MQTT-
Kontrollpaket "PINGREQ" gesendet werden.
Je nach Ausgang der Prüfung wird der interne
Zustandsautomat "MQTT job state machine" in den
entsprechenden Zustand versetzt, um die gewünschte
Routine auszuführen.
MQTT_DISCONNECT_ Wenn der Eingangsparameter "enable" zurückgesetzt wird,
STATE wird die MQTT-Verbindung abgebaut. Dafür wird ein
"DISCONNECT"-Paket zusammengebaut und anschließend
mit dem Baustein "TSEND" an den MQTT-Broker geschickt.
Wenn beim Senden des "DISCONNECT"-Pakets ein Fehler
auftritt, wechselt der Zustandsautomat in den Zustand
"MQTT_ERROR_STATE".
Wenn das "DISCONNECT"-Paket erfolgreich versendet
wurde, wechselt der Zustandsautomat in den Zustand
"MQTT_DISCONNECTED". Zeitgleich wird der
Zustandsautomat "TCP state machine" in den Zustand
"TCP_DISCONNECT" versetzt. Damit wird auch die
TCP-Verbindung beendet.
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 61
3 Wissenswertes
Zustand Beschreibung
MQTT_ERROR_STATE Wenn ein Fehler im Zustandsautomaten "MQTT state
machine" eintritt, ist der Zustand "MQTT_ERROR" die
zentrale Anlaufstelle. Hier werden die erforderlichen
Parameter (statische Variablen und Ausgangsvariablen)
gesetzt bzw. zurückgesetzt. Zudem werden folgende
Aktionen ausgeführt:
• Die Fehlermeldung des beteiligten MQTT-Befehls wird
am Ausgang "status" übergeben.
• Am Ausgang "statusID" wird die Nummer des Zustands
ausgegeben, in dem der Fehler aufgetreten ist.
• Der Zustandsautomat kehrt zurück in den Zustand
"MQTT_DISCONNECTED_STATE".
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 62
3 Wissenswertes
Der Zustandsautomat "MQTT job state machine" wird nur durchlaufen, wenn sich
der Zustandsautomat "MQTT state machine" im Zustand "MQTT_CONNECTED"
befindet. Denn hier wird entschieden, von welcher Stelle aus der Zustandsautomat
"MQTT job state machine" gestartet wird. Wenn ein Sendeanstoß für eine MQTT-
Nachricht vorliegt, dann wird die Senderoutine aktiv. Wenn die KeepAlive-Zeit in
Kürze endet, wird die PING-Routine gestartet.
Der Zustandsautomat "MQTT job state machine" beinhaltet folgende Zustände:
• IDLE
• MQTT_PUBLISH_STATE
• MQTT_PUBLISH_EVAL_STATE
• MQTT_PUBACK_STATE
• MQTT_PUBREC_ACK_STATE
• MQTT_PUBREC_SEND_STATE
• MQTT_PUBCOMP_STATE
• MQTT_SUBSCRIBE_STATE
• MQTT_SUBACK_STATE
• MQTT_UNSUBSCRIBE_STATE
•
© Siemens AG 2019 All rights reserved
MQTT_UNSUBACK_STATE
• MQTT_PING
• MQTT_PINGRESP
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 63
3 Wissenswertes
Tabelle 3-22
Zustand Beschreibung
IDLE Solange kein Sendeanstoß vorliegt oder das
KeepAlive-Intervall nicht abläuft, ist der Zustand
immer "IDLE".
MQTT_PUBLISH_STATE Wenn im Zustand "MQTT_CONNECTED_STATE"
am Eingangsparameter "publishMessage" eine
positive Flanke erkannt und kein anderer
Sendeauftrag (SUBSCRIBE oder UNSUBSCRIBE)
angestoßen wird, wird der interne Zustandsautomat
"MQTT job state machine" in den Zustand
"MQTT_PUBLISH_STATE" versetzt.
Im Zustand "MQTT_PUBLISH_STATE" startet die
Senderoutine. Zuerst wird das "PUBLISH"-Paket
mit den vorgegebenen Parametern, dem Topic und
dem Nachrichtentext zusammengebaut und
anschließend mit dem Baustein "TSEND" an den
MQTT-Broker geschickt.
In Abhängigkeit von der Qualitätssicherung QoS
wechselt der Zustandsautomat in einen anderen
Zustand:
• Bei QoS gleich "0" wechselt der
Zustandsautomat in den Zustand
"MQTT_PUBLISH_EVAL_STATE", um den
Sendeauftrag zu beenden.
• Bei QoS gleich "1" wechselt der
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 64
3 Wissenswertes
Zustand Beschreibung
MQTT_PUBACK_STATE Wenn beim Senden des "PUBLISH"-Pakets ein
Fehler auftrat, wechselt der Zustandsautomat
zurück in den Zustand "IDLE" und der
Zustandsautomat "MQTT state machine" wechselt
in den Zustand "MQTT_ERROR_STATE".
Wenn das "PUBLISH"-Paket erfolgreich versendet
wurde, wird der Zustand erst verlassen, wenn am
Baustein "TRCV" eine Nachricht empfangen wird.
Da die Qualitätssicherung QoS gleich "1" ist,
erwartet der MQTT-Client ein "PUBACK"-Paket
vom MQTT-Broker als Quittierung auf das
"PUBLISH"-Paket. Es wird überprüft, ob es sich bei
der empfangen Quittierung um ein "PUBACK"-
Paket handelt.
Wenn der MQTT-Broker den Erhalt der Nachricht
bestätigt hat, wechselt der Zustandsautomat zurück
in den Zustand "IDLE".
Wenn der Baustein "TRCV" einen Fehler erkennt
oder das empfangene MQTT-Kontrollpaket kein
"PUBACK"-Paket ist, wechselt der
Zustandsautomat zurück in den Zustand "IDLE"
und der Zustandsautomat "MQTT state machine"
wechselt in den Zustand "MQTT_ERROR_STATE".
MQTT_PUBREC_ACK_STATE Wenn beim Senden des "PUBLISH"-Pakets ein
Fehler auftrat, wechselt der Zustandsautomat
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 65
3 Wissenswertes
Zustand Beschreibung
MQTT_PUBCOMP_STATE Dieser Zustand ist der letzte Teil des zweifachen
Handshake-Verfahrens bei QoS gleich "2".
Wenn beim Senden des "PUBREL"-Pakets ein
Fehler auftrat, wechselt der Zustandsautomat
zurück in den Zustand "IDLE" und der
Zustandsautomat "MQTT state machine" wechselt
in den Zustand "MQTT_ERROR_STATE".
Wenn das "PUBREL"-Paket erfolgreich versendet
wurde, wird der Zustand erst verlassen, wenn am
Baustein "TRCV" eine Nachricht empfangen wird.
Der MQTT-Client erwartet ein "PUBCOMP"-Paket"
vom MQTT-Broker als Quittierung auf das
"PUBREL"-Paket. Es wird überprüft, ob es sich bei
der empfangen Quittierung um ein "PUBCOMP"-
Paket handelt.
Wenn der MQTT-Broker den Erhalt der Nachricht
bestätigt hat, wechselt der Zustandsautomat zurück
in den Zustand "IDLE". Das zweifache Handshake-
Verfahren ist damit abgeschlossen.
Wenn der Baustein "TRCV" einen Fehler erkennt
oder das empfangene MQTT-Kontrollpaket kein
"PUBCOMP"-Paket ist, wechselt der
Zustandsautomat zurück in den Zustand "IDLE"
und der Zustandsautomat "MQTT state machine"
wechselt in den Zustand "MQTT_ERROR_STATE".
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 66
3 Wissenswertes
Zustand Beschreibung
MQTT_SUBACK_STATE Wenn beim Senden des "SUBSCRIBE"-Pakets ein
Fehler auftrat, wechselt der Zustandsautomat
zurück in den Zustand "IDLE" und der
Zustandsautomat "MQTT state machine" wechselt
in den Zustand "MQTT_ERROR_STATE".
Wenn das "SUBSCRIBE"-Paket erfolgreich
versendet wurde, wird der Zustand erst verlassen,
wenn am Baustein "TRCV" eine Nachricht
empfangen wird.
Der MQTT-Client erwartet ein "SUBACK"-Paket"
vom MQTT-Broker als Quittierung auf das
"SUBSCRIBE"-Paket. Es wird überprüft, ob es sich
bei der empfangen Quittierung um ein "SUBACK"-
Paket handelt.
Wenn der MQTT-Broker den Erhalt der Nachricht
bestätigt hat, wechselt der Zustandsautomat zurück
in den Zustand "IDLE".
Wenn der Baustein "TRCV" einen Fehler erkennt
oder das empfangene MQTT-Kontrollpaket kein
"SUBACK"-Paket ist, wechselt der
Zustandsautomat zurück in den Zustand "IDLE"
und der Zustandsautomat "MQTT state machine"
wechselt in den Zustand "MQTT_ERROR_STATE".
MQTT_UNSUBSCRIBE_STATE Wenn im Zustand "MQTT_CONNECTED_STATE"
am Eingangsparameter "unsubscribeFromTopic"
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 67
3 Wissenswertes
Zustand Beschreibung
MQTT_UNSUBACK_STATE Wenn beim Senden des "UNSUBSCRIBE"-Pakets
ein Fehler auftrat, wechselt der Zustandsautomat
zurück in den Zustand "IDLE" und der
Zustandsautomat "MQTT state machine" wechselt
in den Zustand "MQTT_ERROR_STATE".
Wenn das "UNSUBSCRIBE"-Paket erfolgreich
versendet wurde, wird der Zustand erst verlassen,
wenn am Baustein "TRCV" eine Nachricht
empfangen wird.
Der MQTT-Client erwartet ein "UNSUBACK"-Paket"
vom MQTT-Broker als Quittierung auf das
"UNSUBSCRIBE"-Paket. Es wird überprüft, ob es
sich bei der empfangen Quittierung um ein
"UNSUBACK"-Paket handelt.
Wenn der MQTT-Broker den Erhalt der Nachricht
bestätigt hat, wechselt der Zustandsautomat zurück
in den Zustand "IDLE".
Wenn der Baustein "TRCV" einen Fehler erkennt
oder das empfangene MQTT-Kontrollpaket kein
"UNSUBACK"-Paket ist, wechselt der
Zustandsautomat zurück in den Zustand "IDLE"
und der Zustandsautomat "MQTT state machine"
wechselt in den Zustand "MQTT_ERROR_STATE".
MQTT_PING Wenn im Zustand "MQTT_CONNECTED"
festgestellt wird, dass das KeepAlive-Intervall
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 68
3 Wissenswertes
3.2.5 Funktionsdiagramm
Folgende Abbildung zeigt das Diagramm der Funktionsweise mit den drei
Zustandsautomaten.
Abbildung 3-2
enable
enable=0 enable no
enable TCP_ MQTT_
1 -> 0
0 -> 1 CONNECTED DISCONNECTED
yes
TCP_
© Siemens AG 2019 All rights reserved
MQTT_CONNECTED
Keep alive or
Keep Aliver Timer publish or
subscribe or
unsubsribe
IDLE
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 69
4 Anhang
4 Anhang
4.1 Service und Support
Industry Online Support
Sie haben Fragen oder brauchen Unterstützung?
Über den Industry Online Support greifen Sie rund um die Uhr auf das gesamte
Service und Support Know-how sowie auf unsere Dienstleistungen zu.
Der Industry Online Support ist die zentrale Adresse für Informationen zu unseren
Produkten, Lösungen und Services.
Produktinformationen, Handbücher, Downloads, FAQs und Anwendungsbeispiele
– alle Informationen sind mit wenigen Mausklicks erreichbar:
https://support.industry.siemens.com/
Technical Support
Der Technical Support von Siemens Industry unterstützt Sie schnell und kompetent
bei allen technischen Anfragen mit einer Vielzahl maßgeschneiderter Angebote
– von der Basisunterstützung bis hin zu individuellen Supportverträgen.
Anfragen an den Technical Support stellen Sie per Web-Formular:
https://www.siemens.de/industry/supportrequest
© Siemens AG 2019 All rights reserved
Serviceangebot
Unser Serviceangebot umfasst folgendes:
• Plant Data Services
• Ersatzteilservices
• Reparaturservices
• Vor-Ort und Instandhaltungsservices
• Retrofit- und Modernisierungsservices
• Serviceprogramme und Verträge
Ausführliche Informationen zu unserem Serviceangebot finden Sie im
Servicekatalog:
https://support.industry.siemens.com/cs/sc
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 70
4 Anhang
4.3 Änderungsdokumentation
Tabelle 4-2
Version Datum Änderung
V1.0 07/2017 Erste Ausgabe
V1.1 08/2018 Bibliothek "LMqttQdn" eingefügt.
V2.0 08/2019 Subscribe-Mechanismus ergänzt
© Siemens AG 2019 All rights reserved
LMQTT_Client
Beitrags-ID: 109748872, V2.1, 12/2019 71