Datenformate

MQTT erlaubt den Transport von Binärdaten, wobei der eigentliche Aufbau des Nachrichteninhalts nicht durch die Spezifikation festgeschrieben wird. Es können somit beliebige Daten transportiert werden, z.B. zyklische oder event-basierte Telemetriedaten oder auch Kommandos an die Steuerung. Da das Datenformat nicht spezifiziert ist, muss das Format dem Sender und Empfänger bekannt sein.

Über die Jahre sind hierbei eine Vielzahl an Datenformaten und entsprechenden -beschreibungssprachen entstanden. In vielen IoT-Anwendungen haben sich JSON und XML als Beschreibungssprachen etabliert. Der Aufbau eines entsprechenden JSON- oder XML-Dokuments ist jedoch weiterhin applikationsspezifisch und muss den Anwendungen bekannt sein, damit diese Daten miteinander austauschen können.

JSON

Bei JSON (JavaScript Objection Notation) handelt es sich um eine schlanke Beschreibungssprache in einer einfach lesbaren Textform, in der Daten über Property/Value-Paare in sogenannten Objekten organisiert werden. JSON hat sich auf Grund der einfachen Lesbarkeit und des (im Vergleich mit anderen Beschreibungssprachen wie z.B. XML) immer noch geringen Overheads in den meisten IoT-Anwendungen etabliert. Das folgende Beispiel zeigt ein JSON-Dokument, welches Telemetriewerte von drei Sensoren inklusive Metadaten und Zeitstempel beinhaltet.

{
  "Timestamp": "2017-04-04T12:42:42",
  "Values": {
    "Sensor1": 42.41999816894531,
    "Sensor2": 230,
    "Sensor3": 3
  },
  "MetaData": {
    "Sensor1": {
      "Unit": "m/s",
      "DisplayName": "Speed"
    },
    "Sensor2": {
      "Unit": "V",
      "DisplayName": "Voltage"
    },
    "Sensor3": {
      "Unit": "A",
      "DisplayName": "Current"
    }
  }
}

XML

Bei XML (Extensible Markup Language) handelt es sich um eine Beschreibungssprache zur Strukturierung von Daten, um diese sowohl für den Menschen als auch für ein Programm leserlich aufzubereiten. XML hat einen deutlich größeren Overhead als JSON und findet in modernen IoT-Applikationen kaum noch Anwendung. Das oben gezeigte Beispiel ließe sich wie folgt exemplarisch in XML darstellen.

<XmlDocument>
  <Timestamp>2017-04-04T12:42:42</Timestamp>
  <Values>
    <Value Name="Sensor1">42.41999816894531</Value>
    <Value Name="Sensor2">230</Value>
    <Value Name="Sensor3">3</Value>
  </Values>
  <MetaDataColl>
    <MetaData Name="Sensor1">
      <Unit>m/s</Unit>
      <DisplayName>Speed</DisplayName>
    </MetaData>
    <MetaData Name="Sensor2">
      <Unit>V</Unit>
      <DisplayName>Voltage</DisplayName>
    </MetaData>
    <MetaData Name="Sensor3">
      <Unit>A</Unit>
      <DisplayName>Current</DisplayName>
    </MetaData>
  </MetaDataColl>
</XmlDocument>

Natürlich gibt es noch viele weitere Varianten, wie sich das oben genannte JSON in ein äquivalentes XML überführen lässt (und hierbei wird auch deutlich warum dennoch Sender und Empfänger das Datenformat kennen müssen – trotz JSON oder XML). Es soll hierbei nur das grundlegende Prinzip aufgezeigt werden.

Vergleicht man die beiden oben stehenden Dokumente, so fällt schnell der Größenunterschied auf: während das JSON-Dokument eine ungefähre Größe (abhängig von etwaigen Zeilenumbrüchen und Leerzeichen) von circa 393 Bytes aufweist, so hat das äquivalente XML-Dokument eine Größe von circa 569 Bytes und ist somit um circa 44% größer (obwohl die gleichen Informationen übertragen werden).

Datenformate 1:

SPS-Bibliothek Tc3_JsonXml

Zur einfachen Erstellung und Verarbeitung sowohl von JSON- als auch von XML-Objekten gibt es die Bibliothek Tc3_JsonXml, welche automatisch mit TwinCAT 3 XAE installiert wird. (Siehe Dokumentation PLC Lib: Tc3_JsonXml)