Der MQTT-Treiber unterstützt einen Modus, mit welchem Datenpunkte über MQTT an den Azure IoT Hub übertragen werden können.
Zuweisung von Nachrichten zu Datenpunkten
Zur Zuweisung von Datenpunkten und Nachrichten können entweder, wie beim MQTT-Treiber, Templates genutzt werden, oder aber Nachrichten-Properties. Jede Nachricht, die vom Gateway an den Azure IoT-Hub gesendet wird, enthält ein Adress-Property, dessen Wert die Adresse des Datenpunkts enspricht. Entsprechend muss auch jede Nachricht, die vom Azure IoT Hub an das Gateway geschickt wird, dieses Property nutzen. Per Default ist der Key des Adress-Properties “adr”.
Konfiguration
Folgende Einstellungen in den entsprechenden Abschnitten müssen gesetzt sein.
User
Konfiguration
Beschreibung
AzureMode
Hiermit wird der “Azure-Modus” aktiviert. Der Wert muss also auf 1 stehen.
Host
Der Host muss auf den Hostname des IoT-Hubs gesetzt werden, zum Beispiel “XYZ.azure-devices.net”
Port
Der Port muss auf 8883 gesetzt sein.
ClientID
Für das Gateway muss im IoT Hub ein Device angelegt werden. Die ClientID muss auf diese Device ID gesetzt werden.
User
Der Username ist beim IoT-Hub anhand der Device-ID und des Hostnamens festgelegt und wird vom Treiber automatisch erstellt. Der User kann also nicht manuell gesetzt werden und sollte frei gelassen werden.
Passwort
Das Passwort ist ein SaS-Token. In zukünftigen Versionen kann alternativ der primäre Key angegeben werden.
AzureAdrProperty
Beim Versenden und Empfangen von Datenpunkten wird der Nachricht ein Property hinzugefügt, dessen Value die Adresse des Datenpunkts ist. Der Property-Key kann hiermit konfiguriert werden.
Encryption
Die Verschlüsselung darf nicht aus und derzeit nicht auf TLSv1_3 gesetzt werden, da der IoT Hub nur TLS 1.2 unterstützt.
TLS
Konfiguration
Beschreibung
UseSystemCACerts
Diese Einstellung sollte aktiviert sein. Die Root-Zertifikate für die Verschlüsselung sind auf den Gateway bereits vorinstalliert.
Internal
Konfiguration
Beschreibung
MaxPublishSize
Wenn diese Konfiguration nicht gesetzt wird, wird im Azure-Modus automatisch ein Default von 256.000 gewählt, was derzeit die Limitierung der Nachrichtengröße des Azure IoT Hubs ist. Wenn die Nachrichtengröße überschritten wird, wird die Nachricht in mehrere kleinere Nachrichten aufgeteilt.
ResultTopic
Anders als im “MQTT-Modus”, wird hiermit ein Property definiert, welches für Result-Nachrichten benutzt wird.
SysPreTopic
Anders als im “MQTT-Modus”, wird hiermit ein Property definiert, welches für System-Nachrichten benutzt wird.
Datenpunkte
Alle MQTT-Datenpunkte und alle Optionen werden auch im Azure-Modus unterstützt. Anstatt dass die Datenpunkt-Adresse einen Topic entspricht, entspricht die Adresse jedoch den Wert eines “Adressen”-Propertys, welcher bei Device-to-Cloud-Nachrichten vom Gateway gesetzt wird und entsprechend bei Cloud-to-Device-Nachrichten gesetzt sein muss.
Weitere Properties
Beim Versenden können weitere Properties angegeben werden. Die Properties können im format-String über ‘properties:““’ gesetzt werden. Die Properties haben das Format”key[=value]“. Es können mehrere Properties genutzt werden, indem die Properties mit’&’ getrennt werden.
Beispiele
Mit den Datenpunkt
[S publish freemem]
name = UGW free memory
format = properties:"system&unit=kb"
query = pe
könnte der freie Speicher des Gateways an den Azure IoT Hub gesendet werden. Die Nachricht wird immer mit den Property “adr=freemem” verschickt und es werden zusätzlich die Properties “system” und “unit=kb” genutzt.
Mit den Datenpunkt
[Y subscribe speed]
name = Speed for device
query = pe
können Cloud to Device Nachrichten empfangen werden, die das Property “adr=speed” gesetzt haben.
System-Kommandos
Alle Systemkommandos, die der MQTT-Treiber unterstützt, werden auch im Azure-Modus unterstützt. Auch hier werden die Topics jedoch in Nachrichten- Properties umgewandelt.
Im Folgenden sind die Key-Value-Paare für die Sys-Kommandos aufgelistet. Kursive Values müssen entsprechend eingesetzt werden. Bei eingeklammerte Values muss sich für eines der Values, die durch “|” getrennt sind, entschieden werden.
Herunterladen/Hochladen von Konfigurationsdateien
cmd=(get|set)
type=file
file=(config|dispatch|datapoints)
route=route
Datenpunkte konfigurieren
cmd=set
type=datapoints
Neustart des Gateways
cmd=gateway
action=restart
BACnet-Scan
cmd=scan
driver=bacnet
Empfangen und Senden großer Nachrichten
Größere Nachrichten, wie zum Beispiel Scan-Ergebnisse, werden vom Treiber automatisch in mehrere Nachrichten, so genannte “Chunks” aufgeteilt, wenn die Nachricht zu groß wird.
Jede Nachricht, die in Chunks aufgeteilt wird, hat eine eindeutige ID. Jeder Chunk enthält diese ID und zusätzlich die Anzahl der Chunks, aus den die Nachricht besteht und den aktuellen Chunk Index.
Die Nachrichten IDs, die das Gateway erstellt, besteht aus 34 Hexzahlen, die jeweils aus 2 Zeichen bestehen. Ingesamt ist die ID also 68 Zeichen lang. Die letzten 32 Hex-Zahlen der ID sind ein SHA-3 256 Hash des Payloads der Nachricht. Dieser Hash kann dazu genutzt werden, um zu überprüfen, ob die Nachricht richtig empfangen und zusammen gebaut wurde. Die ersten 2 Hex-Zeichen sind zur Unterscheidung von gleichen Payloads vorhanden. Es handelt sich dabei aktuell um einen 4-Byte großen Counter, der für jede Nachricht hochgezählt wird. Die IDs von eingehenden Nachrichten können beliebig gewählt werden. Das Gateway nutzt die ID ausschließlich zur Identifizierung der Chunks und verarbeitet die ID nicht weiter.
Der Chunk Index startet bei 0.
Es kann in der Treiber-Konfiguration unter INTERNAL ein Timeout in Sekunden für das Empfangen von Chunks mit ChunkTimeout konfiguriert werden. Dieser Timeout wird bei jedem empfangenen Chunk zurückgesetzt. Wenn der Timeout erreicht ist, wird die entsprechende Nachricht verworfen.
Wenn ein Chunk nicht verarbeitet werden kann, erfolgt kein Feedback über mqtt aber es wird eine Fehlermeldung in den Log geschrieben.
Die maximale Nachrichtengröße wird automatisch auf 256.000 Bytes gesetzt, kann aber überschrieben werden.
Im Azure-Modus wird die ID, der Index und die Anzahl an chunks in das Property-Bag geschrieben. Alle Zahlen werden als Hexzahlen dargestellt. Der Property-Name des Chunk-Indexs ist ‘chunk_index’, der Chunk-Anzahl ist ‘chunk_count’ und der Name der ID ist ‘msg_id’.
Ein Beispiel-Property-Bag einer ausgehenden Nachricht des Gateways für den ersten Chunk wäre:
Property
Value
msg_id
0000b8dd26dead0991eba8dceefaeb828f42473f35c089d31857c99cefc7f1e6f4aa
chunk_count
003
chunk_index
000