Azure Modus


 

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