kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Kontrolle eines autonomen Fahrzeug über eine Internetverbindung

(EN google-translate)

(PL google-translate)

Übersicht

Um ein Gerät über das Internet kontrollieren zu können, gibt es eine Vielzahl an Techniken. Typischerweise ist das Fahrzeug ein Server und die andere Seite der Client. Denn ein Server hat in der Regel vollen Zugriff auf die Hardware, auf dem er läuft. Bei den verschiedenen Möglichkeiten einen Client zu bilden, gibt es oft Beschränkungen, was den Hardwarezugriff betrifft.

Das Schichtenmodell von TCP (Transmission Control Protocol)

  1. Verbindungsschicht
  2. Vermittlungsschicht
  3. Transportschicht
  4. Anwendungsschicht

In jeder Schicht werden Protokolle definiert, wie Daten zu übertragen sind. Protokolle der Schicht 4, der Anwendungsschicht sind beispielsweise HTTP (Hypertext Transfer Protocol), FTP (File Transfer Protocol) oder SMTP (Simple Mail Transfer Protocol).

Das Versenden der Daten über das Internet erfolgt mittels aufeinander aufbauender Protokolle über die Schichten hinweg. Zu sendende Daten werden von der Anwendungsschicht an die Transportschicht übergeben. Gemäß dem TCP (Transmission Control Protocol) werden hier die zu sendenden Daten in Pakete aufgeteilt, mit einem Datenkopf versehen und an Schicht 2, der Vermittlungsschicht übergeben.

In der Schicht 2, der Vermittlungsschicht, ist das Protokoll IP (Internet Protocol) enthalten. In dieser Schicht wird den Datenpaketen ein IP-Header hinzugefügt, über den dann der Rechner identifiziert werden kann, an den die Daten geschickt werden sollen. Dann werden die Pakete weiter an die Schicht 1, der Verbindungsschicht übergeben.

Auf Schicht 1, der Verbindungsschicht, sitzt die Netzwerkkarte. Sie packt einen Rahmendaten um die Pakete.

Auf der Empfängerseite findet dieser Vorgang im umgekehrter Reihenfolge satt. D.h. die Daten kommen auf Schicht 1 an und wandern nach entsprechendem Entpacken immer eine Schicht höher.

UDP

Auf der Transportschicht Ebene (Schicht 3) kann alternativ das TCP (Transmission Control Protocol) oder das UDP (User Datagram Protocol) verwendet werden.

Der Vorteil von TCP ist, dass über Fehlersummen fehlerhafte Übertragungen von Paketen erkannt und diese erneut angfragt werden können. Außerdem ist gewährleistet, dass die Pakete in der richtigen Reihenfolge empfangen werden, in der sie gesendet wurden. TCP ist ein Verbindungsorientiertes Protokoll.

UDP besitzt keine Kontrolle über auftretende Fehler und die Paketreihenfolge. Das Protokoll ist entsprechend einfacher und damit auch schneller. UDP ist ein verbindungsloses Protokoll.

IP, DNS und Portnummer

Zur Identifikation eines Netz-Rechners benötigt dieser eine IP-Adresse. Dies ist eine aus vier 8-Bit-Zahlen zusammengesetzte Kennung. Es gibt IP-Adressen der Klassen A, B und C.

  • Klasse A nutzt die oberen 8 Bit zur Netzwerkkennung und den Rest als Rechneradresse, 0.0.0.0 - 127.255.255.255.
  • Klasse B nutzt die oberen 16 Bit zur Netzwerkkennung und den Rest als Rechneradresse, 128.0.0.0 - 191.255.255.255.
  • Klasse C nutzt die oberen 24 Bit zur Netzwerkkennung und den Rest als Rechneradresse, 192.0.0.0 - 223.255.255.255.

Der Netzwerkadressbereich wird in einer Netzmaske mit Einsen maskiert. Klasse C-Beispiel: 170.19.0.33, Netzwerkmaske: 255.255.0.0

Ein DNS-Server (Domain Name Server) setzt die IP-Adressen in lesbare Namen und umgekehrt. Jeder Rechner kann sich selber als "localhost" oder als IP-Adresse 127.0.0.1 "sehen".

Unter der selben IP-Adresse können mehrere Server ihren Dienst versehen. Sie können aber auf unterschiedlichen Datenkanälen, den so genannten Ports arbeiten. Portnummern können die ganzen Zahlen zwischen 0 und 65535 annehmen. Die Portnummern 0 bis 1023 sind weltweit eindeutig definiert. Beispiele:

Port Service Beschreibung
7 echo Wiederholt eine Eingabe als Antwort
13 daytime liefert die Systemzeit eines Servers
21 FTP Übertragung von Dateien
80 HTTP Auslieferung von Internetseiten

Tabelle 0-1: Feste Portzuordnungen verschiedener Web-Services

Formulare

Die wohl bekannteste Möglichkeiten, Daten mit einem Server auszutauschen, besteht in der Verwendung von Formularen. Diese werden in einer Webseite eingebettet und erlauben es die eingetragenen Formulardaten an einen Server zu schicken. Dieser liefert daraufhin eine neue Version der ursprünglichen Webseite aus, z.B. ergänzt mit Daten aus einer Datenbank oder nach einem Login mit nun freigeschalteten Daten. Formulardaten werden über das HTTP-Protokoll geschickt. Beispiel: Login-Formular auf dieser Webseite.

Java

Die Java-API bietet Internetverbindungen auf verschiedenen Abstraktionsebenen. D.h. es gibt in den einzelnen Library-Klassen Methoden, die elementare Dinge umsetzen, wie eine Netzwerkverbindung aufbauen, aber auch solche, die auf einem sehr hohen Abstraktionslevel stehen und die darunter liegenden Vorgänge verbergen, wie eine Methode eines auf einem anderen Rechnerliegenden Objektes zu benutzen (RMI - Remote Method Invocation). Beispiele:

  • Herunterladen einer Internetseite als String-Objekt.
  • Datenaustausch über UDP.
  • Simulation des Versendens von HTML-Formulardaten.
  • Einbinden entfernter Objekte und Benutzung derer Methoden (RMI).

Im folgenden sollen die diversen Techniken anhand kleiner Experimente erlernt werden.

Experiment Nr.1 - Formulardaten verarbeiten

Ein einfacher Weg, an einen Server zu kommen, ist die Möglichkeit einen XAMPP-Server zu installieren. Dies stellt eine funktionierende out-of-the-box-Lösung dar in der bereits ein Apache-Server, eine MySQL-Datenbank, sowie die Webprogrammiersprachen PHP und Perl funktionierend miteinander interagierend vorhanden sind.

Zu Experimentierzwecken kann man sich XAMPP aus dem Internet herunterladen und installieren und anschließend eine php-Internetseite in das Verzeichnis htdocs legen. Alle Seiten, die dort liegen, können nach Start des Servers übe Angabe der IP-Adresse und nachfolgend des Pfades ab htdocs von einem Client-seitigen Web-Browser abgerufen werden, sofern dies von dem Server erlaubt wird. Beispiel:

Wir legen in htdocs ein Dokument test.html mit folgendem Inhalt:

<html>
    <head>
    </head>
    <body>
        <h1>Dies ist die Internetseite test.html</h1>
        <br/> 
        <p>Senden Sie einen kurzen Text an test2.php:</p>
        <br/>
        <form action="http://localhost/test2.php" method="POST">
            Text senden: <input type="text" name="meintext" value=""/>
            Text abschicken: <input type="submit" value="go"/>
        </form>
    </body>
</html>

Code 0-1: Datei test.html in htdocs des XAMPP-Servers.

Wie am Code zu interpretieren ist, werden die gesendeten Daten Server seitig von einer PHP-Datei verarbeitet, die den Namen test2.php trägt (weitere Erläuterungen s. Vorlesung). Diese könnte so aussehen:

Datei test2.php in htdocs des XAMPP-Servers.

Bild 0-1: Datei test2.php in htdocs des XAMPP-Servers.

Experiment Nr.2 - Inhalt einer Internetseite mit Java abrufen

Applets sind prädestiniert dazu Client-Aufgaben zu übernehmen, da sie selbst wiederum in Internetseiten eingebunden werden können. Ihre Verwendung unterliegt aber einigen Beschränkungen:

  • Applets können nicht direkt auf Dateien auf dem Server oder Client zugreifen.
  • Applets können nur mit dem Server kommunizieren, von dem aus sie ausgeliefert wurden.

Das folgende Applet liest den Quelltext der Seite http://localhost/test.html als String aus und stellt den Inhalt in einem Textfenster (TextArea) dar. Nach Aufbau der Verbindung wird ein Datenstrom geöffnet und der Inhalt der Seite heruntergeladen.

package element.Htmlseite;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.TextArea;
import java.awt.ScrollPane;

import hilfsklassen.Unicode;

import java.io.*;
import java.net.*;

public class Htmlseite extends Applet
{
    public String uebergabe = "";

    public void start()
    {
        try
        {
            URL url = new URL("http://localhost/test.html");
            URLConnection verbindung = url.openConnection();
            verbindung.setUseCaches(false);
            DataInputStream datenstrom = new DataInputStream(verbindung.getInputStream());
            String zeile;
            while( (zeile=datenstrom.readLine()) != null )
                uebergabe+=zeile+"
";
        }
        catch(Exception e)
        {
            uebergabe = e.toString();
        }
        ScrollPane scrollpane = new ScrollPane();
        scrollpane.setBounds(0,0,800,400);
        TextArea textarea = new TextArea();
        textarea.setText(uebergabe); 
        scrollpane.add(textarea);
        setLayout(null);
        add(scrollpane);
    }
}

Code 0-2: Applet Htmlseite.java

Damit das Applet in die vorliegende HTML-Seite eingebettet werden kann, muß in diese ein Applet-Tag in folgender Weise eingetragen werden:

<applet codebase="http://localhost/techne/java/" code="element.Htmlseite.Htmlseite.class" width="800" height="550">
</applet>

Code 0-3: Applet-Tag auf der vorliegenden HTML-Seite

Hierzu ist folgendes zu beachten:

  • Die kompilierte Applet-Klassen-Datei liegt liegt auf dem Server im Verzeichnis .../htdocs/techne/java/element/Htmlseite/Htmlseite.class
  • Es ist dem Package element.Htmlseite zugeordnet.
  • Will man es neu kompilieren, so geht das nur vom Verzeichnis /htdocs/techne/java aus, also oberhalb von dem durch die Package-Zugehörigkeit definierten Pfad.
  • Genau dorthin verweist auch der Parameter "codebase" im Applet-Tag.
  • Als Parameter "code" wird die Applet-Klasse samt Package-Pfad angegeben.
Eingebettetes Applet vom Typ Htmlseite.class @Htmlseite Webseite laden.

Experiment Nr.3 - Umsetzung eines Servlets zur Versendung von Bildern

Eines von einer Reihe an Anforderungen bei dem PC-basierten autonomen Vehikel ist es, die Bilder einer USB-Kamera des Fahrzeugs über W-Lan an einen Client zu schicken. Die Art der versendeten Daten kann über den so genannten MIME-Typ (Multipurpose Internet Mail Extension) bestimmt werden. Allerdings bietet die Klasse unmittelbar eine Methode an, die ein Bild über eine URL lädt:

package element.Bildladen;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.TextArea;
import java.awt.ScrollPane;
import hilfsklassen.Unicode;
import java.awt.Image;
import java.net.URL;

public class Bildladen extends Applet
{
    public Image bild = null;
    public String uebergabe = "";
    public byte[] bildbytes = null;
    public void start()
    {
        try
        {
            bild = getImage(new URL("http://localhost/neuron.png"));
            repaint();
        }
        catch(Exception e)
        {
        }
    }

    public void paint(Graphics g)
    {
        if(bild!=null)
            g.drawImage(bild, 0, 0, this); 
    }
}

Code 0-4: Applet Bildladen.java

Eingebundenes Applet vom Typ Bildladen.class @Bildladen png-Bild laden

Experiment Nr.4, s. nächstes Unterkapitel.