Broker
Der MQTT Broker wird genutzt, um die ADS-Kommandos zwischen den Routern zu vermitteln. Die verwendete Topic-Struktur ist unter Architektur beschrieben.
Allgemeines
Für ADS-over-MQTT kann ein beliebiger MQTT-Broker mit passender Unterstützung von beispielsweise RETAIN und QoS genutzt werden.
Ist dieser Broker im Sinne von Security schützenswert, da die ADS-Nachrichten schützenswert sind, müssen entsprechende Maßnahmen ergriffen werden. Die Security-Konfiguration auf Seiten von TwinCAT und beispielhaft auch für den Eclipse Mosquitto-Broker ist unter Security beschrieben.
Tc-Plugin TcMqttPlugin.dll für den Eclipse Mosquitto Broker
Um in dem MQTT-Broker ein virtuelles Netzwerk von ADS-Geräten zu definieren, existiert eine Erweiterung für den Eclipse Mosquitto Broker. Mittels dieser Erweiterung können sowohl Zugriffsrechte per PreSharedKey auf den Broker, wie auch Zugriffe zwischen den TwinCAT Routern mittels einer ACL (AccessControlList) eingestellt werden.
Das Plugin wird mit der TwinCAT-Installation ausgeliefert und befindet sich im Ordner C:\TwinCAT\AdsApi\TcMqttPlugin bzw. C:\TwinCAT\AdsApi\x64\TcMqttPlugin, falls ein 64-bit Mosquitto Broker eingesetzt wird.
In der Mosquitto-Konfiguration wird das Plugin wie folgt eingebunden:
auth_plugin <Path>TcMqttPlugin.dll
auth_opt_xml_file <Path>ACL.xml
Die Mosquitto-Konfigurationsdatei wird beim Starten des Mosquitto Brokers mittels des Parameters „-c“ angegeben, womit das Plugin inkl. der Konfiguration dann geladen wird.
Die Datei ACL.xml wird dabei in den folgenden Abschnitten beschrieben und stellt auf der einen Seite die Zugriffskonfiguration per PreSharedKey auf den Broker selbst bereit, wie aber auch die Konfiguration der Kommunikation zwischen den verbundenen TwinCAT Routern.
Konfiguration „Virtuelles AmsNetzwerk“
Das Plugin TcMqttPlugin bietet die Möglichkeit virtuelle AmsNetzwerke zu konfigurieren. Hierzu wird zu jedem Zielgerät angegeben, welches Gerät Zugriff auf welches andere Gerät hat.
Im Gegensatz zu den klassischen ADS-Routen sind diese Verbindungen gerichtet: Ein Ziel hat also nicht gleichzeitig das Recht auf die Quelle zuzugreifen.
<TcMqttAclConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\TwinCAT\3.1\Config\Modules\TcMqttAclConfig.xsd" AnonymousLogin="true">
<!-- PSK Elements, if used -->
<Ams>
<Topic>VirtualAmsNetwork1</Topic>
<User>
<Name>EngineeringStation</Name>
</User>
<User>
<Name>CX-123456</Name>
<Access>EngineeringStation</Access>
</User>
<User>
<Name>CX-567890</Name>
<Access>EngineeringStation</Access>
</User>
</Ams>
</TcMqttAclConfig>
Innerhalb eines <Ams>-Knotens wird der Name des AmsNetzwerks definiert. Er wird in den genutzten MQTT Topics zur Identifizierung der Netzwerke verwendet.
Einzelne <User> Elemente beschreiben die Teilnehmer. Diese Elemente besitzen ein <Name>-Element, welches die MQTT-Identity beschreibt, mit der die Verbindung aufgebaut wurde – im Normalfall der Name des Teilnehmers. Zusätzlich werden zugriffberechtigte Geräte über das <Access>-Element definiert.
In dem Beispiel hat „EngieeringStation“ also Zugriff auf zwei CX-Geräte, die CX-Geräte jedoch nicht auf die „EngieeringStation“ und auch nicht untereinander.
Die Datei wird zyklisch neu geladen, sodass ein Neustart des Brokers nicht nötig ist.
Da in dieser Erklärung keine Verschlüsselung vorgesehen ist, wird AnonymousLogin=“true“
verwendet.
Einschränkungen bzgl. der anzumeldenden AmsNetId
Bei dieser Konfiguration kann jedes gültig verbundene Gerät eine beliebige AmsNetID und damit Identität aus Sicht von ADS annehmen. Dieses kann eingeschränkt werden:
<User>
<Name>CX-567890</Name>
<Access>EngineeringStation</Access>
<NetId>192.168.56.1.1.1</NetId>
</User>
Sobald mindestens eine NetId angegeben ist, kann nur eine NetId aus dieser Liste angemeldet werden.
Mosquitto Einstellungen
Im Zusammenhang mit der Konfiguration mittels TcMqttPlugin sind einige Einstellungen auf Seiten des Mosquitto Brokers wichtig zu beachten. Hierzu gehören:
psk_hint
Bezeichnet den psk_hint für den Verbindungsaufbau. Wird aktuell auf TwinCAT-Seite nicht überprüft.port <1883|8883>
Der Port bezeichnet den Netzwerk-Port, den der Broker bereitstellt. Typischerweise ist 1883 unverschlüsselt und 8883 verschlüsselt.require_certificate <true|false>
Bezeichnet die Notwendigkeit von Zertifikaten.use_identity_as_username true
Bezeichnet, ob die Identity von Zertifikaten als Username auf Ebene von MQTT benutzt wird. Zur Nutzung des TcMqttPlugin wird dieses benutzt, sodass es alstrue
anzulegen ist.
Minimal-Konfigurationsbeispiele sind in Abhängigkeiten von der genutzten TLS Verbindung in den entsprechenden Abschnitten beschrieben.