Dies ist eine alte Version des Dokuments!


Actung

Diese Dokumentation befindet sich noch im Entwicklungsstadium

Robi2 Remote Interface

Es besteht die Möglichkeit, den Robi softwaretechnisch fernzusteuern. Hierfür wird auf dem Robi eine Server-Applikation installiert, welche eine vereinfachte Form eines RMI Servers zur Verfügung stellt.

Das Objektmodell

Client Implementation

TODO

Server Implementation

TODO

Funktionsumfang

Robi Remote Version 0

Diese Remote-Procedure-Call Ausbaustufe wird durch ProtVersion=0 im Traffic identifiziert.

Methodenliste

TODO

Das Kommunikationsprotokoll

Das Protokoll funktioniert nach dem Request-Response Prinzip wobei jeweils der Client die Requests stellt. Das Protokoll ist als Textformat entworfen. Dies ermöglicht die Überquerung von Plattformen, ohne dabei die Endianness oder ähnliches beachten zu müssen. Da es sich um geringe Datenmengen handelt, ist der Overhead vertretbar. Nötigenfalls wäre eine Übersetzung in ein binäres Format aber einfach zu vollziehen. Als Voraussetzung für dieses Protokoll wird ein bereits gesicherter Übertragungskanal für Byte-Ströme angenommen.

Framing

Request und Response werden jeweils durch ein Startzeichen identifiziert und durch einen Zeilenumbruch abgeschlossen. Das erste Datenfeld in der Nutzlast entspricht der Protokollidentifikation. So können zum Beispiel verschiedene Protokollversionen unterschieden werden. Die eigentliche Nutzlast wird durch ein PHP inspiriertes Serialisierungsverfahren codiert. Auf eine Längencodierung der Nutzlast wird bewusst verzichtet, da durch das Serialisierungsformat bereits - wo Nötig - eine Längencodierung stattfindet und dadurch keine Kollisionen mit dem Frame-End-Zeichen auftreten können, sofern der Parser für das Framing und der Parser der Serialisierung zusammen arbeiten.

Frameformat

Traffic  = Request | Response .
Request  = ">" ProtID ProtVersion CommandID { Parameter } FrameEnd .
Response = "<" ProtID ProtVersion { ReturnValue } FrameEnd .

ProtID      = "R" "2" .
ProtVersion = Number .

CommandID   = SerializedNumber . 
Parameter   = SerializedData .
ReturnValue = SerializedData . 

SerializedNumber = ? Number in serialisiert Form ? .
SerializedData   = ? Daten in serialisierter Form ? .

Number   = NonZeroDigit { Digit } .
Digit    = "0" | "1" | "2" | "3" | "4" | "5" | "6"  | "7" | "8" | "9" .
FrameEnd = "\r" "\n" .

Das Serialisierungsformat

Das Serialisierungsformat ist durch das PHP Serialisierungsformat inspiriert und erweitert das grösstenteils kompatibel. Im Gegensatz zur Standard Java-Serialisierung ist dieses Datenformat als ASCII-Text ausgelegt und ausserdem wesentlich kompakter als ein Java Object Stream nach Standard-Protokoll.

Leider ist das PHP Serialisierungsformat nirgendwo formal beschrieben. Es lässt sich jedoch aus dem Code des Moduls var.c aus der PHP Codebase sehr einfach rekonstruieren. Das an dieser Stelle verwendete Format beschränkt sich auf die primitiven Datentypen ohne Arrays.

Formatbeschreibung

SerializedData   = SerializedObject { SerializedObject } .
SerializedObject = ( Null | Bool | Long | Double ) ";" .

Null             = "N" ":" .
Bool             = "b" ":" ("0" (* = false *) | "1" (* = true *)) . 
Long             = "i" ":" [ '-' ] Number .
Double           = "d" ":"  ( DoubleNumber | ( "N" "a" "N" ) | (( "+" | "-" ) "I" "N" "F" ) ).

DoubleNumber     = Long [ "." Number "E" ( "+" | "-" ) Number ] .
Number           = NonZeroDigit { Digit } .
Digit            = "0" | NonZeroDigit .
NonZeroDigit     = "1" | "2" | "3" | "4" | "5" | "6"  | "7" | "8" | "9" .
AnyChar          = ? Beliebige ASCII Zeichenfolge ?.

Beispiel

Das nachfolgende Beispiel illustriert die verkettete Serialisierung der Daten

Typ Wert Serialisiert
- null N;
boolean false b:0;
long 13 i:13;
double 23.1 d:FIXME;
Alle verbunden N;b:0;i:13;d:FIXME;