-
Notifications
You must be signed in to change notification settings - Fork 0
/
mtb-daemon.tex
137 lines (115 loc) · 6.76 KB
/
mtb-daemon.tex
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
\newpage
\section{MTB Daemon}
\textit{\gls{mtb} Daemon} je první ze dvou počítačových aplikací, která v~rámci
této práce vznikla. Jejím hlavním úkolem je připojit se k~\gls{mtbusb} modulu a
umožnit jeho ovládání více různým aplikacím. K~tomuto účelu vystavuje \gls{mtb}
Daemon \gls{tcp} server, ke kterému se řídicí programy mohou připojit.
\subsection{Protokol TCP serveru} \label{sec:daemon:proto}
\gls{tcp} server musí umožňovat oboustrannou komunikaci – jak od klienta k~serveru
(\textit{požadavek, odpověď}), tak od serveru ke klientovi (\textit{asynchronní
události}). Například protokol \textit{http} v~kombinaci s~\textit{REST \gls{api}}
tedy není vhodné použít. Z~běžně používaných technologií byly zvažovány
\textit{websockets}, ty ale kvůli složitější inicializaci nebyly využity.
Autor zvolil snad nejjednodušší možný komunikační protokol: \gls{tcp} spojení
je udržováno trvale otevřené, posílají se textová data, každý řádek je jedna
zpráva. Textová data jsou ve formátu \textit{json}.
Textový protokol byl zvolen, aby bylo možné data číst lidským okem
(snadná diagnostika). Očekává se, že řídicí aplikace se bude připojovat
převážně ze stejného počítače, na kterém běží \gls{mtb} Daemon, nemá tedy smysl
šetřit \uv{kapacitu linky} binárním protokolem.
Formát \textit{json} byl zvolen proto, že je dnes moderním standardem pro
výměnu dat mezi aplikacemi. Snad všechny majoritní programovací jazyky obsahují
ve svých standardních knihovnách podporu pro práci s~\textit{json}.
Zprávy se posílají v~kódování \textit{UTF-8}. Nyní uvedeme příklad
dvou zpráv (pro přehlednost je každá zpráva rozdělena na více řádků, ve
skutečnosti se posílá na jednom řádku):
\begin{verbatim}
{
"command": "mtbusb",
"type": "request",
"id": 42
}
\end{verbatim}
\newpage
\begin{verbatim}
{
"command": "mtbusb",
"type": "response",
"id": 42,
"status": "ok",
"mtbusb": {
"connected": true,
"type": 1,
"speed": 115200,
"firmware_version": "1.0",
"protocol_version": "1.0",
"active_modules": [1, 5, 2, 121]
}
}
\end{verbatim}
Zprávy jsou tří typů (\texttt{type}):
\begin{compactenum}
\item \texttt{request} (zpráva od klienta serveru),
\item \texttt{response} (odpověď na \texttt{request}),
\item \texttt{event} (asynchronní událost – od serveru klientovi).
\end{compactenum}
Aby klient věděl, která odpověď patří kterému požadavku (klient může posílat
více požadavků rychle za sebou), lze u~každého požadavku uvést \texttt{id}
(číslo). Příslušná odpověď pak obsahuje stejné \texttt{id}.
Klient se může zaregistrovat ke konkrétním modulům příkazem \\
\texttt{module\_subscribe} (a odregistrovat příkazem
\texttt{module\_unsubscribe}). Pokud je klient zaregistrovaný k~nějakému modulu,
chodí mu asynchronní události o~změně stavu modulu (např. změna stavu vstupu).
Klienti si tak mohou volit, o~data kterých \gls{mtb} modulů mají zájem.
Kompletní specifikace protokolu je k~dispozici
online\footnote{\url{https://github.com/kmzbrnoI/mtb-daemon/tree/master/tcp-protocol}}.
\subsection{Volba nástrojů} \label{sec:daemon:tools}
\gls{mtb} Daemon je klíčová aplikace infrastruktury řízení kolejiště. Proto se
autor rozhodl ji programovat v~programovacím jazyce se silným statickým typovým
systémem.
Jako programovací jazyk bylo zvoleno \texttt{C++} (\texttt{C++17})
s~frameworkem \texttt{Qt}, který nabízí přímočaré knihovny pro komunikaci se
sériovým portem a pro síťovou komunikaci. U~knihoven zejména není třeba
složitěji řešit vlákna. \texttt{C++} a \texttt{Qt} umožňují multiplatformní
řešení aplikace – \gls{mtb} Daemon lze zkompilovat a spustit jak na
OS Linux, tak OS Windows.
\subsection{Implementace} \label{sec:daemon:impl}
Aplikace \gls{mtb} Daemon je psána jako jednovláknová konzolová aplikace.
Při návrhu byla zvažována i~možnost implementovat aplikaci jako okenní
(operátor obsluhy by přes aplikaci konfiguroval \gls{mtb} moduly a~měl by
přehled o~stavu sběrnice), nakonec však byl zvolen přístup, kdy aplikace pouze
vystavuje \gls{api}. Konfigurace se načítá ze souboru. V~případě zájmu o~vytvoření
grafického nástroje pro interakci se systémem \gls{mtb} bude tento systém
vytvořen jako další z~klientů aplikace \gls{mtb} Daemon nebo jako
nástroj pro přímou úpravu konfiguračního souboru.
Při implementaci bylo třeba vyřešit, jak zaručit, aby sběrnici nemohli ovládat
neautorizovaní klienti. V~současnosti je implementován pouze velice hrubý
autorizační mechanismus – server poslouchá na specifických rozhraních,
typicky jenom \textit{localhost}. Očekává se, že lokální stroj je server
kolejiště, na kterém by měly běžet výhradně bezpečné aplikace. V~budoucnu možná
autor přistoupí k~implementaci autentizace založené na povolení konkrétních
IP adres klientů. Očekává se, že klienti aplikace \gls{mtb} Daemon jsou trvale
připojená, nemigrující síťová zařízení, která řídí nějaký konkrétní systém
kolejiště, proto není nutné implementovat žádný složitější autentizační
mechanismus.
Jednotliví klienti mohou ovládat libovolné výstupy libovolných \gls{mtb}
modulů. Při návrhu aplikace vyvstala otázka, zda by v~konfiguraci nemělo být
specifikováno, který klient může ovládat který výstup (kterého modulu). Po
uvážení však bylo od tohoto nápadu upuštěno, protože by vyžadoval netriviální
(ručně psanou) konfiguraci navíc a identifikaci klientů. Očekává se, že klienti
připojující se k~\gls{mtb} Daemon jsou buď autonomní aplikace, nebo
aplikace, které řízení přístupu svých uživatelů implementují na své vlastní
úrovni. Pokud by nastala problematická situace, kdy dva klienti chtějí ovládat
stejný výstup, jedná se o~chybu v~klientské aplikaci nebo její konfiguraci,
nikoliv o~nekalý záměr, kterému by měl systém vší silou zabránit. \gls{mtb}
Daemon nastavení jednoho výstupu více klienty umožní, ale současně zaloguje
varování. To umožňuje operátorovi takovou situaci rozpoznat a konfiguraci
klientských aplikací opravit.
\gls{mtb} Daemon si pamatuje, který klient nastavil který výstup a při
odpojení klienta provede reset jím nastavených výstupů do základního stavu.
Aplikace obsahuje hierarchii tříd (ve vztahu dědičnosti) reprezentujících
jednotlivé typy \gls{mtb} modulů. \gls{tcp} protokol také počítá s~různými typy
modulů. Aplikace je tak připravena na přidání budoucích nových typů \gls{mtb}
modulů.
MTB Daemon je pod opensource licencí dostupný
online\footnote{\url{https://github.com/kmzbrnoI/mtb-daemon}}.