summaryrefslogtreecommitdiffstats
path: root/doc/LaTeX/devel/0300-pvs.tex
blob: 329e03ac2d1d05908bc8a3082721daa545016bdc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
\chapter{Aufbau und Funktionsweise des PVS}
\index{Aufbau} \index{Funktionsweise} \index{Konzept}

Generelles Konzept

\section{Einzelne Komponenten}
\index{Komponenten}

\subsection{Zuordnung von Konsole und Clients}
\input{devel/0310-service-discovery}

\subsection{Überblick über Aktivitäten auf Clients}

\subsection{Projektion an Alle}
\index{Projektion}
Eine wichtige Eigenschaft des PVS ist die Verwaltung von Projektionen zwischen mehreren Clients. Eine Projektion ist hierbei das Anzeigen des Bildschirminhalts eines Clients - der sogenannten Source oder Quelle - auf einem oder mehreren anderen Clients - den Targets oder Zielen der Projektion.
Die für die Projektion benötigten Verbindungsdaten wie Passwort und IP werden von jedem Client bei der Anmeldung an der Steuerkonsole übermittelt und in einer Liste von PVSConnection Objekten in der Klasse \textit{PVSConnectionManager} gespeichert. Diese zentrale Verwaltung hat mehrere Vorteile:
\begin{itemize}
  \item Die Quelle einer Projektion muss keine Aktion ausführen und kann passiv bleiben.
  \item Redundanz der Daten wird verhindert, da diese auch in der Steuerkonsole zur Darstellung der Thumbnails benötigt werden.
  \item Das Nachrichtenaufkommen wird reduziert, da lediglich eine Nachricht bei der Anmeldung an der Steuerkonsole übermittelt wird.
\end{itemize}

Bei der Auswahl der Quelle und Ziele ist zu beachten, dass man für jede Projektion jeweils nur eine Quelle jedoch mehrere Ziele auswählen kann.
Quelle und Ziel müssen außerdem verschiedenen Kriterien genügen. 
\begin{itemize}
  \item Eine Quelle darf nicht gleichzeitig Ziel einer Projektion sein.
  \item Ein Ziel einer Projektion darf nicht Ziel einer anderen Projektion sein.
  \item Eine Quelle darf mehrfach als Quelle ausgewählt werden.
\end{itemize}
Diese Einschränkungen werden in der Steuerkonsole durchgesetzt, indem im Zielauswahldialog die Zielmenge eingeschränkt wird.
Siehe hierzu auch \ref{pvs-console-projection} Projektion.

Der Projektionsvorgang an sich besteht aus mehreren Teilen. Wird eine Projektion angefordert, wird überprüft, ob auf der Quelle ein VNC Server gestartet ist. Falls nicht, wird versucht, einen VNC Server zu starten. Ist dies erfolgreich, so sendet die Steuerkonsole das entsprechende Tripel (IP, Passwort und Port der Quelle) an alle ausgewählten Ziele. Clients, welche eine Projektionsaufforderung erhalten, verbinden sich dann mit den Verbindungsdaten zum VNC Server der Quelle. Um die Einstellbarkeit der Qualität einer Projektion zu ermöglichen, kann die Steuerkonsole einen von drei Qualitätswerten an die Zielclients übermitteln. Siehe hierzu auch \ref{pvs-console-quality} Qualitätsoptionen.


\subsection{Projektion eines Clients auf dem Beamer}
\index{Beamer}

Die Projektion eines Clients an den Beamer unterscheidet sich im Wesentlichen nicht von anderen Projektionen. Lediglich ist das Ziel der Projektion hierbei der Dozentenpc bzw. der PC, welcher an den Beamer angeschlossen ist. Eine spezielle Auszeichnung des Beamers erfolgt nicht. Die Anzahl der Ziele wird hierbei nicht beschränkt, da es wünschenswert sein kann, den auf dem Beamer dargestellten Bildschirminhalt auch gleichzeitig auf anderen Clients darzustellen.

\subsection{Chat- und Informationskanal}
\index{Chat}

Es gibt 2 Möglichkeiten um Kontakt mit den Clients aufzunehmen. Die erste ist über den Chat, wo Nachrichten sowohl über den offentlichen Kanal als
auch über einen privaten Kanäle verteilt werden können, und die zweite vom PVSManager aus über den Informationskanal.
Der Informationskanal ermöglich das Versenden von Nachrichten, die dringend zu lesen sind, an die Clients.
Im Gegenteil zum Chat erscheinen solche Nachrichten nicht im Chatfenster sondern in einem Pop-Up-Fenster und werden vom Bildschirm entfernt erst wenn man sie
als gelesen markiert durch das Drucken auf dem Knopf \textit{'OK'}.
\\
\\
\textbf{Behandlung der Nachrichten im Server}
\\
\\
Chat-Nachtichten werden von Server in der Klasse 'PVSConnectionManager' mittels der Methode 'onChat' behandelt. Dort wird aus der Nachrit den Empfänger
und den Absender ausglesen und die Nachricht an beide versendet. So gilt das Empfangen eine eigene Nachricht als Bestätigung, dass die Nachricht ordentlich vom Server
behandelt und versendet wurde. Das Gestalt von solchen Nachrichten sieht folgendermaßen aus

\begin{center}
 PVSMSG
\end{center}
\begin{center}
\begin{tabular}{l | l | p{4cm} | p{4cm}}
\hline
Type & Ident & Msg & sndID\\
\hline
PVSMESSAGE & <Username des Empfängers> & <Username des Absenders>:<Die eigentliche nachrich> & <Vom server zugewissene ID des Absenders>\\
\end{tabular}
\end{center}

Informationsnachrichten werden ausschließlich vom PVSManager versendet.Dies geschiet in der Klasse 'ConnectionList' mittels der Methode 'on\_Message'.

\begin{center}
 PVSMSG
\end{center}
\begin{center}
\begin{tabular}{l | l | p{4cm} | p{4cm}}
\hline
Type & Ident & Msg\\
\hline
PVSMESSAGE & BROADCAST & <Die eigentliche nachrich> \\
\end{tabular}
\end{center}

Informationnachrichten können außerdem einen oder mehrere Clients sperren, wenn sie den Ident 'LOCKSTATION' enthalten. Sobald ein Client die Nachricht empfängt,
wird diese auf dem Bilschirm angezeigt und 10 Sekunden später wird der Client gesperrt.

Abgesehen von der  Behandlung der Nachrichten muss sich der Server darum kümmern, dass jeder verbunde Client über alle nötige Informationionen verfügt damit er
Nachrichten mit andren Clients austauschen kann. Dies wird folgendermaßen erledigt:
\begin{itemize}
 \item \textbf{Einfügen eines Clients:} um die Verwaltung von Clients kümmert sich die Klasse 'PVSConnectionManager', in der die Methode 'onClientNew' für das Einfügen
von neuen Clients zuständigt ist. Sowald ein neuer Client in der Client-Liste des Servers eingefügt wird, wird an ihn die Liste aller im Server bereits angemeldete
Clients geschickt. Dazu dient die Methode 'sendEventToClients'.

Bis hier ist der neue Client noch unbekannt für den Rest der Nutzer. Der neuer Client wird erst bekannt gegeben sobald er vom Server einen Benutzername
zugewissen bekommen hat. Da es sein kann, dass den Name, mit dem der neue Client sich beim Server anmelden wollte,
bereits vergeben ist und muss unter Umständen verändert werden. Diese Zuweisung findet in der Methode  'onLoginUsername' statt,
wo nicht nur alle andere Clients sondern auch der neue Client darüber informiert werden. Auch hier kümmert sich die Methoder 'sendEventToClients'
ums Vesenden der entsprechenden Informationen.

 \item \textbf{Entfernen eines Clients:} das Entfernen von Clients wird von der Methode 'onClientRemove' erledigt, wo analog wie
Oben alle Clients darüber informiert werden. 
\end{itemize}

Für dei Übermittlung solche Informationen werden Nachrichten mit folgenden Gestal benutzt

\begin{center}
 PVSMSG
\end{center}
\begin{center}
\begin{tabular}{l | l | p{4cm} | p{4cm}}
\hline
Type & Ident & Msg\\
\hline
PVSMESSAGE & <Befehl> & <Benutzername>:<IP-Adresse> \\
\end{tabular}
\end{center}

Es gibt drei unterschiedliche Befehle, die welche Änderung in der localen Client-Liste der Clients vorgenommen werden soll angeben.
\begin{enumerate}
 \item 'clientToAdd'
\item 'clientToRemove'
\item 'assignedName'
\end{enumerate}

Wie es bei Servern gewöhnt ist, werden alle relevante Ereignisse in Log-Dateien protokolliert. Ereignisse werden im Chat-Log mit folgendem
Befehl eingetragen

\begin{center}
'ConsoleLog writeChat(<Beschreibung des Ereignisses>)'
\end{center}

\textbf{Chat-Interface der Steuerkonsole}
\\
\\
So wie alle Clients ist der PVSManager auch ein Teilnehmer im Chat. Der PVSManager steht wie alle andere Teilnehmer auch in der Nutzer-Liste
jedes Chat-Fenster und kann ebenfalls über private Nachrichten direkt angesprochen werden. Die Arbeitsweise dieser Chat-Interface ist sehr simple.
Da sie sich im Server befindet, müssen einfach alle Ereignise (Nachrichten senden ist die einzige Ausnahme) von der Klasse 'PVSConnectionManager'
an die Klasse 'MainWindow' weitergegeben werden. Dies kümmert sich darum, alle Informationen zu verarbeiten und diesein der Chat-Fenster der
Steuerkonsole anzuzeigen.

Folgende Methoden der Klasse 'MainWindow' ermöglichen das Anzeigen einer empfangenen Nachricht im Chat-Fenster der Steuerkonsole und Änderungen (Clients einfügen
und entfernen) in der sowohl im Chat-Fenster als auch in der Steuerkonsole angezeigten Client-Liste.
\\
\\
'receiveChatMsg(<Absender>, <Empfänger>, <Nachricht>)'
\\
'removeConnection(*pvsClient)'
\\
'addConnection(*pvsClient)'
\\
\\
Alle diese Methoden werden im Gegensatz von der Methode 'sendChatMsg(PVSMsg myMsg)' von der Klasse 'PVSConnectionManager' aus ausgeführt. Da alle durchs
Netz empfangene Nachrichten müssen an die GUI-Weitergegeben werden. Beim Versenden von Nachrichten funktioniert es genau umgekehrt. Die Nachricht wird
vom Nutzer in der GUI eingegeben und muss an die Klasse 'PVSConnectionManager' weitergeleitet werden, damit diese ins Netz gesendet wird. Darum kümmert
sich die Methode in der Klasse 'MainWindow'
\\
\\
'MainWindow::sendChatMsg(PVSMsg myMsg)'
\\
\\
\textbf{Chat-Clients}
\\
\\
So weit haben wir die Funtionsweisen des Servers im Bezug auf dem Chat kennengelernt.
Nun wird erläutert wie die einzelnen Clients die Nachrichten bearbeiten.
\\
\\
Auf der Client-Seite in der Klasse 'PVSConnectionServer' werden alle Nachrichten des PVS-Protokolls empfangen und gefiltert (Siehe Methode 'handleClientMsg').
Nachrichten mit dem Ident 'PVSMESSAGE' werden durch den Dispatcher direkt an die Klasse 'PVSChatClient' weitergeleitet, wo die Methode 'receive' feststellen wird,
ob es sich dabei um eine Gespräch-Nachricht oder eine Befehl-Nachricht handelt. Um es feststellen zu können, wird aus der empfangenen Nachricht ein PVSChatMsg-Objekt
erzeugt (siehe Konstruktor 'PVSChatMsg::PVSChatMsg(PVSMsg pvsMsg)') und mittels der Methode 'isCommand' erfährt man ob es sich um einen Befehl handelt oder nicht.
Falls ja leitet der Dispatche die Nachricht an die Stelle 'PVS::UpdateChatClients' sonst an die Stelle 'PVS::chat\_receive', wo die Änderungen in der Client-Liste
vorgenommen werden oder die Gespräch-Nachricht der GUI abgegeben wird.


\section{Netzwerkkommunikation}
\index{Netzwerkkommunikation}

\subsection{PVS-Protokoll}
\index{Protokoll!PVS} \index{Protokoll} 
Im Zuge der Entwicklung des PVS wurde ein sehr einfaches Messagingprotokoll entwickelt.
Die Nachrichten bzw. Messages bestehen dabei aus Header, Nachrichtentyp, Ident und dem eigentlichen Nachrichtentext. Die einzelnen Nachrichtenteile, welche bis auf den Header selbst definiert werden können, werden verknüpft und versendet. Es sind schon Nachrichtentypen vordefiniert, welche sich nur durch unterschiedliche Dispatcher unterscheiden.
Bereits vorhandene Typen sind COMMAND, LOGIN, MESSAGE und UNKNOWN. Die Dispatcher (\_commandDispatcher, \_loginDispatcher und \_chatDispatcher) befinden sich im Client in der Klasse \texttt{ServerConnection}, in der Steuerkonsole in der Klasse \texttt{ClientConnection} bzw. \texttt{ListenServer}. Ein Ident wie z.B. Username, Befehl oder Beschreibung des Nachrichteninhalts dient zur Unterscheidung verschiedener Nachrichten mit demselben Nachrichtentyp, wobei die Nachricht dann den dem Ident entsprechenden Nachrichtentext enthält.
Um eine Funktion zur Behandlung einer bestimmten Nachricht zu definieren, wird diese Funktion als Handler mit dem entsprechenden Dispatcher verknüpft. Im PVS-Client beispielsweise befindet sich der Dispatcher für Nachrichten vom Typ Command in der Klasse \texttt{pvsServerConnection}, daher wird in der Klasse \texttt{pvs} die Funktion \verb|void PVS::onCommand(PVSMsg cmdMessage)| wie folgt als Handler registriert: \verb|_pvsServerConnection->addCommandHandler("*", this, &PVS::onCommand)|. Erhält nun der Client eine Nachricht vom Typ COMMAND, so wird die Funktion onCommand mit dem entsprechenden Nachrichtenobjekt aufgerufen. Auf die eigentliche Nachricht kann dann über die Methoden \texttt{getIdent()} und \texttt{getMessage()} des Objektes zugegriffen werden. 

\subsection{PVS-Messages}
\index{Message!PVS} \index{Message}
Im Folgenden sind die Messages, die zwischen den einzelnen PVS Komponenenten ausgetauscht werden, aufgelistet.
Der Nachrichtentyp gibt dabei an, welcher Dispatcher die Nachricht behandelt. 
Der Ident einer Nachricht wird zur Verarbeitung einer empfangenen Nachricht in der aufzurufenden Funktion benötigt (Unterscheidung von anderen Nachrichten gleichen Typs).

\begin{center}
\small
\begin{tabular}{l | l | p{2cm} | p{4cm}}
\label{pvs-msg-liste}
Nachrichtentyp & Nachrichten Ident & Inhalt & Beschreibung \\
\hline
PVSCOMMAND & PROJECT & hostname port password quality & Hostname, Port, Passwort und Qualität des VNC Servers zu dem verbunden werden soll (durch Space getrennt) \\
PVSCOMMAND & UNPROJECT &  & \\
PVSCOMMAND & LOCKSTATION &  & \\
PVSCOMMAND & LOCKSTATION & Message & Client mit Nachricht sperren \\
PVSCOMMAND & UNLOCKSTATION &  & \\
PVSLOGIN & USERNAME & username & Client Benutzername \\
PVSLOGIN & PASSWORD & password & Serverpasswort \\
PVSLOGIN & ID & id & \\
PVSLOGIN & FAILED & "`Wrong Password"' & Wird bei falschem Passwort gesendet \\   "`
PVSCOMMAND & PORT & port & \\
PVSCOMMAND & PASSWORD & password & VNC Passwort\\
PVSCOMMAND & RWPASSWORD & rwpassword & Passwort für den Zugriff auf die Tastatur und Maus \\
PVSCOMMAND & VNC & YES &  Erlaube Zugriff \\
PVSCOMMAND & VNC & NO & Verbiete Zugriff \\
PVSCOMMAND & PING &  & \\
PVSCOMMAND & VNCREQUEST &  & \\
PVSCOMMAND & VNCSRVRESULT & result code & Der Rückgabewert des pvs-vncsrv Skripts \\
PVSMESSAGE & BROADCAST & MESSAGE &\\
PVSMESSAGE & clientToAdd & & Client hinzufügen (Chat)\\
PVSMESSAGE & clientToRemove & & Client entfernen (Chat)\\
PVSMESSAGE & assignedName & & Festgelegter Name (Chat)\\
\end{tabular}
\end{center}