heise online
  • c't
  • iX
  • Technology Review
  • Mac & i
  • mobil
  • Security
  • Netze
  • Open Source
  • Developer
  • c't-TV
  • Download
  • Telepolis
  • Resale
  • Foto
  • Autos
  • Preisvergleich
  • Stellenmarkt
  • Abo
  • weitere Angebote
    • Shop
    • Artikel-Archiv
    • Veranstaltungen
    • Whitepapers
    • heise-marktplatz
    • IT-Markt
    • Tarifrechner
    • Jobs bei Heise

c't Magazin
  • Startseite
  • Artikel
  • c't-Projekte
  • Hotline & FAQ
  • Treiber & mehr
  • Kolumnen
Software zu Projekten Allgemeine Hinweise
Archiv-Suche Newsletter RSS-FeedRSS

c't › c't-Projekte

Trac
  • Login
  • Help/Guide
  • About Trac
  • Preferences
  • Wiki
  • Timeline
  • Roadmap
  • Browse Source
  • View Tickets
  • Search

Context Navigation

  • Start Page
  • Index
  • History
  • Last Change

  1. Dokumentation des Protokolls zwischen ct-Bot und ct-Sim
      1. Beispiel eines Command
      2. Verfügbare Kommandos
      3. Ablauf der Kommunikation

Dokumentation des Protokolls zwischen ct-Bot und ct-Sim

Hauptteil des Protokolls zwischen c't-Sim und Bot-Steuercode (sog. c't-Bot-Protokoll). Eingesetzt wird diese Klasse vorwiegend in zwei Fällen:

  1. Ein realer (in Hardware existierender) Bot, der per USB oder TCP verbunden ist, sendet laufend Messwerte der Sensoren und andere Statusinformationen. 12 Byte auf dem Draht stellen die Messwerte eines Sensorpaars dar, z.B. linker und rechter Distanzsensor; die Aufgabe dieser Klasse ist das Lesen und Repräsentieren dieser 12 Byte innerhalb des Sim.
  2. Ein simulierter Bot (Bot-Steuercode, auf einem PC läuft) bekommt über seine TCP-Verbindung vom Sim Sensorwerte gefüttert. Der Sim speichert die Werte in einem Command-Objekt, das er anschließend ins TCP schreibt.

Diese Klasse behandelt das Dekodieren eines Commands aus einem Haufen Bytes (siehe Konstruktor) und das Enkodieren eines Commands (siehe getCommandBytes()). Verwendet und interpretiert werden die Commands in den Bot-Komponenten. Die betreffenden Komponenten stehen in der Liste der Command-Codes.

Beispiel eines Command

Die genaue Definition des Datentyps findet sich in der Datei include/command.h respektive ctSim/model/Command.java.

 Byte#         Wert            Bedeutung
 
   0           '>' (Ascii 62)  Startcode, markiert Beginn des Command, ist
                               immer '>'
   1           'H' (Ascii 72)  Command-Code, hier der für die
                               Helligkeitssensoren
   2 Bit 0     0               Richtungsangabe, 0 = Anfrage, 1 = Antwort. Ist
                               historisch und steht immer auf 0.
   2 Bits 1-7  'N' (Ascii 78)  Sub-Command-Code: Nur von einigen Command-Codes
                               verwendet, ist normalerweise N ("normal")
   3           0               Länge der Nutzlast in Byte, hier: keine
                               Nutzlast
   4           42              Datenfeld "dataL" LSB: niederwertiges Byte des
                               Messwerts des linken Helligkeitssensors
   5           1               dataL MSB: höherwertiges Byte des Messwerts
   6           37              dataR LSB: niederwertiges Byte rechter
                               Helligkeitssensor
   7           0               dataR MSB: zugehöriges höherwertiges Byte
   8           61              Sequenznummer LSB, bei aufeinanderfolgenden
                               Commands erhöht sich die Sequenznummer immer
                               um eins
   9           0               Absender-Id des Paketes
  10           0               Empaenger-Id des Paketes
  11           '<' (Ascii 60)  CRC-Code, markiert Command-Ende, ist immer '<'
                               (Name "CRC" irreführend)
  12 und folgende              Nutzlast falls vorhanden. Wird z.B. verwendet,
                               wenn der Bot den Inhalt des LCD überträgt oder
                               die Bilddaten, was der Maussensor sieht
 

Verfügbare Kommandos

Eine Liste mit allen Verfügbarenn Kommandos befindet sich im C-Code in der Datei include/command.h

Ablauf der Kommunikation

Für einen realen Bot besteht das Protokoll aus folgenden Regeln:

  • Der Bot-Steuercode sendet laufend Commands mit Sensor-Messwerten und anderen Statusinformationen, die der Sim auswertet und dem Benutzer anzeigt. Welche einzelnen Commands behandelt werden, und wie sie im Detail interpretiert werden, ist Sache der Bot-Komponenten wie in der Command-Code-Liste beschrieben.
  • Beim Start des Sim überträgt er ein Command mit dem Command-Code WELCOME, das einen Handshake anfordert. Der Bot antwortet mit einem Command, das ihn als realen Bot ausweist (Command-Code WELCOME, Sub-Command-Code WELCOME_REAL). Falls der Bot schon läuft, wenn der Sim die Verbindung aufbaut, sendet der Sim trotzdem ein WELCOME; bei USB-Verbindungen (COM-Verbindungen) schickt der Sim kein WELCOME, da von vornherein klar ist, dass es ein Real-Bot sein muss. Aus Sicht des Bot kann ein Handshake also jederzeit kommen oder überhaupt nie.
  • Jederzeit während der Verbindung kann der Sim ein Command senden, das das Bild anfordert, das der Maussensor auf der Botunterseite sieht (Command-Code SENS_MOUSE_PICTURE). Der Bot beantwortet das mit einer Serie von Commands mit dem Aufbau, der in MousePictureComponent beschrieben ist
  • Jederzeit während der Verbindung kann der Sim ein Command senden, das einen Befehl der RC5-Fernbedienung repräsentiert (Command-Code SENS_RC5)

Für einen simulierten Bot ist das Protokoll:

  • Der Sim lauscht auf dem TCP-Port, der in der Konfigdatei angegeben ist (Parameter "botport").
  • Bot-Steuercode verbindet sich mit dem TCP-Port. Der Sim sendet ein Command mit dem WELCOME, das einen Handshake anfordert. Der Bot antwortet mit einem Command, das ihn als simulierten Bot ausweist (Command-Code WELCOME, Sub-Command-Code WELCOME_SIM).
  • Der Sim sendet einen Block von Commands, die Sensorwerte beschreiben. Er ist abgeschlossen mit einem Command, was den Command-Code DONE hat. Beispiel:
     Richtung  Command-Code         dataL dataR
    
     Sim->Bot: SENS_MOUSE           L   0 R   0 Payload=''
     Sim->Bot: SENS_DOOR            L   0 R   0 Payload=''
     Sim->Bot: SENS_BORDER          L 690 R 690 Payload=''
     Sim->Bot: SENS_LDR             L 965 R 965 Payload=''
     Sim->Bot: SENS_IR              L 100 R  80 Payload=''
     Sim->Bot: SENS_ERROR           L   0 R   0 Payload=''
     Sim->Bot: SENS_RC5             L   0 R   0 Payload=''
     Sim->Bot: SENS_TRANS           L   0 R   0 Payload=''
     Sim->Bot: SENS_LINE            L 690 R 690 Payload=''
     Sim->Bot: SENS_ENC             L   0 R   0 Payload=''
     Sim->Bot: DONE                 L  30 R   0 Payload=''
    Wenn ein Bot andere Sensoren hätte als der normale c't-Bot, sähe die Liste anders aus. Manche Sensoren senden nur, wenn sie etwas zu senden haben (Beispiel für dieses Verhalten: SENS_MOUSE_PICTURE, also die MousePictureComponent). Das DONE-Command enthält die aktuelle Simulatorzeit in Millisekunden, falls der Bot zeitabhängige Sachen rechnen will.
  • Der Bot berechnet auf Basis der simulierten Sensorwerte seine nächsten Aktionen. Dann sendet er einen Block von Commands mit Aktuatorwerten. Er ist abgeschlossen mit einem Command, was den Command-Code DONE hat. Beispiel:
     Richtung  CmdCode/SubCmdCode   dataL dataR
    
     Bot->Sim: ACT_LED              L 128 R 128 Payload=''
     Bot->Sim: ACT_MOT              L -24 R  24 Payload=''
     Bot->Sim: ACT_LCD/LCD_CURSOR   L   0 R   0 Payload=''
     Bot->Sim: ACT_LCD/LCD_DATA     L   0 R   0 Payload='P=3C5 3C5 D=999 999 '
     Bot->Sim: ACT_LCD/LCD_CURSOR   L   0 R   1 Payload=''
     Bot->Sim: ACT_LCD/LCD_DATA     L   0 R   0 Payload='B=2B2 2B2 L=2B2 2B2 '
     Bot->Sim: ACT_LCD/LCD_CURSOR   L   0 R   2 Payload=''
     Bot->Sim: ACT_LCD/LCD_DATA     L   0 R   0 Payload='R= 0  0 F=0 K=0 T=0 '
     Bot->Sim: ACT_LCD/LCD_CURSOR   L   0 R   3 Payload=''
     Bot->Sim: ACT_LCD/LCD_DATA     L   0 R   0 Payload='I=1005 M=00000 00000'
     Bot->Sim: DONE                 L  30 R   0 Payload=''
    Das DONE-Command enthält zur Bestätigung die Simulatorzeit, die vom c't-Sim zuletzt empfangen wurde.

Falls der Sim vom Benutzer pausiert wird, kann beliebig viel Armbanduhrenzeit zwischen einem Block und dem nächsten liegen. Die Simulatorzeit (DONE-Command) wird davon jedoch nicht beeinflusst. Bot-Steuercode sollte sich also auf die Simulatorzeit verlassen, nicht auf Armbanduhrenzeit.
  • Die Endianness auf dem Draht bei uns ist Little-Endian. Java verwendet intern Big-Endian. Die Konvertierung erfolgt zu Fuß in der Command-Klasse.
  • Download in other formats:

    • Plain Text

    Trac Powered

    Powered by Trac 0.11.7
    By Edgewall Software.

    http://www.ctmagazin.de/
    http://www.ctmagazin.de/projekte/

    • Datenschutzhinweis
    • Impressum
    • Kritik, Anregungen bitte an c't-WWW
    • Mediadaten
    • Copyright © 2011 Heise Zeitschriften Verlag
    • International: The H, The H Security, The H Open Source