Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
embedded_systems:robi2:remote [2011-11-16 13:12] – angelegt niedererembedded_systems:robi2:remote [2011-12-13 13:10] niederer
Zeile 1: Zeile 1:
 <box red 80% | **Actung**>Diese Dokumentation befindet sich noch im Entwicklungsstadium</box> <box red 80% | **Actung**>Diese Dokumentation befindet sich noch im Entwicklungsstadium</box>
 +
 ======Robi2 Remote Interface====== ======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. 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 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 wäre einfach zu vollziehen.+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 [[.:remote#Das Serialisierungsformat|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=== 
 +<code> 
 +Traffic  = Request | Response . 
 +Request  = ">" ProtID " " ProtVersion " " CommandID { Parameter } FrameEnd . 
 +Response = "<" ProtID " " ProtVersion " " CommandID { 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"
 +</code> 
 + 
 +==== 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 {{http://svn.php.net/viewvc/php/php-src/tags/php_5_3_8/ext/standard/var.c?view=markup|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=== 
 +<code> 
 +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 ?. 
 +</code> 
 + 
 +===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; |
  
-Request und Response werden jeweils durch ein Startzeichen FIXME