Labor-Octet-Protocol: Unterschied zwischen den Versionen

Aus LaborWiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: In diesem Artikel ist ein Byte ein Oktet, also einem Datenwort der Länge 8 Bit. =About= Das Labor-Octet-Protocol (LOP) stellt sowohl ein Nachrichten als auch eine Str...)
 
Keine Bearbeitungszusammenfassung
 
(12 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
In diesem Artikel ist ein Byte ein Oktet, also einem Datenwort der Länge 8 Bit.
{{ProjektInfoBox
|name=Labor Octet Protocol
|status=unknown
|image=LOP-Logo.png
|description=Nachrichten und Stream-Daten über einen seriellen Bytestream übertragen
|tags=Sicherheit und Kryptologie, Protokoll,
}}
In diesem Artikel ist ein Byte ein Oktet, also ein Datenwort der Länge 8 Bit.


=About=
=About=
Das Labor-Octet-Protocol (LOP) stellt sowohl ein Nachrichten als auch eine Stream orientierte Möglichkeit der Kommunikation zur Verfügung.
Das Labor-Octet-Protocol (LOP) stellt sowohl eine nachrichten- als auch eine streamorientierte Möglichkeit der Kommunikation zur Verfügung.


Das Protokoll geht dabei von einer Byte orientierten, tieferliegenden, Kommunikationsschicht aus und nimmt besondere Rücksicht das die atomare Übertragungsgröße 8 Bit ist.  
Das Protokoll geht dabei von einer byteorientierten, tieferliegenden Kommunikationsschicht aus und nimmt insbesondere Rücksicht darauf, dass die atomare Übertragungsgröße 8 Bit ist.


=Aufbau=
=Aufbau=
Zeile 11: Zeile 18:


==Escape-Schicht==
==Escape-Schicht==
Um (atomare) Kommandos zu ermöglichen werden einigen Bytes spezielle Kommandos zugeordnet. Um jedoch diese Werte auch im normalen Datenstrom zu übermitellen findet ein so genanntes [http://de.wikipedia.org/wiki/Maskierungszeichen Escaping] statt.
Um (atomare) Kommandos zu ermöglichen, werden einigen Bytes spezielle Kommandos zugeordnet. Um jedoch diese Werte auch im normalen Datenstrom zu übermittlen, findet ein so genanntes [http://de.wikipedia.org/wiki/Maskierungszeichen Escaping] statt.


{|border=1
{|border=1
Zeile 38: Zeile 45:


==Kommandos==
==Kommandos==
=== 0x42 Reset ===
=== 0x42 Reset ===
=== 0x23 0x10 Message ===
=== 0x23 0x11 Message + XOR ===
=== 0x23 0x12 Message + CRC16 ===
=== 0x23 0x20 Stream start ===
=== 0x23 0x21 Stream stop ===
=== 0x23 0x30 ping ===
=== 0x23 0x31 pong ===


=== 0x23 0x50 Addr. Message ===
=== 0x23 0x14 Message ===
=== 0x23 0x51 Addr. Message + XOR ===
Die Sequenz ''0x23 0x14'' leitet eine Message ein. Es folgen zwei Bytes, die zusammen die Länge der Nachricht in Bytes angeben, wobei hier die Network-Byteorder zum Tragen kommt, d.h. dass erste Längenbyte ist das MSB und wird vom LSB gefolgt. Anschließend werden die Datenbytes der Nachricht übertragen.
=== 0x23 0x52 Addr. Message + CRC16 ===
 
=== 0x23 0x60 Addr. Stream start ===
=== 0x23 0x15 Stream Sync ===
=== 0x23 0x61 Addr. Stream stop ===
Die Sequenz ''0x23 0x15'' stellt eine besondere Markierung im Datenstrom da, und ist für Synchonisierungszwecke geeignet.
=== 0x23 0x70 Addr. ping ===
 
=== 0x23 0x71 Addr. pong ===
=Implementierung=
==AVR-Mikrocontroller==
Eine Implementierung des LOP für AVR-Mikrocontroller ist unter [https://das-labor.org/trac/browser/microcontroller-2/lib/lop] zu finden.
Auf diese Implementierung beziehen sich auch die folgenden Aussagen.
===Konzept===
Die Nutzung basiert auf dem Umgang mit einem sogenannten LOP-Kontext, welcher alle Informationen zum Status und zur Verwaltung des Protokolls enthält. Auch sind in diesem Kontext die Adressen jener Funktionen gespeichert, welche bei bestimmten Ereignissen (z.B. eingehende Message, Empfangen einer Sync-Sequenz) aufgerufen werden sollen.
 
Durch die Hinterlegung entsprechender Funktionszeiger wird auch eine gewisse Ereignisorientiertheit implementiert, welche es erlaubt, Teile der Anwendung nebenläufig zu implementieren.
 
{{Box Code| LOP-Kontext|<pre>
typedef struct lop_ctx {
lopstates_t rxstate, txstate, msgretstate;
uint32_t msgidx;
uint16_t msglength;
uint8_t* msgbuffer;
uint8_t escaped;
void (*sendrawbyte)(uint8_t);          /* pointer to the writing function */
void (*on_msgrx)(uint16_t, uint8_t*);  /* function called on message recieve */
void (*on_streamrx)(uint8_t);          /* function called on recieve of a stream byte*/
void (*on_streamsync)(void);            /* function called on recieve of streamsync */
} lop_ctx_t;
</pre>}}

Aktuelle Version vom 9. April 2017, 17:42 Uhr

 
Labor Octet Protocol

Release status: unknown [box doku]

LOP-Logo.png
Description Nachrichten und Stream-Daten über einen seriellen Bytestream übertragen



In diesem Artikel ist ein Byte ein Oktet, also ein Datenwort der Länge 8 Bit.

About[Bearbeiten | Quelltext bearbeiten]

Das Labor-Octet-Protocol (LOP) stellt sowohl eine nachrichten- als auch eine streamorientierte Möglichkeit der Kommunikation zur Verfügung.

Das Protokoll geht dabei von einer byteorientierten, tieferliegenden Kommunikationsschicht aus und nimmt insbesondere Rücksicht darauf, dass die atomare Übertragungsgröße 8 Bit ist.

Aufbau[Bearbeiten | Quelltext bearbeiten]

Überblick[Bearbeiten | Quelltext bearbeiten]

Escape-Schicht[Bearbeiten | Quelltext bearbeiten]

Um (atomare) Kommandos zu ermöglichen, werden einigen Bytes spezielle Kommandos zugeordnet. Um jedoch diese Werte auch im normalen Datenstrom zu übermittlen, findet ein so genanntes Escaping statt.

Kommandozeichen Bedeutung
0x42 Reset
0x23 Escape


Escape-Sequenz Daten
0x23 0x01 0x42
0x23 0x02 0x23
0x23 0x03 0x11
0x23 0x04 0x13

Die zwei zusätzlichen Escape-Sequenzen ermöglichen ein normales Software-Flowcontrol (XON/XOFF), wie es bei seriellen Leitungen häufig gewünscht ist.

Kommandos[Bearbeiten | Quelltext bearbeiten]

0x42 Reset[Bearbeiten | Quelltext bearbeiten]

0x23 0x14 Message[Bearbeiten | Quelltext bearbeiten]

Die Sequenz 0x23 0x14 leitet eine Message ein. Es folgen zwei Bytes, die zusammen die Länge der Nachricht in Bytes angeben, wobei hier die Network-Byteorder zum Tragen kommt, d.h. dass erste Längenbyte ist das MSB und wird vom LSB gefolgt. Anschließend werden die Datenbytes der Nachricht übertragen.

0x23 0x15 Stream Sync[Bearbeiten | Quelltext bearbeiten]

Die Sequenz 0x23 0x15 stellt eine besondere Markierung im Datenstrom da, und ist für Synchonisierungszwecke geeignet.

Implementierung[Bearbeiten | Quelltext bearbeiten]

AVR-Mikrocontroller[Bearbeiten | Quelltext bearbeiten]

Eine Implementierung des LOP für AVR-Mikrocontroller ist unter [1] zu finden. Auf diese Implementierung beziehen sich auch die folgenden Aussagen.

Konzept[Bearbeiten | Quelltext bearbeiten]

Die Nutzung basiert auf dem Umgang mit einem sogenannten LOP-Kontext, welcher alle Informationen zum Status und zur Verwaltung des Protokolls enthält. Auch sind in diesem Kontext die Adressen jener Funktionen gespeichert, welche bei bestimmten Ereignissen (z.B. eingehende Message, Empfangen einer Sync-Sequenz) aufgerufen werden sollen.

Durch die Hinterlegung entsprechender Funktionszeiger wird auch eine gewisse Ereignisorientiertheit implementiert, welche es erlaubt, Teile der Anwendung nebenläufig zu implementieren.

Code: LOP-Kontext
 typedef struct lop_ctx {
 	lopstates_t rxstate, txstate, msgretstate;
 	uint32_t msgidx;
 	uint16_t msglength;
 	uint8_t* msgbuffer;
 	uint8_t escaped;
 	void (*sendrawbyte)(uint8_t);           /* pointer to the writing function */
 	void (*on_msgrx)(uint16_t, uint8_t*);   /* function called on message recieve */
 	void (*on_streamrx)(uint8_t);           /* function called on recieve of a stream byte*/
 	void (*on_streamsync)(void);            /* function called on recieve of streamsync */
 } lop_ctx_t;