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:
- 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.
- 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-CodeWELCOME_REAL). Falls der Bot schon läuft, wenn der Sim die Verbindung aufbaut, sendet der Sim trotzdem einWELCOME; bei USB-Verbindungen (COM-Verbindungen) schickt der Sim keinWELCOME, 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 inMousePictureComponentbeschrieben 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-CodeWELCOME_SIM). - Der Sim sendet einen Block von Commands, die Sensorwerte beschreiben. Er
ist abgeschlossen mit einem Command, was den Command-Code
DONEhat. 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 dieMousePictureComponent). 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
DONEhat. 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.
