SixML - Binärdarstellung

Die binäre Darstellung von appicals Nachrichten stellt die native Form da, welche von allen Klienten, Gateways und Geräten unterstützt werden muss. Die Repräsentation über XML oder JSON ist optional und nur über bestimmte CommTransceiver wie HTTP oder WebSockets abrufbar, die für größere Nachrichten vorgesehen sind.

Alle SixML-kompatiblen Nachrichten beinhalten eine Unterstruktur ähnlich zu den Optionen im DHCP-Protokoll, sie bestehen also aus unabhängigen Einheiten. Es existieren zwei Einheiten mit der festen Gesamtgröße von einem Byte.

0					EndOfPacket
1					Padding
	

Alle weiteren SixML-kompatiblen Einheiten heißen TLV-Tupel (Type, Length, Value). Dies erlaubt eine einfache Erweiterung ohne Änderung an bereits definierten Protokolloptionen. Jede Einheit außer EndOfPacket und Padding hat damit den folgenden Aufbau:

1 Byte				UnitType		Der Typ der Einheit
	1 Byte			Länge			Die Länge der spezifischen Daten
	0..1016 Bytes	Daten			Die spezifischen Daten der Einheit
	

Jede Einheit kann Untereinheiten besitzen, diese haben den gleichen Aufbau wie die Einheiten selbst. Die Länge einer Einheit enthält immer die Länge sämtlicher Untereinheiten, dadurch können Klienten ihnen unbekannte Tupel z.B. aus späteren SixML-Versionen überspringen.

Das erste Tupel jeder Nachricht definiert den Nachrichtentyp. Die Übertragungsreihenfolge einzelner Tupel ist durch den Standard festgelegt, um das Parsing zu vereinfachen.

Einheitenrepräsentation

In den Folgeseiten werden Nachrichten als XML, lineares ByteArray als auch pseudostrukturiert in Tabellenform dargestellt. Grün ist der jeweilige UnitType, grau die Einheitenlänge und schwarz der Wert des jeweiligen Tupels.

Die XML-Beschreibung dient nur der Anschauung. Alle Nachrichten werden als byte array und NICHT als XML übertragen.

<DiscoveryRequest class="DeviceSearch" >
  <SDLVersion>1.0</SDLVersion>
</DiscoveryRequest>

22-1-03-2-2-01-00-0

1 Byte                                  22                                      DiscoveryRequest
  1 Byte                                1                                       
  1 Byte                                03                                      DeviceSearch
1 Byte                                  2                                       SDLVersion
  1 Byte                                2                                       
  2 Bytes                               01-00                                   1.0
1 Byte                                  0                                       EndOfPacket		
Kodierung der Tupellänge

Um auch Einheiten mit einer Größe jenseits von 255 Bytes zu ermöglichen, ohne zwei Bytes für die Länge zu benötigen, wird das oberste Bit als Multiplikator mit dem Wert 8 interpretiert.

0..127				Einheitengröße = Wert
128..255			Einheitengröße = (Wert & 127) * 8
	

Dies ermöglicht eine maximale Einheitengröße von 1016 Bytes (127*8). Einheiten, welche sich nicht genau auf einen möglichen Längenwert abbilden lassen, werden zum nächstmöglichen Wert aufgerundet. Die fehlenden Bytes werden mit Padding-Einheiten aufgefüllt.

Beispiel für einen Container mit der Länge 165 Bytes, der auf 168 Bytes (21*8) aufgefüllt wird:

1 Byte				70			ServiceDescriptionContainer
	1 Byte			149			Länge (149 = 128 | 21), 21*8 = 168 Bytes
	165 Bytes		...			Daten
1 Byte				1			Padding
1 Byte				1			Padding
1 Byte				1			Padding
1 Byte				...	        Nächstes Tupel