Lösung: MQTT-Client
Installation des MQTT-Clients
Der benötigte Baustein "LMQTT_Client" und die entsprechenden Datentypen sind nicht Bestandteil der Basisinstallation des TIA-Portals. Hierfür muss die Bibliothek "LMQTT" installiert werden.
Ein Link zum Herunterladen befindet sich hier: https://support.industry.siemens.com/cs/ww/de/view/109780503 (Der Download ist registrierungspflichtig, daher wird die gezippte Datei den Schülern und Studierenden der Werner-von-Siemens-Schule in Frankfurt am Main von mir zur Verfügung gestellt.)
Nach dem Auspacken in einem beliebigen Verzeichnis, wird die globale Bibliothek "LMQTT" geöffnet:

Öffnen der globalen Bibliothek
Im entpackten Verzeichnis wird zur "application library" navigiert und geöffnet:

Öffnen der "application library"
Der Funktionsbaustein wird per Drag & Drop in den Ordner
"Programmbausteine" der entsprechenden CPU eingefügt:

Einfügen des Funktionsbausteins LMQTT-Client in den Ordner "Programmbausteine"
Die vom FB "LMQTT_Client" verwendeten Datentypen werden automatisch in den Ordner "PLC-Datentypen" eingefügt:

Automatisch eingefügte Datentypen des MQTT-Clients
MQTT-Client konfigurieren
Zum Parametrisieren des MQTT-Clients wird ein globaler Datenbaustein benötigt:

Globalen Datenbaustein erstellen
Dem Datenbaustein werden nun Variablen hinzugefügt:

Dem Datenbaustein werden Variablen hinzugefügt.
Folgende Tabelle enthält die Variablen des DB "MqttDb", um im nächsten Schritt die Ein- und
Ausgänge des FB "MQTT_Client" zu verschalten:
| Static | ||
| control | Struct | |
| enable | Bool | true |
| publish | Bool | false |
| subscribe | Bool | true |
| unsubscribe | Bool | false |
| output | Struct | |
| valid | Bool | false |
| done | Bool | false |
| busy | Bool | false |
| error | Bool | false |
| status | Word | 16#0 |
| diagnostics | "typeDiagnostics" | |
| connParameter | "LMQTT_typeConnParam" | |
| hwId | HW_ANY | 0 |
| connId | CONN_OUC | 16#0001 |
| broker | String | '172.17.10.253' |
| port | UInt | 1884 |
| tls | Struct | |
| enableTls | Bool | false |
| validateServerIdentity | Bool | false |
| brokerCert | UDInt | 0 |
| clientCert | UDInt | 0 |
| keepAlive | UInt | 0 |
| clientIdentifier | WString[20] | WSTRING#'plc_19' |
| username | WString[20] | WSTRING#'mqttUser' |
| password | WString[20] | WSTRING#'Password' |
| willTopic | WString[20] | WSTRING#'' |
| willMsgPayload | Array[0..99] of Byte | |
| willMsgLen | UInt | 0 |
| qos | USInt | 0 |
| mqttTopic | WString[100] | WSTRING#'temp/temp0' |
| publishMsgPayload | Array[0..999] of Byte | |
| publishMsgLen | UDInt | 0 |
| retain | Bool | false |
| receivedTopic | WString[200] | WSTRING#'' |
| receivedMsgPayload | Array[0..999] of Byte | |
| receivedMsgDataLen | UDInt | 0 |
| receivedMsgStatus | USInt | 0 |
Der Funktionsbaustein des MQTT-Clients wird im Anwenderprogramm aufgerufen, indem der Organisationsbaustein "Main" angewählt wird und von dort aus der FB "LMQTT_Client" per Drag & Drop in ein Netzwerk gezogen wird:

Funktionsbaustein "LMQTT_Client" im Hauptprogramm aufrufen
Daraufhin öffnet sich der Dialog "Aufrufoptionen" zur Generierung des Instanz-DB des FB "LMQTT_Client":

Der Dialog "Aufrufoptionen" ("Call options") zur Generierung des Instanz-DB des FB "LMQTT_Client"
Die Ein- und Ausgänge dieses Funktionsbausteins werden nun mit den Variablen, des globalen Datenbausteins "MqttDB" belegt:

Verschaltung der Variablen des DB "MqttDb" am
FB "MQTT_Client"
Überprüfen des Verbindungsaufbaus und des Datenempfangs
Nach dem Laden des Anwenderprogramms und starten der CPU, kann mit den Beobachtungswerten überprüft werden, ob Daten empfangen werden können. Hier wird ein Fehler angezeigt:

Fehlersuche mit Hilfe der Beobachtungswerte
Der subfunctionStatus 80C5 wird im Dokument https://support.industry.siemens.com/cs/mdm/109815056?c=146683338379&lc=en-WW erläutert: The connection partner refuses to establish the connection, has terminated the connection or actively ended it.
Der Grund hierfür liegt in der Konfiguration des Ports. Wie aus der Aufgabenstellung ersichtlich, muss es Port 1884 heißen.
Wenn alle Fehler beseitigt sind, können die Beobachtungswerte z.B. wie folgt interpretiert werden:

Interpretieren der empfangenen Daten
Die hexadezimalen ASCII-Werte 32 33 2E 33 38 entsprechen der Zeichenkette 23.38 (der gemessenen Temperatur in °Celsius).
Konvertierung der Zeichenfolge in ein Zahlenformat und Vergleich mit einer Stellgröße
Um die Temperaturdaten mit einer Stellgröße vergleichen zu können, sollte die ASCII-Zeichenfolge in ein Zahlenformat umgewandelt werden.
- Umwandlung der Folge einzelner ASCII-Zeichen in einen String
- Umwandlung des Strings in ein Zahl im REAL-Format
- Vergleich der Zahl mit einem konstanten Wert
Hierfür wird zunächst ein Datenbaustein benötigt:

Datenbaustein um String in das Realformat umzuwandeln
Danach werden die benötigten Anweisungen per Drag & Drop in ein freies Netzwerk der Motorsteuerung gezogen und entsprechend konfiguriert:

Konvertierung und Vergleich der Daten
CMP
(Bemerkenswert ist, dass Siemens den Pointer auf den zu konvertierenden String auf 1 und nicht - wie üblich - auf 0 gesetzt haben will, um das erste Zeichen zu adressieren.)
Der Motorschütz wird angesteuert, wenn 25°C überschritten werden. Ein Lüfter startet.
Die Schaltung kann leicht erweitert werden, wenn die Temperatur absinkt und einen bestimmten Wert unterschreitet (Zweipunkt-Regelung).
Absicherung der MQTT-Verbindung per TLS
Im Folgenden wird die MQTT-Verbindung per TLS abgesichert. Dabei authentifiziert die SPS, also der MQTT-Client den MQTT-Broker.
Der MQTT-Broker verwendet hier ein selbst-signiertes Zertifikat, das beim Verbindungsaufbau vom Broker zur SPS als MQTT-Client gesendet wird und mit dem dort hinterlegten Zertifikat verglichen wird und übereinstimmen muss.
Import des Zertifikats in den globalen Zertifikatsmanager
Daher muss das Zertifikat des MQTT-Brokers importiert werden und auf der SPS konfiguriert werden (hierfür muss das TIA-Portal-Projekt - wie unter OPC UA bereits beschrieben - mit Benutzername und Kennwort geschützt worden sein):

Import des Zertifikats in den globalen Zertifikatsmanager
Der Gültigkeitszeitraum des Zertifikats kann mit Rechter-Maus-Klick => anzeigen überprüft werden. Die Uhrzeit der SPS muss natürlich innerhalb dieses Zeitraums liegen:

Überprüfung des Gültigkeitszeitraums
Uhrzeit aktualisieren
Konfigurieren des lokalen Zertifikatmanagers
Das Zertifikat muss in die CPU geladen werden. Dafür muss es auch dem lokalen Zertifikatsmanager als Partnergerätezertifikat zugeordnet werden:

Konfigurieren des lokalen Zertifikatmanagers

Auswahl des MQTT-Broker-Zertifikats
