Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI

Die Seite wird erstellt Linus-Maximilian Weigel
 
WEITER LESEN
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
Entwicklung und Umsetzung
eines Datenbank-basierten
Systems zur RFID-basierten
Erfassung von sportlichen
Wettkampfdaten auf einem
PC und Raspberry-PI
Katharina Rawers
Studiengang Elektrotechnik
Erstprüfer : Prof. Dr.-Ing. Dirk Rabe
Zweitprüfer : Frederik Gosewehr, M.Eng.

Katharina Rawers
13.01.2020 - 29.06.2020
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
ERKLÄRUNG

Soweit meine Rechte berührt sind, erkläre ich mich einverstanden, dass die vorliegende
Arbeit Angehörigen der Hochschule Emden/Leer für Studium / Lehre / Forschung
uneingeschränkt zugänglich gemacht werden kann.

EIDESSTATTLICHE VERSICHERUNG

Ich, die Unterzeichnende, erkläre hiermit an Eides statt, dass ich die vorliegende Arbeit
selbständig verfasst habe und keine anderen als die angegebenen Quellen und Hilfsmittel
benutzt habe. Alle Quellenangaben und Zitate sind richtig und vollständig wiedergegeben
und in den jeweiligen Kapiteln und im Literaturverzeichnis wiedergegeben. Die vorliegende
Arbeit wurde nicht in dieser oder einer ähnlichen Form ganz oder in Teilen zur Erlangung
eines akademischen Abschlussgrades oder einer anderen Prüfungsleistung eingereicht.

Mir ist bekannt, dass falsche Angaben im Zusammenhang mit dieser Erklärung strafrechtlich
verfolgt werden können.

 _____________________________

 Ort, Datum, Unterschrift
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
Inhaltsverzeichnis
1 Einleitung ......................................................................................................................................... 1
 1.1 Aufgabenstellung..................................................................................................................... 1
 1.2 Aufbau der Arbeit .................................................................................................................... 1
2 Systemaufbau .................................................................................................................................. 2
3 Antennen HF .................................................................................................................................... 4
 3.1 Konstruktion von zwei Testantennen...................................................................................... 4
 3.2 Abgleich der Testantennen ..................................................................................................... 7
 3.3 Testen von Antennen .............................................................................................................. 7
4 Aufbau des Laptops ....................................................................................................................... 11
5 SSH-Tunnel .................................................................................................................................... 12
 5.1 Allgemeine Informationen .................................................................................................... 12
 5.2 Installationen ......................................................................................................................... 14
 5.3 Public-Key-Authentication einrichten ................................................................................... 14
 5.4 RSync Test.............................................................................................................................. 15
 5.5 RSync automatisieren ............................................................................................................ 15
 5.6 Probleme ............................................................................................................................... 15
 5.6.1 Windows-Kontoname .................................................................................................... 15
 5.6.2 Dienst starten ................................................................................................................ 15
 5.6.3 Programmpfad bekannt machen .................................................................................. 17
 5.6.4 Berechtigungen .ssh-Ordner ......................................................................................... 18
 5.6.5 Alternative Übertragung des publickeys ....................................................................... 18
 5.6.6 WLAN des Raspberry Pis................................................................................................ 19
 5.6.7 SSH debuggen ................................................................................................................ 19
6 Datenbank ..................................................................................................................................... 21
 6.1 Grundlagen ............................................................................................................................ 21
 6.2 Installationen ......................................................................................................................... 22
 6.2.1 MySQL............................................................................................................................ 22
 6.2.2 Python ........................................................................................................................... 23
 6.3 Einrichtung ............................................................................................................................ 23
 6.4 Python-Code .......................................................................................................................... 25
 6.4.1 importer.py.................................................................................................................... 25
 6.4.2 tag-listener.py................................................................................................................ 27
 6.4.3 exporter.py .................................................................................................................... 30
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
6.5 Programme testen................................................................................................................. 32
 6.5.1 Importer Test ................................................................................................................. 32
 6.5.2 Tag-Listener Test ........................................................................................................... 34
 6.5.3 Exporter Test ................................................................................................................. 35
 6.6 Programm zum Aufruf der Python-Programme .................................................................... 35
 6.7 Anpassungen Schwimmwettkampf ....................................................................................... 36
 6.7.1 Anpassungen Importer .................................................................................................. 37
 6.7.2 Anpassungen Tag-Listener............................................................................................. 37
 6.7.3 Anpassungen Exporter .................................................................................................. 40
 6.7.4 Test ................................................................................................................................ 41
 6.8 Unittest .................................................................................................................................. 42
 6.9 Probleme ............................................................................................................................... 44
 6.9.1 MySQL Connector: Unknown database ........................................................................ 44
 6.9.2 MySQL Connector: Access denied ................................................................................. 44
 6.9.3 Python Bibliothek installieren (pyfilewatch) ................................................................. 45
 6.9.4 Bibliotheksversionen ..................................................................................................... 46
7 Systemtests ................................................................................................................................... 47
 7.1 Testablauf .............................................................................................................................. 47
 7.2 Test Laufveranstaltung .......................................................................................................... 47
 7.3 Test Schwimmwettkampf ...................................................................................................... 49
8 Projektverlauf ................................................................................................................................ 51
9 Fazit ............................................................................................................................................... 52
10 Ausblick...................................................................................................................................... 52
11 Literatur- und Quellenverzeichnis ............................................................................................. 53
12 Abbildungsverzeichnis ............................................................................................................... 55
13 Listingverzeichnis....................................................................................................................... 57
14 Tabellenverzeichnis ................................................................................................................... 58
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
1 Einleitung
Für die Zeiterfassung von Sportlern bei Wettkämpfen wird häufig die RFID-Technik eingesetzt. Jeder
Sportler trägt je nach Wettkampf-Typ einen (bei Laufwettkämpfen) oder zwei (bei Freiwasser-
Schwimmwettkämpfen) Transponder, sogenannte Tags. Wenn die Sportler mit den Tags im
Erfassungsbereich der Antennen sind, werden ihre Zeiten und die Tag-IDs vom System
aufgenommen. Über die Tag-ID kann auf den Sportler geschlossen werden.

Im Rahmen dieser Bachelorarbeit soll eine vorhandene Antennenlösung für die
Hochfrequenzzeitaufnahme für Schwimmwettkämpfe [4][5] und die Neuaufsetzung des Systems vom
Spendenlauf einer Projektgruppe aus dem Jahr 2019 [1]. Außerdem soll die Software für
Schwimmwettkämpfe erweitert werden.

1.1 Aufgabenstellung
Zuerst sollte überprüft werden, ob die Empfangs-Zuverlässigkeit der vorhandenen RFID-basierten
Transponder-Erkennung im HF-Bereich mit 2 sehr breiten Antennen durch kleinere Antennen (ca.
5m) erhöht werden kann. Dabei soll aufgrund der möglichen Erweiterung auf z.B. 4 Antennen das
Multiplexing der Antennen überprüft werden.

Die Ergebnisse, die in txt-Dateien auf den Raspberry Pi geschrieben werden, sollen mithilfe eines
SSH-Tunnels zum PC-Auswerter-Programm übertragen werden.

Dieser Laptop soll neu aufgesetzt werden und dafür alle notwendigen Programme installiert und
eingerichtet werden.

Außerdem soll eine Datenbank mit Sportlerdaten, Transponderzuordnung (auch mehr als 1
Transponder pro Sportler) und Abgangszeiten von Sportlern (Renneinteilung oder individuell) erstellt
werden. Diese soll auch eine Export-Funktionen (csv-Format) beinhalten.

Des Weiteren sollen Unit-Tests und System-Tests durchgeführt werden.

1.2 Aufbau der Arbeit
In Abschnitt 2 werden der Systemaufbau dargestellt und die einzelnen Komponenten kurz erläutert.
Danach wird im Abschnitt 3 die vorhandene Antennenlösung für die Zeitmessung für
Schwimmwettkämpfe durch Vergleichen mit neuen Antennen überprüft und der Aufbau des Laptops
in Abschnitt 4 erklärt. Dann wird in Abschnitt 5 der SSH-Tunnel und in Abschnitt 6 die Datenbank für
das System für den Spendenlauf und den Schwimmwettkampf erläutert. Danach sind in Abschnitt 7
kurze Systemtests für Laufwettkämpfe und Schwimmwettkämpfe zu finden. Den Abschluss bildet der
Projektverlauf, das Fazit sowie der Ausblick ab Abschnitt 8.

 1
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
2 Systemaufbau
Der grobe Aufbau des Systems wurde vom Vorgängerprojekt einer Projektgruppe [1] übernommen
und auf einem PC neu aufgebaut und erweitert. Das System beinhaltet mehrere Teilkomponenten
und wird in Abbildung 1 dargestellt. Der Aufbau ist für zwei Szenarien vorgesehen: eine Zeiterfassung
von Schwimmwettkämpfen mittels Hochfrequenz- und eine von Leichtathletik-Laufveranstaltungen
via Ultrahochfrequenz-RFID-Zeiterfassung. Aufgrund der verschiedenen Anforderungen an die
Zeitmessung der verschiedenen Wettkämpfe wurden verschiedene Frequenzen genutzt.

 (b)

 (c)
 (d)

 (a)

 Abbildung 1: Systemaufbau

 2
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
(a) Die Liste mit den inventarisierten Tags und die Anmeldedatei, die von einem
 Anmeldeprogramm [2] erstellt wird, werden an EasyWK übertragen und dann als Meldedatei
 exportiert. Diese Datei wird auf den Laptop übertragen und mit dem Importer-Programm in
 die Datenbank importiert.

 (b) Die Erfassung der RFID-Tags geschieht mittels spezieller Antennen und Software, welche in
 Vorgängerprojekten [1][4] entwickelt wurde. Die verwendete Hardwarebasis, die die
 Erfassung steuert, stellt dabei ein Raspberry Pi dar. Dadurch wird beim Wettkampf eine
 Textdatei mit den Tagnummern und den dazugehörigen Zeiten erstellt (tag.txt). Außerdem
 wird für das Drücken des Tasters bei Schwimmwettkämpfen eine Textdatei erstellt mit den
 jeweiligen Zeiten (time.txt). Diese Dateien werden mit Hilfe eines SSH-Tunnels1 und RSync2
 während des Rennens auf den Laptop übertragen, der vom Tag-Listener-Programm auf dem
 Laptop aufgerufen wird. Das Tag-Listener-Programm schreibt die Tagzeiten aus der tag.txt
 und beim Schwimmwettkampf die Tasterdrückzeiten aus der time.txt in die Datenbank.
 Dieses wurde teilweise schon in Vorgängerprojekten erarbeitet [1][5].

 (c) Während des Rennens greift das Moderator-Kit auf die Datenbank (Steuerungs-Laptop) zu,
 um aktuelle Informationen zur Veranstaltung darstellen zu können und diese zusätzlich an
 ein Großdisplay zu übertragen [1].

 (d) Damit die Sportlerdaten nach einem Rennen weiter verarbeitet werden können, wird die
 Datenbank mit dem Exporter-Programm in eine csv-Datei übertragen und kann dann wieder
 an das EasyWK-Programm übertragen werden.

1
 SSH (Secure Shell) – Tunnel: Programm zur sicheren und verschlüsselten Übertragung von Shell-Kommandos,
siehe Abschnitt 5 SSH-Tunnel
2
 RSync: Nutzt den SSH-Tunnel zum Datenaustausch, siehe Abschnitt 5 SSH-Tunnel
 3
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
3 Antennen HF
Im Rahmen dieser Arbeit soll überprüft werden, ob die Empfangs-Zuverlässigkeit der vorhandenen
RFID-basierten Transponder-Erkennung aus einem Vorgängerprojekt [4] im Hochfrequenz(HF)-
Bereich mit 2 sehr breiten Antennen durch kleinere Antennen erhöht werden kann. Diese sollen
genau wie die alten Antennen insgesamt eine Breite von 5m haben.

3.1 Konstruktion von zwei Testantennen
Auf den 5m Breite und 30cm Höhe sollen vier gleichgroße Antennen zu finden sein (Abbildung 2).

 Abbildung 2: Antennenaufbau

Somit sind, wie in der Abbildung 3 zu sehen, die Maße jeder Antenne 125 ⋅ 30 . Damit wurde
versucht die größtmögliche Anschlagsbreite von 5 m Breite mit vier Antennen komplett abzudecken.

 125cm

 30cm

 Abbildung 3: Antennenmaße

Um zu überprüfen, ob die Antenneneigenschaften kürzerer Antennen sich im Vergleich zu den
größeren Antennen verbessert haben, wurden zuerst zwei Antennen zum Testen aufgebaut.

Für jede Antenne werden ca. 280 cm Kupferrohr mit einem Durchmesser von 22 mm, 4 Eckstücke
und 1 Verbindungsstück benötigt. Bei den Maßen der Stücke müssen die jeweiligen versenkten Teile
im Eck- bzw. Verbindungsstück bedacht werden. Außerdem muss noch eine Lücke für den Anschluss
an die Abgleichplatine (Abstand Bohrungen Abgleichplatine - Sicherheitsabstand zu den Bohrungen)
eingeplant werden und 4 Schrauben zum Fixieren der Abgleichplatine an der Antenne.

Zuerst wurden die Rohrstücke mithilfe eines Rohrschneiders auf Maß gebracht und miteinander
verbunden, wie in Abbildung 4 dargestellt.

 4
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
125,00cm

 2,20cm

 30,00cm
 2,20cm

 4,00cm 6,00cm 4,00cm
 73,00cm 19,00cm 19,00cm

 4,00cm
 AP

 22,00cm
 AP = Abgleichplatine

 4,00cm
 4,00cm 117,00cm 4,00cm

 Abbildung 4: Abmessungen der Antennen

Die montierte Antenne ist in der Abbildung 5 abgebildet.

 Abbildung 5: Zusammengesteckte Antennen

Außerdem wurden die Enden zur Abgleichplatine, wie in der Abbildung 6 zu sehen, mithilfe eines
Schraubstocks zusammengepresst.

 5
Entwicklung und Umsetzung eines Datenbank-basierten Systems zur RFID-basierten Erfassung von sportlichen Wettkampfdaten auf einem PC und Raspberry-PI
Abbildung 6: Zusammengesteckte Antenne mit zusammengepressten Enden

Im nächsten Arbeitsschritt wurden die einzelnen Rohrstücke miteinander durch Verlöten fest
verbunden. (Abbildung 7).

 Abbildung 7: Verlötete Antenne

Im Anschluss wurden noch die Enden zur Abgleichplatine durchbohrt und verzinnt. Des Weiteren
wurden die überstehenden Stücke soweit gekürzt, dass diese deren Enden exakt auf der dafür
vorgesehenen Fläche auf der Platine aufliegen. In Abbildung 8 ist die fertige Antenne mit und ohne
Abgleichplatine zu sehen.

 Abbildung 8: Fertige Antennen oben ohne und unten mit Abgleichpatine

 6
3.2 Abgleich der Testantennen
Damit die Antennen am System bestmöglich funktionieren, müssen diese zuerst auf einen reellen
Wellenwiderstand von 50 Ω bei der RFID-HF-Übertragungsfrequenz abgeglichen werden. Dies wurde
hier mithilfe der Abgleichplatine ID ISC.MAT.S der Firma Feig [6] und dem Netzwerkanalysator von
Rohde & Schwarz erledigt. Die Jumper der Abgleichplatine werden dafür so auf der Abgleichplatine
versetzt, dass der Marker mit der RFID-HF-Frequenz (13,56 MHz) auf dem Netzwerkanalysator so nah
wie möglich bei 1 landet. Dies stellt den angestrebten Wellenwiderstand von 50 Ω dar. Dann ist die
Antenne bestmöglich abgeglichen. In der Abbildung 10 ist das Bild des Netzwerkanalysators der
abgeglichenen Antennen von 13 bis 14 MHz zu erkennen. Dies wurde bei diesen Antennen, wie in
Abbildung 9 zu erkennen, mit den Kapazitäten C1/1(J1) und C1/2(J2) von 16,9 pF und C2(J3) von 60
pF erreicht.

 Abbildung 9: Abgleichplatine C1/1=J1=C1/2=J2=16,9pF; C2=J3=60pF

 Abbildung 10: Netzwerkanalysatorbild der abgeglichenen Antennen

Es gilt zu beachten: die Antenne ist nach der Messung nur für den Ort der Messung abgeglichen. Bei
Bewegung bzw. Umlegen der Antenne muss dieser Vorgang erneut durchgeführt werden, z.B. beim
Aufbau an einem Veranstaltungsort.

3.3 Testen von Antennen
Es wurden mehrere Antennen zusammen getestet, um diese vergleichen zu können. Um die
Antennen testen zu können, wurden diese an das vorhandene HF-System angeschlossen. Das
Antennenkabel kann am Reader durch Öffnen der Abdeckplatte an der dafür vorgesehenen
Verschraubung angeschlossen werden. Bei den Tests wurden zwei verschiedene Transponder, wie
bei einem Schwimmwettkampf auch zu erwarten ist, flach zu der Antenne gehalten. Auch diese
Transponder haben einen großen Einfluss auf die Empfangseigenschaften der Antennen. Um gleiche
Bedingungen für alle Antennen zu schaffen, wurden diese liegend auf dem Stuhl getestet. Ab welcher
 7
Entfernung die RFID-Tags von der Antenne erkannt werden, ist in der Tabelle 1 zu finden. Für einen
Schwimmwettkampf sind die Entfernungen nach vorne, ab denen die Tags von der Antenne erkannt
wurden, die wichtigsten.

 Antenne 1 2 3 4
 ungefähre Größe in cm 68*30 68*30, 150*30 125*30
 doppelt gelegt
 Durchmesser mm 22 12 18 22
Transponder nach vorne in cm 35 30 22 15
blau/rot
 zur Seite in cm 10 12 10 5
Transponder nach vorne in cm 45 50 50 45
schwarz
 zur Seite in cm 25 27 25 20
 Tabelle 1: Antennentests HF

Bei der Erfassung von schnell bewegten Transpondern gab es zwischen den Antennen keinen
erkennbaren Unterschied.

 Abbildung 11: Antenne 1

Die Antenne 1 (Abbildung 11) ist ungefähr die in dem Abschnitt 3.1 erstellte Antenne in der Länge
halbiert. Die Empfangseigenschaften haben sich dadurch etwas verbessert.

 8
Abbildung 12: Antenne 2

Die Antenne 2 (Abbildung 12) hat die gleiche Größe wie die Antenne 1, wurde aber doppelt gelegt
und hat einen kleineren Rohrdurchmesser. Dadurch haben sich die Empfangseigenschaften bei den
schwarzen Transpondern geringfügig verbessert und die der blau/roten Transponder blieben
ungefähr gleich.

 Abbildung 13: Antenne 3

Die Antenne 3 (Abbildung 13) ist deutlich länger als die vorherigen beiden Antennen. Dadurch haben
sich die Empfangseigenschaften verschlechtert.

 Abbildung 14: Antenne 4
 9
Die Antenne 4 (Abbildung 14) ist die Antenne, die in Abschnitt 3.1 konstruiert und in Abschnitt 3.2
abgeglichen wurde. Diese Antenne hat im Vergleich mit den anderen Antennen am schlechtesten
abgeschnitten.

Zusammenfassend kann nach Beobachtung festgestellt werden, dass eine Verkleinerung der
Antennen und auch mehr Windungen die Empfangseigenschaften der HF-Antennen verbessern.
Außerdem kann festgestellt werden, dass unterschiedliche Transponder einen deutlichen Einfluss auf
die Empfangseigenschaften der Antennen haben.

Für einen Schwimmwettkampf müssen die neu gebauten Antennen die Transponder schnell und bei
einem Mindestabstand von 30 cm nach vorne erfassen. Jedoch ist es nach den selbst durchgeführten
Tests fraglich, ob die neu konstruierten Antennen eine wesentliche Verbesserung für das System
darstellen würden. Da diese kleiner sind müssen mehr Antennen auf der gleichen Fläche verbaut
werden, damit diese komplett für die Aufnahme von Transpondern genutzt werden können. Aber da
nur eine Antenne an den HF-Reader angeschlossen werden kann, müssen bei mehr als einer Antenne
Powersplitter oder ähnliches dazwischen verbaut werden. Dadurch ist aber eine Verschlechterung
der Empfangseigenschaften der Antennen zu erwarten.

 10
4 Aufbau des Laptops
Auf dem Desktop des eingerichteten Laptops sind alle notwendigen Ordner und Programme für die
Sportveranstaltungen zu finden. In der Abbildung 15 wird dieser dargestellt.

 Software
 Moderatorenkit

 Lauf- Schwimm-

 veranstaltung veranstaltung

 Abbildung 15: Laptopdesktop

Für den SSH-Tunnel müssen die Programme Open-SSH, cygwin und Deltacopy installiert werden. Dies
wird in Abschnitt 5.2 erklärt.

Die Datenbank benötigt die Programme MySQL, Python und Notepad++ (oder PyCharm) aus
Abschnitt 6.2.

Außerdem muss auch noch Software für das Moderatoren-Kit installiert werden. Diese wird in einem
Vorgängerprojekt einer Projektgruppe [1] weiter erläutert.

ISOStart ist die Feig Reader Software, die zur Kommunikation des Laptops mit den Readern der Firma
Feig dient. Dieses Programm kann von dem Downloadbereich der Website der Firma [7]
heruntergeladen werden und kann unter anderem dafür genutzt werden, verschiedene Parameter
der Reader der Firma Feig einzustellen oder Tags einzeln einzulesen.

 11
5 SSH-Tunnel
Damit der Laptop mit dem Raspberry Pi kommunizieren kann und die benötigte tag.txt (time.txt)-
Datei übertragen werden kann, wird ein SSH-Tunnel mit RSync benötigt. Dieser ist somit, wie in der
Abbildung 16 zu sehen, das Verbindungsstück zwischen dem Laptop und dem Raspberry Pi.
Aufbauend auf den Arbeiten von Herrn Troff [5] und der Projektgruppe [1] wurde der SSH-Tunnel
und RSync eingerichtet.

 Abbildung 16: Systemaufbau SSH-Tunnel

5.1 Allgemeine Informationen
Mithilfe eines SSH-Tunnels können sicher (verschlüsselte) Shell-Kommandos übertragen werden.
Diesen Tunnel verwendet RSync zum Datenaustausch. Dabei ist der Raspberry Pi der Server und der
Laptop der Client, der Dateien vom Server kopiert. Diese Verbindung ist in der Abbildung 17 zu
sehen.

 Raspberry Pi Laptop
 - OpenSSH Server WLAN - OpenSSH Client
 - zu kopierende Dateien - RSync

 Abbildung 17: Verbindungsstruktur

Damit eine SSH-Verbindung aufgebaut werden kann, muss sich der Client beim Server
authentifizieren. Hierfür kann das Benutzerpasswort des Servers genutzt werden. Dies ist aber für
eine Verbindung, die öfter nacheinander wieder aufgebaut wird, nicht sinnvoll. Deswegen wird hier
die Public-Key-Authentication genutzt, die ein Schlüsselpaar zur Authentifizierung nutzt. Dieses
Schlüsselpaar wird vom Client erstellt und enthält einen öffentlichen und einen privaten Schlüssel.
Der öffentliche Schlüssel dient der Erkennung einer geplanten Verbindung und wird dafür auf den
Server übertragen. Dieses ist auch in Abbildung 18 zu erkennen.

 12
Abbildung 18: Schlüssel erstellen und übertragen

Der vereinfachte SSH-Verbindungsaufbau mit der Public-Key-Authentication ist Schritt für Schritt in
der Abbildung 19 zu finden. Hier wird zu Beginn ein Handshake durchgeführt. Daraufhin wird der
Server beim Client authentifiziert und zum Schluss wird der Client beim Server authentifiziert.
Danach startet die Hauptverbindung zwischen Client und Server. [8]

 Abbildung 19: vereinfachte Funktionsweise SSH [9]
 13
5.2 Installationen
Für die Kommunikation des Laptops mit dem Raspberry Pi müssen die Programme Open-SSH, cygwin
und Deltacopy installiert werden.

Zuerst muss auf dem Laptop das OpenSSH-Paket für Windows als ZIP-Archiv heruntergeladen und
dieses dann im Verzeichnis C:/Program files entpackt werden. Dann wird in einer Powershell mit
Administratorrechten das OpenSSH-Verzeichnis geöffnet und danach das Installationsskript
ausgeführt, welches die SSH-Dienste sshd und ssh-agent einrichtet.

Da SSH eigentlich für UNIX-Systeme entwickelt wurde, muss danach noch cygwin installiert werden.
Dafür wird die Setup-Datei heruntergeladen und danach ausgeführt.

Weiterhin wird noch Deltacopy benötigt. Dafür wird das ZIP-Verzeichnis heruntergeladen und dieses
unter C: entpackt. In diesem Verzeichnis befinden sich RSync und cygwin-DLLs. Diese müssen dann
noch, wie im Abschnitt 5.6.3 zu finden, als Programm dem PC bekannt machen [5].

5.3 Public-Key-Authentication einrichten
Zuerst müssen die SSH-Konfiguratonsdateien („sshd_config“) der beiden Geräte angepasst werden,
indem folgende Zeilen einkommentiert werden und wie folgt angepasst werden:

 - PublicKeyAuthentication yes
 - PasswordAuthentication no

Um den öffentlichen und privaten Schlüssel zu erzeugen, wird das Programm ssh-keygen ausgeführt.
Dabei müssen alle Fragen mit einem Enter bestätigt werden. Das Programm erstellt dann den Ordner
.ssh im Benutzerverzeichnis, das die beiden Schlüssel enthält. Die beiden Schlüssel (id_rsa,
id_rsa.pub) müssen auf den Raspberry Pi (Server) übertragen werden und der publicKey muss in der
Datei authorized_keys im .ssh-Ordner abgespeichert werden. Dafür sollten folgende Befehle in das
Terminal des Raspberry Pis eingegeben werden.

$ cd /home/pi/.ssh
$ touch authorized_keys
$ cat id_rsa.pub >> authorized_keys

Mit Hilfe des ersten Befehls wird in den Ordner .ssh gewechselt, in dem die Keys vom PC übertragen
wurden. Danach wird mit dem zweiten Befehl die Datei authorized_keys erstellt und dann wird der
publicKey mit dem letzten Befehl in die Datei authorized_keys übertragen.

Außerdem müssen die SSH-Dienste mit Net start sshd und Net start ssh-agent gestartet werden.
[1][8][10]

PS C:\WINDOWS\system32> Net start sshd
OpenSSH SSH Server wird gestartet.
OpenSSH SSH Server wurde erfolgreich gestartet.
PS C:\WINDOWS\system32> Net start ssh-agent
OpenSSH Authentication Agent wird gestartet.
OpenSSH Authentication Agent wurde erfolgreich gestartet.

 14
5.4 RSync Test
Um die Verbindung testen zu können oder um manuell eine Datei oder einen Ordner übertragen zu
können, kann der folgende Befehl in die PowerShell im Ordner C:/Deltacopy (cd C:/Deltacopy)
eingegeben werden. Diese Oberfläche zur Eingabe von Windows-Steuerungs-Befehlen lässt sich
durch Rechtsklick auf das Windows-Symbol öffnen.

PS C:\DeltaCopy> rsync -vrb -e "ssh -i C:\Users\RFID\.ssh\id_rsa -o PasswordAuthentication=no"
pi@192.168.1.1:/media ./

Dies ist ein Befehl zum RSync-Aufruf, was an dem Wort am Anfang zu erkennen ist. Danach sind die
Optionen des Befehls zu finden (v-ausführliche Ausgabe, r-Unterverzeichnisse mit synchronisieren, b-
Backup). Dann wird der Ort des Keys angegeben und die Authentifizierung per Passwort
ausgeschaltet für die SSH-Verbindung. Am Ende werden der Benutzer, die IP-Adresse des Raspberry
und der Pfad des zu synchronisierenden Verzeichnisses angegeben. [8]

5.5 RSync automatisieren
Um mit RSync nahezu dauerhaft die notwendige Datei vom Raspberry Pi auf den Laptop zu kopieren,
wurde eine Batch-Datei erstellt:

 Listing 1: Sync.bat

In dieser Datei sind genau die Befehle zu finden, die einzeln vorher in die PowerShell eingegeben
werden mussten (vgl. Abschnitt 5.4). Zuerst wird in den DeltaCopy Ordner gewechselt und dort wird
dann der RSync-Befehl ausgeführt. Damit werden alle Dateien und Ordner aus dem media Ordner
und den Unterordnern des Raspberry Pi in den Deltacopy Ordner kopiert. Diese Batch-Datei wird
immer wieder vom Python-Programm tag-listener.py aufgerufen, wie in Abschnitt 6.4.2 zu erkennen
ist. [1]

5.6 Probleme
Bei dem Einrichten des SSH-Tunnels und RSync sind verschiedene Probleme aufgetreten. Diese sind
mit Lösungsvorschlägen im Folgenden zu finden.

5.6.1 Windows-Kontoname
Wenn ein PC mit einem SSH-Tunnel mit einem Anderen verbunden werden soll, dann sollte der
Windows-Kontoname keine Leerzeichen beinhalten. Außerdem sollte auch auf jegliche
Sonderzeichen und Ähnliches verzichtet werden. Wenn dies nicht beachtet wird, gibt es Probleme
mit den Befehlen. Deswegen wurde ein neuer Benutzer ohne Leerzeichen angelegt.

5.6.2 Dienst starten
Wenn sich ein Dienst nicht mit der Powershell und dem Befehl Net start … starten lässt, dann kann
dieser manuell gestartet werden. Dafür wird in der Computerverwaltung den Reiter Dienste und
Anwendungen ausgewählt. Dort werden die Dienste, wie in der Abbildung 20 zu erkennen, geöffnet
und dort kann dann der jeweilige Dienst mithilfe eines Doppelklicks ausgewählt werden.

 15
Abbildung 20: Dienste

Dann kann, wie in der Abbildung 21 zu sehen, der Dienst konfiguriert und der Dienst automatisch
gestartet, manuell gestartet oder deaktiviert werden. Außerdem kann der Dienst mit Hilfe der
Schaltflächen manuell gestartet, beendet, angehalten oder fortgesetzt werden.

 Abbildung 21: Konfiguration Dienst ssh-agent

 16
Der Dienstname kann von dem Anzeigename des Dienstes in der Liste der Dienste abweichen, wie
zum Beispiel auch bei dem Dienst ssh-agent.

5.6.3 Programmpfad bekannt machen
Es sollte dem PC bekannt gemacht werden, wo er neu installierte Programme, wie zum Beispiel
RSync, finden kann. Sonst muss der Pfad beim Befehlsaufruf mit angegeben werden, was zu
Problemen führen kann. Deswegen ist es besser die Umgebungsvariable PATH dafür zu nutzen. Dort
sind die Verzeichnisse gespeichert, in denen nach Befehlen gesucht werden soll. Um ein neues
Verzeichnis darin abzuspeichern, muss in der Systemsteuerung auf den Reiter System ausgewählt
werden. Danach sind die Umgebungsvariablen unter den Tabreiter Erweitert (Erweiterte
Systemeinstellungen) und dem Button Umgebungsvariablen zu finden, die in der Abbildung 22 zu
sehen sind.

 Abbildung 22: Erweiterte Systemeinstellungen

Dort sind die Umgebungsvariablen getrennt nach Benutzervariablen und Systemvariablen zu finden.
Unter Systemvariablen, die in der Abbildung 23 zu sehen sind, wird dann der Pfad zum RSync-
Programm hinzugefügt, indem der Reiter PATH markiert und Bearbeiten ausgewählt wird.

 17
Abbildung 23: Systemvariablen

Dann sollte das Programm RSync ohne Probleme auf dem PC gefunden werden. [11]

5.6.4 Berechtigungen .ssh-Ordner
Um die Berechtigungen eines Verzeichnisses/einer Verzeichnisstruktur auf dem Raspberry Pi
einzusehen, muss zuerst zum root user gewechselt werden. Der root user wird benötigt, damit der
Benutzer fast alle Rechte auf dem Raspberry Pi hat, da dies für den Standardnutzer pi nicht der Fall
ist. Dafür wird der Befehl sudo su in das Terminal eingegeben. Mit dem change owner Befehl (chown)
kann der Besitzer einer Datei oder einer Gruppe geändert werden. Hier wird mit dem Befehl chown
pi:pi .ssh/ -R der Besitzer und die Gruppe des .ssh-Ordners und seinen Unterordnern inklusive der
Dateien auf pi geändert. Das war notwendig, da sonst der Ordner nicht die nötigen Berechtigungen
hatte und ssh nicht funktioniert. Um die Verzeichnisstruktur und die Berechtigungen des .ssh-
Ordners anzeigen zu lassen, muss dann der Befehl ls -la .ssh/ in das Terminal eingegeben werden.
Dabei kann beispielsweise folgende Ausgabe ausgegeben werden:

drw------- 2 pi pi 4096 Jun 12 23:35 .
drwxr-xr-x 27 pi pi 4096 Jun 13 00:40 ..
-rw------- 1 pi pi 575 Jun 12 23:35 authorized_keys
-rw------- 1 pi pi 2610 Mr 3 2020 id_rsa
-rw------- 1 pi pi 575 Mr 3 2020 id_rsa.pub

Mit dem exit-Befehl kann wieder zum normalen Nutzer gewechselt werden. [12]

5.6.5 Alternative Übertragung des publickeys
Der publicKey kann auch anders übertragen werden und zwar über die PowerShell. Dafür sollte
zuerst in die SSH-Konfigurationsdateien (sshd_config) der Punkt PasswordAuthentication auf yes
geändert werden. Dann wird das Schlüsselpaar erstellt mit dem ersten Befehl ssh-keygen.exe. Mit
dem Befehl danach wird eine SSH-Verbindung mit dem Raspberry Pi hergestellt. Dieser fragt dann
nach einem Passwort für den Raspberry Pi, welches dem allgemeinen Passwort für den Raspberry Pi
entspricht. Damit ist der Benutzer auf dem Raspberry Pi angemeldet und kann somit Befehle in die
PowerShell des Laptops eingeben und den Raspberry Pi damit steuern. Dann wurde der publicKey auf
den Raspberry Pi in die Datei authorized_keys im Ordner .ssh übertragen. Danach meldet sich der
Benutzer wieder mit exit oder der Tastenkombination Strg+D vom Raspberry Pi ab.

 18
PS C:\DeltaCopy> ssh-keygen.exe
PS C:\DeltaCopy> ssh -i 'C:\Users\RFID\.ssh\id_rsa' pi@192.168.0.1
pi@192.168.0.1's password:
pi@raspberrypi:~ $ nano id_rsa.pub
pi@raspberrypi:~ $ pi@raspberrypi:~ $ cat id_rsa.pub
ssh-rsa
…
pi@raspberrypi:~ $ cat id_rsa.pub > .ssh/authorized_keys
pi@raspberrypi:~ $ Abgemeldet
Connection to 192.168.0.1 closed.

5.6.6 WLAN des Raspberry Pis
Um die Konfiguration der verfügbaren WLANs einsehen zu können, muss ifconfig in das Raspberry Pi
Terminal eingegeben werden. Daraufhin werden die WLAN-Einstellungen mit Konfigurationen wie
zum Beispiel der IP-Adresse ausgegeben.

Wenn das Passwort vom integrierten WLAN des Raspberry Pis vergessen wurde oder jemand anderes
den Raspberry Pi eingerichtet hat, dann kann dieser in der Datei wpa_supplicant.conf im Ordner
/etc/wpa_supplicant gefunden werden. Diese Datei kann mithilfe des Befehls sudo nano
/etc/wpa_supplicant/wpa_supplicant.conf mit dem Terminal geöffnet werden. Dort kann dann das
Passwort eingesehen und verändert werden. [13]

5.6.7 SSH debuggen
Um Probleme bei der SSH-Verbindung zu finden und Fehlermeldungen dafür ausgegeben zu
bekommen, sollte die SSH-Verbindung gedebuggt werden. Dafür muss in den SSH-Befehl beim Client
ein –v für das erste Level des verbosity Modus, -vv für das zweite Level und –vvv für das dritte Level
angefügt werden. Desto höher das Level des verbosity Modus ist, desto mehr Ausgaben sind zu
erkennen. Um die SSH-Verbindung bei diesem System im ersten Level des verbosity Modus zu testen,
wurde folgender Befehl in die als Administrator ausgeführte PowerShell eingegeben [14]:

ssh -v pi@192.168.0.1

Im Folgenden ist ein Ausschnitt von der Ausgabe zu finden.

debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:J9iRJYE6iiXl0HYMI0zTtozeAUJnwY1cZKw+50G0ArE
C:\\Users\\Digitaltechnik E14/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: C:\\Users\\Digitaltechnik E14/.ssh/id_dsa
debug1: Trying private key: C:\\Users\\Digitaltechnik E14/.ssh/id_ecdsa
debug1: Trying private key: C:\\Users\\Digitaltechnik E14/.ssh/id_ed25519
debug1: Trying private key: C:\\Users\\Digitaltechnik E14/.ssh/id_xmss
debug1: Next authentication method: password
debug1: read_passphrase: can't open /dev/tty: No such file or directory
pi@192.168.0.1's password:
debug1: Authentication succeeded (password).
Authenticated to 192.168.0.1 ([192.168.0.1]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
 19
debug1: pledge: network
debug1: console supports the ansi parsing
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0

Hier kam es zu Problemen, da bei fehlender Pfadangabe zum publicKey, dieser im Default Verzeichnis
gesucht wird. Dieses stimmt aber nicht mit dem passenden Key überein, der auf den Raspberry Pi
übertragen wurde. Deswegen springt SSH in die Password Authentication. Mit dem Befehl exit wird
die SSH-Verbindung wieder getrennt.

Um den hier benutzten SSH-RSync-Befehl, der in Abschnitt 5.4 zu finden ist, im dritten Level des
verbosity Modus zu debuggen, muss folgender Befehl eingegeben werden:

rsync -vrb -e "ssh -vvv -i C:\Users\RFID\.ssh\id_rsa -o PasswordAuthentication=no"
pi@192.168.0.1:/media ./

Die Ausgaben der verschiedenen Level des verbosity Modus sind an den Anfängen der Zeilen (debug1
gehört zu Level 1, etc.) zu erkennen.

Da hier auch direkt der Pfad zu dem Key angegeben wurde, wird er hier auch gefunden. Dies ist an
dem Ausschnitt der Ausgabe zu erkennen:

debug1: Authentications that can continue: publickey,password
debug3: start over, passed a different list publickey,password
debug3: preferred publickey,keyboard-interactive
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering public key: C:\\Users\\RFID\\.ssh\\id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp de:26:85:3b:45:22:9b:df:1c:ce:15:48:e6:9e:84:b0
debug3: sign_and_send_pubkey
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).

 20
6 Datenbank
Um die gesamten Sportlerdaten speichern zu können und auch die Transponderzeiten den jeweiligen
Sportlern zuordnen zu können, wird eine Datenbank benötigt. In dieser werden alle Daten mit dem
Programm MySQL verwaltet. Damit die Daten in die Datenbank geschrieben und gelesen werden
können, sind Python-Programme erstellt worden. Diese Programme und die Datenbank sind in der
Abbildung 24 zu finden. Die Datenbank wurde aufbauend auf ein Vorgängerprojekt [3] entwickelt.

 Abbildung 24: Systemaufbau Datenbank und Python-Code

6.1 Grundlagen
Ein Datenbanksystem besteht aus einem Datenbankmanagementsystem und Datenbanken.

Ein Datenbankmanagementsystem (DBMS) dient zur Erstellung, Verwaltung und den Zugriff auf
Datenbanken. Es gibt zwei Arten von Datenbankmanagementsystemen, das Fileserver-System und
das Client-Server-System. Bei dem Fileserver-System liegen die Datenbanken an zentraler Stelle und
das Datenbankmanagementsystem auf dem Client. Ein Nachteil von diesem System ist es, dass es bei
 21
Abfragen unter Umständen zu einer hohen Netzbelastung durch Übertragung einer großen Menge an
Daten zum Datenbankmanagementsystem kommen kann. Deshalb kommt dieses System nur bei
kleinen Anwendungen in Frage. Dahingegen ist das Client-Server-System so aufgebaut, dass sich die
Datenbanken und das Datenbankmanagementsystem, also das komplette Datenbanksystem, auf
einem Server befinden. Daher werden Abfragen von Nutzern an zentraler Stelle ausgewertet und nur
das Ergebnis wird durch das Netzwerk übertragen. Dies ist entwickelt worden für sehr große
Datenbanken mit hoher Benutzeranzahl. MySQL ist auch ein Client-Server-System.

Eine Datenbank ist eine strukturierte Sammlung von Daten, die in einem sachlogischen
Zusammenhang stehen. Für die Datenstrukturierung und –anordnung gibt es verschiedene
Möglichkeiten. Eine große Bedeutung dabei haben die relationalen Datenbanken, bei denen Tabellen
die Grundlage bilden. Ein Ausschnitt aus so einer Datenbank ist in Abbildung 25 zu sehen.

 Tabelle (Relation) Datenfeld Schlüssel

 Attribute

 Datensatz
 (Tupel)

 Abbildung 25: Ausschnitt Datenbanktabelle

Eine relationale Datenbank besteht aus mindestens einer, meistens mehreren Tabellen (Relationen).
Eine Zeile der Tabelle wird als Datensatz (Tupel) bezeichnet, der wiederum aus mehreren Datenfelder
besteht. Gleichartige Datenfelder sind spaltenweise angeordnet und werden Attribute genannt. Ein
wichtiger Bestandteil einer Datenbank ist mindestens ein Schlüssel, damit jeder Datensatz eindeutig
identifizierbar ist. Bei dieser Tabelle ist die TransponderID1 der Schlüssel, mit dessen Hilfe einzelne
Zeiten den Sportlern zugeordnet werden können. Außerdem können mit Schlüsseln Tabellen
verknüpft werden. [15]

6.2 Installationen
Im Folgenden sind die Anleitungen zur Installation der Programme MySQL und Python zu finden.

6.2.1 MySQL
Für die Installation von MySQL muss der MySQL Installer heruntergeladen werden und dann
gestartet werden. Dort muss dann, wie in der Abbildung 26 zu sehen, der Installationstyp Full
ausgewählt werden.

 22
Abbildung 26: Installationstyp Full

Außerdem müssen noch das Passwort angegeben und ein User erstellt werden. Diese Daten sollten
unbedingt notiert werden, da diese immer wieder benötigen werden.

6.2.2 Python
Zum Programmieren mit der Programmiersprache Python muss diese heruntergeladen werden. Bei
diesem Laptop haben wurde die Version 3.7 gewählt, da die neueste Version mit MySQL zum
Zeitpunkt der Installation noch nicht kompatibel war. Das ist an dem nicht vorhandenen Python
Connector für die Version 3.8 zu erkennen. Zum Programmieren bietet es sich an, eine Oberfläche
wie zum Beispiel PyCharm oder Notepad++ zu installieren.

6.3 Einrichtung
Für die Python-Programme werden verschiedene Bibliotheken benötigt. Diese können einfach in der
Powershell, die als Administrator ausgeführt werden sollte, mit dem Befehl pip install Bibliothek
heruntergeladen werden. Um alle Bibliotheken für die hier nötigen Programme zu installieren,
müssen folgende Befehle in die Powershell eingegeben werden:

pip install pandas==0.24.1
pip install sqlalchemy
pip install mysql-connector-python

Die oberste Bibliothek pandas dient zur Daten-Manipulation und –Analyse. In diesem Projekt dient
sie zum Umgang mit numerischen Tabellen. Die Erklärung, warum eine Bibliotheksversion angegeben
werden muss, ist in Abschnitt 6.9.4 zu finden. [16]
 23
Mit der Bibliothek sqlalchemy kann ein Python Programm mit einer SQL-Datenbanken verbunden
werden und mit diesen arbeiten. [17]

Damit MySQL und Python miteinander kommunizieren können, ist der sog. mysql-connector-python
Treiber notwendig. Dieser dient mit seiner API als Schnittstelle zwischen Python-Programmen und
der eigentlichen MySQL Datenbank.

Um MySQL einzurichten, sollte als erstes die MySQL Workbench gestartet werden. Dann ist auf dem
Bildschirm das Gleiche zu erkennen wie in Abbildung 27. Dort wird die MySQL Connection
ausgewählt, die für die Datenbank genutzt werden soll und dann wird das Passwort eingegeben.

 Abbildung 27: Verbindung herstellen

Danach muss der Reiter Schemas auf der linken Seite von Abbildung 28 ausgewählt werden. Dort
wird mit einem Rechtsklick und Create Schema das Schema spendenlauf erstellt.

 24
Abbildung 28: Schema

Damit sind alle Konfigurationen abgeschlossen.

6.4 Python-Code
Im Folgenden sind die nötigen Programme für die Kommunikation mit der Datenbank beschrieben.

Bei einer Laufveranstaltung gibt es mehrere einzelne Rennen. Alle Sportler eines Rennens sind zur
selben Zeit auf der Strecke.

6.4.1 importer.py
Mithilfe des Importers wird eine Meldedatei, die vom Programm EasyWK erstellt wird, in die
Datenbank importiert.

 Listing 2: Funktion main

 25
Beim Start des Programmes wird zuerst die main-Funktion aufgerufen, die im Listing 2 dargestellt ist.
Am Anfang dieser Funktion ist eine Ausgabe zu finden, die kurz erklärt, wie das Programm arbeitet.
Danach werden für die PowerShell nützliche Kommandozeilenparameter erstellt, die den Benutzer
unterstützen sollen. Zum Beispiel eine Hilfenachricht mit dem Befehl python importer.py –h
angezeigt werden:

Spendenlauf CSV to SQL Importer
usage: importer.py [-h] filename
Export input csv nef file to database
positional arguments:
 filename filename to csv data to import into database
optional arguments:
 -h, --help show this help message and exit

Dann wird die Funktion importerCSVFromFile aufgerufen mit dem übergebenen Dateinamen und der
Rückgabewert der Funktion wird danach an die Funktion exportToDB übergeben.

 Listing 3: Funktion importCSVFromFile

Die Funktion importCSVFromFile, die im Listing 3 zu sehen ist, bekommt von der main den Dateipfad
von der zu importierenden csv-Datei übergeben. Daraufhin gibt sie die csv-Datei als Dataframe, mit
dem das Programm weiter arbeiten kann, wieder zurück an die main.

 Listing 4: Funktion exportToDB Teil 1

Die Funktion exportToDB, die im Listing 4 zu sehen ist, bekommt das Dataframe der csv-Datei von der
main. Ein Dataframe ist vergleichbar mit einer Tabelle, die Zeilen und Spalten beinhaltet, ähnlich wie
Excel-Tabellen. Zuerst wird eine Verbindung zur Datenbank aufgebaut und danach die Nachricht
„VerbindungzurDatenbankerfolgt“ herausgegeben. Wenn die Datenbank noch nicht existiert, dann
wird diese erstellt und wenn die Tabelle daten der Datenbank vorhanden ist, wird sie gelöscht. Dann
wird das Dataframe in die Tabelle daten der Datenbank umgewandelt und noch der Datentyp
einzelner Zeilen angepasst, damit diese nachher richtig beschrieben werden können.

 26
Listing 5: Funktion exportToDB Teil 2

Als letztes werden noch die Views erstellt, die im Listing 5 gezeigt werden. Diese dienen
hauptsächlich der Weiterverarbeitung der Daten in dem Moderatoren-Kit beziehungsweise dem
Display, welches in der Projektarbeit der Projektgruppe [1] erläutert wird.

6.4.2 tag-listener.py
Dieses Programm dient zum Import von Zeiten von Sportlern bei einer Laufveranstaltung. Dabei
erkennt das Programm eine Erweiterung einer Datei mit Sportlerzeiten und fügt diese dann in die
Datenbank ein. Dieses Programm läuft dauerhaft bei der Veranstaltung und neue Zeiten werden bis
auf kleinere Verzögerungen durch Software, wie beispielsweise dem SSH-Tunnel, an das System
weitergegeben.

 Listing 6: Funktion main

Hier wird am Anfang die main-Funktion (Listing 6) aufgerufen. Zuerst wird die Variable rennen als
global gekennzeichnet. Danach wird auch hier kurz ausgegeben, was das Programm machen soll.
Hierbei werden für die PowerShell nützliche Kommandozeilenparameter erstellt, die den Benutzern
beim Benutzen des Programms helfen sollen. Dann wird die übergebene Rennenzahl in eine Variable

 27
geschrieben wenn diese vorhanden ist und sonst wird die Rennenzahl auf 1 gesetzt. Diese wird dann
ausgegeben und die Funktion tail, die im Listing 7 zu finden ist, mit dem Dateipfad zur Tag-Zeiten-
Datei aufgerufen.

 Listing 7: Funktion tail

Zuerst wird die batch-Datei sync.bat aufgerufen, die die RSync-Befehle ausführt. Diese ist im
Abschnitt 5.5 zu finden. Danach wird die Tag-Zeiten-Datei, wie zum Beispiel in der Abbildung 29 zu
sehen, mit Hilfe des übergebenen Dateipfades zum Lesen geöffnet.

 Abbildung 29: Tag-Zeiten-Datei

Danach wird der Cursor ans Ende der Datei positioniert. Dies verhindert ein Einlesen der
Überschriften der Datei und alter Zeilen. Als Nächstes wird die Cursorposition gespeichert und eine
Dauerschleife beginnt, in der zuerst die Zeile eingelesen wird. Wenn eine neue Zeile eingefügt wurde,
 28
wird die Cursorposition und die Zeile ausgegeben. Es wird die Zeile an den Semikolons zerteilt und
wenn die Zeile richtig erstellt wurde, wird die neue Cursorposition eingelesen und die Funktion
update_table aufgerufen. Danach wird wieder eine Zeile eingelesen. Wenn keine neue Zeile angefügt
wurde, wird die Datei geschlossen. Daraufhin wird RSync aufgerufen, die Datei wieder zum Lesen
geöffnet und der Cursor positioniert auf den Punkt einer möglichen neuen Zeile.

 Listing 8: Funktion update_table Teil 1

Am Anfang der Funktion aus Listing 8 wird eine Verbindung zur Datenbank hergestellt. Danach
werden die Zeiten der Datenbanktabelle herausgesucht, bei dem das richtige Rennen und die richtige
Tag-ID angegeben sind. Diese werden dann in ein Dataframe geschrieben und danach wird überprüft,
ob etwas in das Dataframe geschrieben wurde. Wenn dies nicht passiert ist, wird eine Warnung
herausgegeben. Danach werden nach und nach die Stellen des Dataframes darauf überprüft, ob
diese ohne Inhalt sind. Wenn ein leeres Feld gefunden wurde, dann wird dies ausgegeben. Dann wird
an diese Stelle in der Datenbanktabelle die Zeit geschrieben und ausgegeben, dass das Schreiben
erfolgreich war. Dieses ist für die weiteren Zeiten 1 bis 8 am Beispiel der ersten beiden Zeiten in den
Listing 9 und Listing 10 zu finden.

 29
Listing 9: Funktion update_table Teil 2

 Listing 10: Funktion update_table Teil 3

Wenn alle Zeiten beschrieben wurden, dann wird eine Warnung herausgegeben.

6.4.3 exporter.py
Nach den Wettkämpfen können mit Hilfe dieses Programmes alle Sportlerdaten in eine csv-Datei
exportiert werden, die dann von EasyWK weiter genutzt werden können.

 Listing 11: Funktion main

Bei diesem Programm wird auch am Anfang die main aufgerufen, die im Listing 11 zu erkennen ist.
Zuerst wird in dieser Funktion die Variable rennen als global gekennzeichnet, somit kann in der
Funktion auf die Variable zugegriffen werden. Danach wird kurz ausgegeben, was das Programm
machen soll. Hierbei werden auch für die PowerShell nützliche Kommandozeilenparameter erstellt,

 30
die die Benutzer beim Verwenden des Programms unterstützen sollen. Dann wird die übergebene
Rennenzahl übergeben, wenn sie vorhanden ist und sonst wird die Rennenzahl auf 1 gesetzt. Danach
wird die Zahl ausgegeben und die Funktion ExportDBTOCSVFile aufgerufen.

 Listing 12: Funktion ExportDBToCSVFile Teil 1

Bei dieser Funktion wird wieder als Erstes, wie im Listing 12 zu sehen, eine Verbindung zur
Datenbank hergestellt. Da die Spaltennamen der Datenbank und die Anzahl der Spalten nicht mit den
Benötigten für die csv-Datei übereinstimmen, müssen diese dann noch angepasst werden. Zum
Beispiel wird die Spalte Wk in Wettkampfnummer umbenannt und die Spalte ZE wird neu eingefügt.

 Listing 13: Funktion ExportDBToCSVFile Teil 2

 31
Wie im Listing 13 zu erkennen ist, werden danach die Daten aus SQL in ein Dataframe geschrieben.
Dort werden noch die Zeiten verarbeitet, damit diese am Ende richtig in die csv-Datei geschrieben
werden können. Vor der Konvertierung hat die Variable den Datentyp timedelta64[ns] und wird im
Format 0 days 00:00:00.000000000 ausgegeben. Für die Komptabilität mit EasyWK muss die Zeit
jedoch im Format 00:00:00,00 vorhanden sein, wofür die Konvertierung in einen anderen Datentyp,
hier datetime64[ns], notwendig ist.

Am Ende wird das veränderte Dataframe in eine csv-Datei übertragen.

6.5 Programme testen
Um ein Python Programm auszuführen, muss in die PowerShell ein Befehl eingegeben werden. Am
Anfang des Befehls ist das Stichwort python zu finden. Danach sind der jeweilige Programmname und
ggf. Optionen anzugeben.

Möglichkeiten, um die Funktionalität der einzelnen Python-Programme zu testen und zu überprüfen,
sind im Folgenden zu finden.

6.5.1 Importer Test
Um dieses Programm zu starten, muss zuerst die PowerShell als Administrator ausgeführt werden.
Danach wird mit dem Befehl cd C:\Users\RFID\Desktop\python in den Ordner gewechselt, wo die
Programme zu finden sind. Dann wird mit dem folgenden Befehl das Importer-Programm ausgeführt:

python importer.py C:\Users\RFID\Desktop\python\Meldeergebnis4SQL_Export.csv

Am Ende des Befehls ist der Pfad zur importierenden Meldedatei angegeben. Diese sieht zum
Beispiel wie folgt aus:

 Abbildung 30: Meldeergebnis4SQL_Export.csv

Hierbei gibt die Spalte K (Rennen) an, um welchen Lauf es sich handelt. Von diesem Programm
werden die Views und die Tabelle erstellt, die in der Abbildung 31 zu sehen sind.

 32
Abbildung 31: Tabelle und Views

Um zu überprüfen, ob die Tabelle richtig und vollständig angelegt wurde, sollte die in der Abbildung
32 markierten Schaltfläche ausgewählt werden.

 Abbildung 32: Aufruf der Tabelle

Danach erscheint in der Mitte auf dem Bildschirm die Tabelle, wie in der Abbildung 33 zu sehen ist.

 33
Abbildung 33: Tabellenansicht

Diese Tabelle sollte der importierten csv-Meldedatei entsprechen.

6.5.2 Tag-Listener Test
Zuerst sollte die PowerShell als Administrator ausgeführt werden, um das Tag-Listener Programm zu
testen. Danach wird mit dem Befehl cd C:\Users\RFID\Desktop\python in den Ordner mit dem
Programm gewechselt und einer der folgenden Befehle sollte eingegeben werden:

python tag-listener.py C:\DeltaCopy\media\tag.txt -rennen 1

python tag-listener.py C:\DeltaCopy\media\tag.txt -rennen 2

Der Pfad in den Befehlen ist der zur mit RSync kopierten Datei. Die Zahl nach –rennen ist die Auswahl
für den Lauf.

Ob ein Tag mit der dazugehörigen Zeit vom Raspberry Pi zur Datenbank auf dem Laptop übertragen
wurde, kann an den Meldungen auf der PowerShell erkannt werden.

An folgender Meldung ist zu erkennen, dass das Übertragen in die Datenbank funktioniert hat:

'E2004106160A0048200046DA;00:02:26,22;01:41:25,63\n'
['E2004106160A0048200046DA', '00:02:26,22', '01:41:25,63']
NOTE: Eintrag wird in: Startzeit geschrieben.
NOTE: Das Schreiben war erfolgreich.

Anhand folgender Meldung ist zu erkennen, dass die Zeit nicht in die Datenbank eingetragen werden
konnte:

'E2003412DC03011924165398;00:02:31,28;01:41:30,75\n'
['E2003412DC03011924165398', '00:02:31,28', '01:41:30,75']
WARNING: Dataframe was empty.
ID: E2003412DC03011924165398

 34
Sie können auch lesen