
% Kapitola "Interface"


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\kapitola{Interface}
\label{kap:iface}
Interface je elektronické zařízení, které umožňuje využít PMR radiostanici k~sestavení přenosového kanálu a~distribuci povelu. Disponuje vlastním komunikačním protokolem s~autentizací. Navržené DPS v~systému Eagle, 3D modely a~reálné fotografie jsou umístěny v~příloze \ref{kap:supp:cd}.
\img{iface/img/board}%
    {100mm}%
    {3D model DPS interface}%
    {fig:iface:model}%
    
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Hardware}
Schéma zapojení interface je uvedeno v~příloze \ref{kap:supp:cd}. Je rozděleno na tři funkční bloky. Jejich význam je následující:
\medskip
\begin{itemize}
\item{\textit{Hlavní část}: obsahuje základní funkční prvky interface. Jedná se o~MCU, DTMF dekodér, napěťový stabilizátor a~obvody umožnující připojení radiostanice. Součástí zapojení jsou dvě LED na signalizaci vysílání (červená) a~příjmu DTMF tónu (zelená). Podrobněji je problematika DTMF popsána v~kapitole \ref{sekcedtmf}.}
\item{\textit{TTL/RS232 převodník}: realizuje obousměrnou konverzi sériové linky mezi standardní úrovní RS-232 a~TTL. Využit je IO MAX232. Pokud je interface umístěn v~lokalitě, kde není požadováno připojení k~nadřazenému systému, není nutné součástky tohoto převodníku osazovat. Sériová linka v~TTL úrovni je vyvedena formou jumper lišty v~každém případě. Konfiguraci interface je tak možné provést s~využitím externího převodníku.}
\item{\textit{Relé}: jsou určena pro odpojení spotřebiče od napájení. Jejich počet vychází z~obvyklých požadavků, resp. uspořádání typického uzlu bezdrátové sítě -- WiFi klient, WiFi přístupový bod a~síťový switch. V~případě, že interface nerealizuje funkci odpojování spotřebičů, je možné obvody relé neosazovat. Jedná se zpravidla o~interface, který je připojený k~nadřazenému systému a~lokálně nic neodpojuje.}
\end{itemize}
\medskip
MCU zajišťuje veškerou logickou funkcionalitu a~tvoří tak zásadní součást interface. Jeho volba je založena na základě nalezení optima mezi maloobchodní dostupností kusovém množství, nízkou cenou, možnostmi implementovaných periférií, počtem vstupně/výstupních pinů a~rozměry. Při porovnání produktové nabídky firem Atmel, Microchip a~Motorola je nevhodnější MCU 8-mi bitový člen rodiny AVR\footnote{Označení pro rodinu 8-mi bitových RISC mikrokontrolérů z~produkce firmy Atmel.} Atmel ATmega8.
\par
Komunikace s~interface prostřednictvím RS-232 byla zvolena z~důvodu své jednoduchosti a~podpory téměř ve všech operačních systémech. Implementace preferovanějšího USB rozhraní do interface je možný, ale došlo by k~výraznému nárůstu ceny. A to je u~jednotek, které nebudou trvale připojeny k~nadřazenému systému, velmi negativní faktor. V~případě nutnosti je vhodnější využít externí USB/RS-232 převodník, který je běžně dostupný v~maloobchodní síti. Vyzkoušeny byly převodníky založené na obvodech Profilic PL2303 a~FTDI FT232BM. 
\img{iface/img/inout}%
    {126mm}%
    {Blokové schéma interface}%
    {fig:iface:authinout}%
\par\noindent
Význam vstupů a~výstupů:
\medskip
\begin{itemize}
\item{\textit{+12V}: napájení interface. Jeho velikost je volena s~ohledem na připojená relé. V~hlavní části zapojení je umístěn stabilizátor, který zajišťuje napájení MCU, DTMF dekodéru a~případně radiostanice. Klidový odběr interface bez sepnutého relé je 15~mA. Napájecí zdroj musí být patřičně proudově dimenzován. Vhodná hodnota maximálního proudového zatížení zdroje bez poklesu napětí pod 12~V je 1~A. Lze využít různé spínané síťové adaptéry.}
\item{\textit{+5V\_TCVR}: napájecí napětí pro radiostanici. Toto napětí je získáno ze stabilizátoru zmíněného v~předchozí odrážce. Maximální možný krátkodobý proudový odběr je 800~mA a~to z~důvodu, že stabilizátor není chlazen. Další informace o~napájení PMR radiostanic jsou uvedeny v~kapitole \ref{kap:trx:napajeni}. }
\item{\textit{TXD, TXD(TTL)}: datový výstup sériové linky RS-232 ve standardní a~TTL úrovni.} 
\item{\textit{RXD, RXD(TTL)}: datový vstup sériové linky RS-232 ve standardní a~TTL úrovni.} 
\item{\textit{MISO, MOSI, SCK, RESET}: systémové rozhraní pro programování MCU.}
\item{\textit{RE1a, RE1b}: výkonové výstupy relé. V~klidovém stavu jsou kontakty relé sepnuty. Po příchodu povelu dojde k~jejich rozpojení na stanovenou dobu. Výstupy RE2a, RE2b, RE3a a~RE3b jsou funkčně analogické.}
\item{\textit{RE4-8}: logické výstupy. Po příchodu povelu je na těchto výstupech po stanovenou dobu nastavena log.1. Lze jej využít např. pro připojení dalších relé apod.}
\item{\textit{RX\_IN}: vstup nf signálu z~radiostanice. Jeho úroveň není vzhledem k~vlastnostem DTMF dekodéru uvedeným v~kapitole \ref{kap:iface:dtfmrx} podstatná. Optimální hodnota je polovina rozsahu hlasitosti radiostanice.}
\item{\textit{MOD/TX}: sdružený výstup modulačního signálu a~povelu k~zahájení vysílání. Odporovým trimrem P1 je možné nastavit úroveň modulace tak, aby splňovala podmínky uvedené v~kapitole \ref{kap:trx:modlevel}.}
\item{\textit{GND}: místo s~nulovým potenciálem vzhledem k~napájecímu napětí a~ostatním signálům.} 
\end{itemize}
\medskip
\par\noindent


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{DTMF}
\label{sekcedtmf}
Princip DTMF spočívá na přenosu tónu, který je složen ze dvou harmonických signálů $f_{H}$ a~$f_{L}$ o~přesně definované frekvenci. Jedním tónem lze přenést 16 různých stavů -- znaků. Jejich výčet je uveden v~tab. \link{tab:iface:dtmftones}. 
\tabulka{Tabulka frekvencí DTMF tónů}{tab:iface:dtmftones}
\def\arraystretch{1.1} 
\begin{tabular}{|c|c||c|c|c|c|} \hline
\multicolumn{2}{|c||}{\multirow{2}{*}{}} & \multicolumn{4}{|c|}{\textbf{\small $f_{H}$ [Hz]}} \\ \cline{3-6}
\multicolumn{2}{|c||}{} & \textbf{\small 1209} & \textbf{\small 1336} & \textbf{\small 1447} & \textbf{\small 1633} \\
\hline \hline
\multirow{4}{*}{\rotatebox{90}{\parbox[b]{2cm}{\center\textbf{\small $f_{L}$ [Hz]}}}}
& \textbf{\small 697} & \small 1 & \small 2 & \small 3  & \small A \\ \cline{2-6}
& \textbf{\small 770} & \small 4 & \small 5 & \small 6  & \small B \\ \cline{2-6}
& \textbf{\small 852} & \small 7 & \small 8 & \small 9  & \small C \\ \cline{2-6}
& \textbf{\small 941} & \small * & \small 0 & \small \# & \small D \\ \hline
\end{tabular}
\endtab
\begin{equation}%
f(t) = sin(2\pi f_{H}t) + \frac{3}{4}sin(2\pi f_{L}t)
\label{eqdtmf}
\end{equation}
\par\noindent
Klíčové vlastnosti DTMF:
\medskip
\begin{itemize}
\item{Přenosová rychlost je omezena na max. 10 znaků za sekundu a~odpovídá minimálnímu garantovanému časovému rozložení 50 ms tón, 50 ms mezera. Tónová volba není primárně určena k~přenosu dat, ale pouze k~přenosu signalizace.}
\item{Vzhledem k~nízké přenosové rychlosti a~přenosu informace ve frekvenční oblasti vykazuje velmi malou chybovost. Pokud se chyba vyskytne, má charakter nepřijatého znaku, nikoliv chybně přijatého znaku. Za předpokladu, že komunikující strany přesně ví, jaký formát zprávy mají od svého protějšku v~daný moment očekávat, není nutné komunikaci zabezpečovat detekčními a~opravnými kódy. U navrženého komunikačního protokolu je tento předpoklad splněn.}
\end{itemize}
\medskip

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Příjem DTMF}
\label{kap:iface:dtfmrx}
Detekci DTMF lze realizovat následujícími způsoby:
\medskip
\begin{itemize}
\item{\textit{FFT}: implementace rychlé fourierovy transformace do MCU je možná dle \cite{lit:ds:avrfft}. Prakticky však bylo zjištěno, že k~dosažení přesnosti v~řádu Hz by byl potřeba podstatně výkonnější hardware než je zvolený MCU. Speciální DSP (digital signal processing) mikrokontroléry jsou sice v~maloobchodní síti k~dispozici, ale jejich kusová cena výrazně narušuje původní nízkonákladovou koncepci interface.}
\item{\textit{Goertzelův algoritmus}: vyniká výrazně větší efektivitou než FFT a~to především z~důvodu, že výpočet probíhá pouze pro omezený počet bodů -- frekvencí. V~případě DTMF je jich pouze 8. Realizace v~jazyce C dle \cite{lit:ds:goer} prokázala dostatečnou funkčnost. Z~hlediska hardware je nutné, aby byl před vstupem A/D převodníku umístěn předzesilovač s~limiterem a~nedocházelo k~překročení maximální vstupní úrovně převodníku vstupním signálem.}
\item{\textit{Integrovaný dekodér}: jedná se o~dostupný, jednoúčelový integrovaný obvod MT8870 \cite{lit:ds:mt8870}. Jeho funkce spočívá v~převodu DTMF na 4-bitové slovo. Činnost MCU je omezena na obsluhu přerušení, kdy MT8870 signalizuje, že dekódoval nový příchozí znak a~jeho následné zpracování. Součástí vstupních obvodů tohoto IO je nízkofrekvenční kompresor s~limiterem. Je tak zajištěn široký rozsah úrovní vstupního signálu, který bude korektně dekódován.}
\end{itemize}
\medskip
Z hlediska finančních nákladů, počtu použitých součástek a~místa na DPS je využití integrovaného dekodéru ve všech uvedených parametrech téměř shodné s~předzesilovačem nutného u~Goertzelova algoritmu. Jediným zásadním rozdílem je, že při využití integrovaného dekodéru dojde k~úspoře flash paměti MCU. Pouhá obsluha přerušení je paměťově méně náročnější. Integrovaný dekodér se tak jeví jako nejvhodnější řešení a~byl v~návrhu interface použit.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Generování DTMF}
Generování DTMF je výrazně jednodušší než jeho detekce. Lze využít tyto způsoby:
\medskip
\begin{itemize}
\item{\textit{Integrovaný transceiver}: jedná se o~jednoúčelový obvod MT8880, který je schopen DTMF vytvářet, ale i~přijímat. Jeho hlavní nevýhodou je maloobchodní cena, která dosahuje dvojnásobku ceny zvoleného MCU. Výhodou je naopak vynikající spektrální čistota výstupního signálu.}
\item{\textit{Software}: k~vytváření DTMF lze využít časovače MCU, který je schopen pracovat v~režimu pulzně šířkové modulace - PWM.}
\end{itemize}
\medskip
Pro realizaci generátoru DTMF byl zvolen softwarový způsob a~to především z~důvodu, že zbytečně nezvyšuje náklady a~poskytuje přitom dostatečně jakostní signál. 
\par
Mezi hardwarové požadavky PWM, které je nutné splnit, patří stabilní taktovací kmitočet MCU a~filtrace vzorkovacího kmitočtu. MCU má ve svém pouzdře umístěn interní RC oscilátor, který ovšem nevyniká dlouhodobou kmitočtovou stabilitou a~pro realizaci PWM DTMF generátoru jej proto nelze použít. Problém stabilního taktovacího kmitočtu byl však nepřímo vyřešen volbou DTMF přijímače MT8870. Tento integrovaný obvod vyžaduje ke své činnosti externí krystalový rezonátor o~frekvenci 3,579545 MHz. Signál z~oscilátoru tohoto obvodu byl využit pro taktování MCU. 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{DTMF generátor s využitím PWM}
K realizaci PWM je využit osmibitový Timer/Counter2. Je nastaven tak, aby k~inkrementaci čítače TCNT2 docházelo přímo systémovým taktem MCU $f_{takt}$ bez předděličky a~režim pulzně šířkové modulace byl Fast PWM. V~tomto režimu má časový průběh hodnoty tohoto čítače charakter pily. Po dosažení maximální hodnoty (255) je vždy vyvoláno přerušení a~současně pokračuje inkrementace od nuly. Logický stav fyzického výstupního pinu OC2 je závislý na porovnání čítače TCNT2 s~komparačním registrem OCR2. 
\begin{equation}%
TCNT2<OCR2 \Rightarrow OC2 = log.1\\%
\end{equation}
\begin{equation}%
TCNT2\geq OCR2 \Rightarrow OC2 = log.0%
\end{equation}
Hodnotou komparačního registru OCR2 lze ovlivňovat střídu obdélníkového signálu na pinu OC2. Jeho perioda je dána vztahem \ref{eqtvz}. Uvedená hodnota současně vyjadřuje interval mezi vyvoláním jednotlivých přerušení po přetečení čítače TCNT2.
\begin{equation}%
T_{vz}=\frac{2^{8}}{f_{takt}} \quad[s]%
\label{eqtvz}
\end{equation}
Princip vytvoření signálu frekvence $f$ ve tvaru sinusoidy spočívá v~určení jeho okamžité hodnoty v momentě přerušení a~následném nastavení komparačního registru OCR2 na tuto hodnotu. Funkce sinus je v~MCU realizována formou tabulky $T$ 7-mi bitových vzorků v~intervalu $\langle0;2\pi\rangle$. Velikost tabulky je $N=128$ vzorků. Vzhledem k~tomu, že hodnota $T_{vz}$ je konstantní, leží i~okamžité hodnoty generovaného signálu $f$ v~tabulce $T$ ve vzájemně konstantních vzdálenostech~–~nazváno krokem~$k$.
\begin{equation}%
k=\frac{2^{8}Nf}{f_{takt}} \quad[-]%
\end{equation}
Z~důvodu vyšší rychlosti probíhají v~MCU pouze celočíselné matematické operace. Zaokrouhlená hodnota uvedeného kroku $k$ by způsobovala příliš výraznou odchylku od požadované frekvence $f$. Z tohoto důvodu se využívá zaokrouhlený šestnáctinásobek $k_{16}$. V~tabulce \link{tab:iface:pwmstep} jsou uvedeny konkrétní hodnoty pro $f_{takt} = 3\,579\,545$ Hz.
\tabulka{Hodnoty kroků pro obě skupiny pracovních frekvencí DTMF}{tab:iface:pwmstep}
\def\arraystretch{1.1} 
\begin{tabular}{|c||c|c|c|c||c|c|} \cline{1-3}\cline{5-7}%
$f$\small[Hz] & $k$ & $k_{16}$ & & $f$\small[Hz]& $k$ & $k_{16}$\\ \cline{1-3}\cline{5-7}
$697$ & $6,381$ & $102$ & & $1209$ & $11,067$ & $177$\\ \cline{1-3}\cline{5-7}%
$770$ & $7,049$ & $113$ & & $1336$ & $12,230$ & $196$\\ \cline{1-3}\cline{5-7}%
$852$ & $7,799$ & $125$ & & $1477$ & $13,521$ & $216$\\ \cline{1-3}\cline{5-7}%
$941$ & $8,614$ & $138$ & & $1633$ & $14,949$ & $239$\\ \cline{1-3}\cline{5-7}%
\end{tabular}
\endtab
\medskip
\noindent
K určení hodnoty ukazatele $p$ na aktuální vzorek ze sinus tabulky je využito rozšířeného ukazatele $p_{16}$. Při každém přetečení čítače TCNT2 je hodnota $p_{16}$ upravena dle rovnice \ref{eqkrokovani}.
\begin{equation}%
p_{16} = p_{16} + k_{16}
\label{eqkrokovani}
\end{equation}
Pro získání skutečného ukazatele $p$ na aktuální vzorek ze sinus tabulky se ukazatel $p_{16}$ celočíselně vydělí 16 a~současně odstraní vše, kromě spodních 7-mi bitů. Uvedená operace je pro snazší pochopení uvedena v~jazyce C:
\medskip
\begin{verbatim}
p = (char) ( ( p16 >> 4 ) &  0x007F )
\end{verbatim}
\medskip
Následuje získání vzorku $s$ z tabulky $T$:
\begin{equation}%
s=T[p]
\label{xxx}
\end{equation}
Dle vztahu \ref{eqdtmf} je zřejmé, že uvedený postup k~získání vzorku $s$ je nutné vykonat pro obě frekvence $f_{H}$ a~$f_{L}$. Výsledkem jsou dva vzorky $s_{H}$ a~$s_{L}$. Obsah komparačního registru je pak dán vztahem~\ref{eqsumator}.
\begin{equation}%
OCR = s_{H} + s_{L} - \frac{1}{4}s_{L}
\label{eqsumator}
\end{equation}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Parametry generátoru DTMF}
Firmware umožňuje parametrizovat časové rozložení tónu formou konstant Tone Time a~Space Time. Interval lze volit v~rozsahu 10--2550 ms. Způsob modifikace je popsán v~kapitole \ref{kap:iface:cfgcmd}. Důvodem pro zavedení těchto konstant je skutečnost, že ani minimální časové rozložení nemusí garantovat spolehlivý přenos a~detekci.
\img{iface/img/tones}%
    {110mm}%
    {Význam konstant Tone Time a Space Time}%
    {fig:iface:tonetime}%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Komunikační protokol}
\label{kap:iface:protocol}
Implementace komunikačního protokolu do firmware interface je jedním z~klíčových požadavků navrhovaného systému. Účelem je, aby nadřazený systém, kterým je zpravidla server nebo router, vyslal pouze požadavek na provedení vzdáleného restartu a~poté již jen po stanovenou dobu čekal na výsledek požadované operace. Jedná se tedy o~jistou formu zapouzdření komunikačního protokolu a~jednotný projev vzhledem k~nadřazeným systémům.
\medskip
\par\noindent
Vlastnosti komunikačního protokolu:
\medskip
\begin{itemize}
\item{Unikátní adresace.}
\item{Komunikace typu peer to peer.}
\item{Autentizace před provedením požadovaného povelu.}
\item{Využití dostupných nenumerických znaků v~DTMF -- A, B, C, D, *, \#.}
\end{itemize}
\medskip
Každá jednotka\footnote{Interface s~připojenou radiostanicí.}, která má být schopna komunikovat s~ostatními, musí mít přidělenu unikátní adresu. Tato adresa je tvořena trojicí numerických znaků a~nabývá hodnot od 000 do 999. Vzhledem k~reálnému dosahu radiostanic a~hustotě rozložení bezdrátových síťových prvků je zvolený adresní prostor výrazně naddimenzovaný. V~současné době by v~síti sdružení Starhill postačovala pouze jednociferná adresa, ve střednědobém horizontu dvouciferná. Třetí cifra může být použita například k~rozlišení lokality.
\par
Všechny jednotky jsou schopny plnohodnotně komunikovat vzájemně mezi sebou. To znamená, že každá jednotka je schopna vyslat požadovaný příkaz k~jakékoliv jiné jednotce nebo tento příkaz přijmout a~provést. V~reálném nasazení je však filozofie peer-to-peer mírně potlačena a~to z~důvodu, že příkaz může vyslat pouze ta jednotka, která je připojena k~nějakému nadřazenému systému. V~síti Starhill jsou tyto jednotky dvě. Jedná se však pouze o~aplikační omezení, nikoliv implementační. 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Autentizace}
Smyslem autentizační schopnosti komunikačního protokolu je snížit pravděpodobnost případného zneužití jednotek cizími osobami. I když je motivace k~této činnosti velmi rozporuplná, nelze zcela naivně předpokládat, že by se o~to někdo nepokusil. 
\par
Nejjednodušší metodou vedoucí ke zneužití neautentizovaného přenosu povelu je záznam a~opětovné odvysílání části zachycené relace mezi dvěma jednotkami. V zásadě se jedná o~předstírání činnosti regulérní jednotky někým jiným. Technická náročnost tohoto postupu spočívá ve vlastnictví jednoho kusu PMR radiostanice a~libovolného záznamového zařízení, např. PC s~připojeným mikrofonem. Jedná se tedy o~velmi snadný úkol. Konkrétním cílem autentizace je zajistit, aby opětovným odvysíláním zachycené relace nemohlo dojít k~vykonání příkazu a~zároveň aplikovat takový mechanismus, který by umožňoval ověření identity regulérních jednotek. Není možné sestavit absolutně bezpečný způsob autentizace, to zde však není ani cílem. Je však nutné překonat pomyslnou hranici mezi náročností aktivit vedoucích ke zneužití jednotek a~osobním profitem útočníka. 
\par
Základem navrženého způsobu autentizace je existence tabulky kódů v~EEPROM paměti MCU. Velikost tabulky je omezena vzhledem k~velikosti EEPROM na 200 numerických záznamů čtveřice numerických znaků v~intervalu 0000--9999. 
\tabulka{Ukázka tabulky kódů}{tab:iface:codetable}
\def\arraystretch{1.1}
\begin{tabular}{|c|c|} \hline
\textbf{\small Index} & \textbf{\small Kód} \\ \hline
\small 1  & \small 2821 \\ \hline %\hline
\small 2	& \small 3283 \\ \hline
\small ...	& \small ... \\ \hline
\small 200	& \small 0291 \\ \hline%\hline
\end{tabular}
\endtab
\par\noindent
Tabulka je v~MCU realizována formou statického pole proměnných typu neznaménkový integer. Jednotlivé číslice jsou uloženy v~bitových čtveřicích formou BCD kódu. Přitom platí, že číslice kódu jsou dle své sestupné váhy umístěny od MSB směrem k~LSB. Kód 3283 je uložen v~tabulce jako hodnota 0x3283h. Tento způsob uložení kódu je výhodný především z~hlediska čtení a~zápisu, kde k~získání jednotlivých cifer v~ASCII formátu postačuje pouhý bitový posuv, vymaskování a~přičtení konstanty. Nevýhodou je naopak omezení rozsahu použitelných kódů vzhledem k~celému integeru. V~praxi ovšem není tento nedostatek významný.
\img{iface/img/komunikace}%
    {110mm}% 110
    {Transakce mezi dvěma jednotkami $P$ a Q}%
    {fig:iface:authtrans}%
\par\noindent
Na obr. \link{fig:iface:authtrans} je znázorněna transakce s~provedenou autentizací mezi dvěma jednotkami. Písmenem $P$ je označena jednotka s~připojeným nadřazeným systémem. Tato jednotka inicializuje autentizační sekvenci vysláním požadavku na vzdálený reset nebo restart. Úkolem jednotky označené $Q$ je požadavek fyzicky provést. 
\par
Na vyslaný příkaz reaguje jednotka $Q$ vygenerováním pseudonáhodného čísla z~intervalu $\langle1;200\rangle$. Toto číslo reprezentuje index z~tabulky kódů a~označuje jeden konkrétní řádek. Generování skutečně náhodného čísla je poměrně komplikované a~vzhledem k~četnosti využití jednotek by s~použitím nějakého sofistikovaného algoritmu nedošlo k~výraznému zvýšení bezpečnosti autentizace. Byla proto zvolena jednoduchá implementace využívající 8-mi bitový čítač v~MCU. 
\medskip
\begin{verbatim}
table_index = TCNT0 + 1;
if( table_index>200 ) table_index -= (table_index >> 1);
\end{verbatim}
\medskip
\par\noindent
Čítač je inkrementován systémovým taktem MCU. Po příchodu požadavku na vygenerování pseudonáhodného čísla je k~jeho aktuální hodnotě v~registru TCNT0 přičtena 1. Tato operace zajistí splnění dolní hranice intervalu v~případě, že aktuální hodnota čítače by byla 0. Pokud je hodnota vyšší než horní hranice intervalu, je od aktuální hodnoty odečteno číslo, které vznikne posunem o~jeden bit doprava. Takto získaný index je odeslán jednotce $P$.
\par
Jednotka $P$ index přijme a~na základě navržené funkce \ref{ieqcodefc} provede výpočet a~odeslání klíče. Podmínkou je, aby obsah tabulky kódů byl shodný s~jednotkou $Q$ a~obě jednotky měly ve svém firmware implementovánu stejnou funkci. Na rozdíl od tabulky kódů je však tato funkce ve firmware zapsána fixně a~nelze ji měnit jinak, než úpravou zdrojových kódů.
\begin{equation}%
klic(k,a)=\frac{k+1}{2}+2a-[(a+1) \bmod{3}]+11%
\label{ieqcodefc}
\end{equation}
\par
$k$: kód z~tabulky kódů na základě přijatého indexu
\par
$a$: adresa jednotky $Q$
\medskip
\par\noindent
Kód $k$ je z~tabulky kódů přečten jako hodnota typu integer a~nerespektuje původní dekadický zápis čtyřciferné hodnoty. Pokud tedy jednotka $P$ přijme index 2, je dle ukázkové tab. \link{tab:iface:codetable} hodnota k=0x3283h, nikoliv 3283. Její vlastností je, že hodnota výsledného klíče leží pro všechny možné kombinace kódů a~adres v~intervalu neznaménkového integeru, tedy $\langle0;65535\rangle$. 
\par
Jednotka $Q$ provede před přijetím klíče od jednotky $P$ naprosto shodný výpočet a~následně ho porovná s~přijatým klíčem. Pokud jsou oba klíče shodné, dojde k~odeslání potvrzení o~úspěšném provedení požadované akce. Pokud je však přijat chybný klíč nebo není přijat žádný, jednotka $Q$ se z~preventivních důvodů na 60 sekund zablokuje. 
\par
Uvedený způsob autentizace umožňuje případnému útočníkovi získat kombinace \textit{adresa}, \textit{index} a~\textit{klíč}. Vzhledem k~tomu, že klíč je funkcí kódu z~tabulky a~adresy jednotky $Q$, je jeho výsledek pro každou jednotku typu $Q$ různý. Na základě získaných údajů se může útočník pokoušet navazovat spojení s~konkrétní jednotkou $Q$, jejíž údaje má k~dispozici a~čekat, až mu jednotka $Q$ vygeneruje index, který útočník má k~dispozici. Vzhledem k~četnosti použití jednotek v~řádu týdnů (dle reálných výpadků) a~60-ti sekundové blokaci jednotek typu $Q$, je postup odposlechu nutných údajů a~jejich následné použití velmi zdlouhavé. Navíc od útočníka vyžaduje jisté odborné znalosti, protože prostý záznam komunikace nelze v~tomto případě použít.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Přenos požadavku radiově dostupné jednotce}
\label{kap:iface:direct}
Jedná se o~základní komunikační funkci jednotky, která realizuje sepnutí relé (rozepnutí napájecího obvodu spotřebiče) nebo nastavení log. 1 na požadovaném výstupu po stanovený čas. Spuštění této funkce se provede zasláním příkazu $C$ na komunikační port jednotky. Syntax je uveden v~kapitole \ref{kap:iface:comcmd}.
\medskip
\par\noindent
Požadované argumenty jsou:
\medskip
\begin{itemize}
\item{Adresa vzdálené jednotky.}
\item{Požadovaný výstup v~intervalu $\langle1;8\rangle$. Označen jako $V$.}
\item{Čas požadované akce v~desítkách sekund. Povolený interval je $\langle0;9\rangle$. Hodnota 0 způsobí trvalé sepnutí relé nebo log. 1 na daném výstupu. Tento stav je následně uložen do interní EEPROM vzdálené jednotky. Opětovné rozepnutí relé nebo nastavení log. 0 lze provést zasláním příkazu s~nenulovým časem na daný výstup. Čas je označen jako $S$.}
\end{itemize}
\medskip
\par\noindent
Kromě výše uvedených parametrů je komunikace řízena dalšími nastavitelnými konstantami:
\medskip
\begin{itemize}
\item{\textit{TX Delay}: jedná se o~časovou prodlevu mezi zahájením vysílání radiostanice a~počátkem přenosu paketu. Důvodem tohoto opatření existence úsporných režimů u~většiny radiostanic. Podrobně popsáno v~kapitole \ref{kap:trx:pwrsave}. Vhodná hodnota je 2 s.}
\item{\textit{RX Delay}: představuje komunikační timeout resp. čas, kdy jednotka přijímá paket od jednotky vzdálené. Pokud během přenosu dojde k~chybě, po uplynutí tohoto času jednotka stornuje stávající transakci a~vrátí se do výchozího stavu. Vhodná hodnota této konstanty závisí především na časové charakteristice DTMF tónů vzhledem k~nejdelšímu paketu, která činí 12 znaků při přenášení klíče. Je nutné uvažovat také TX Delay, tedy dobu, než se paket začne skutečně přenášet. Orientační hodnota je cca 10 s.}
\end{itemize}
\img{iface/img/delays}%
    {110mm}%
    {Význam konstant TX Delay a RX Delay}%
    {fig:iface:delays}%
\par\noindent
Popis transakce vychází z~uspořádání definovaného na obr. \link{fig:iface:authtrans}. Jednotka $P$ s~adresou $ppp$ předá příkaz jednotce $Q$ s~adresou $qqq$. Požadovaný výstup je $V$ a~čas $S$. Typ příkazu je $A$. Využívá se nenumerických znaků, kterými DTMF disponuje. Znak $*$ je startovacím znakem každého paketu.
\medskip
\par\noindent
Jednotka $P$ vyšle inicializační paket s~potřebnými argumenty.
\medskip
\par\noindent
\texttt{P: *qqqpppAVS}
\medskip
\par\noindent
Jednotka $Q$ odpoví zasláním indexu $iii$.
\medskip
\par\noindent
\texttt{Q: *pppqqqiii}
\medskip
\par\noindent
Následuje předání klíče $kkkkk$.
\medskip
\par\noindent
\texttt{P: *qqqpppkkkkk}
\medskip
\par\noindent
Pokud je klíč v~pořádku, dojde k~zaslání potvrzení o~provedení požadované akce.
\medskip
\par\noindent
\texttt{Q: *pppqqq1}
\medskip
\par\noindent
Následuje fyzické provedení formou sepnutí relé nebo nastavením log. 1 požadovaného výstupu $V$. Po stanovený čas $S$ je jednotka nedostupná. Potvrzení o~provedení je proto odesláno již předem.
V každém okamžiku transakce je přijímací jednotce známo, jak dlouhý paket a~s jakými argumenty má očekávat. Pokud přijme paket, kde je libovolný uvedený údaj chybný, transakci stornuje okamžitě nebo po uplynutí času RX Delay.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Přenos požadavku prostřednictvím opakovače}
\label{sekcerptr}
V případě, že mezi jednotkami není vzájemná radiová viditelnost (jsou umístěny mimo svůj vzájemný dosah), lze k~uskutečnění spojení využít libovolnou jinou jednotku, která s~požadovanou jednotkou radiovou viditelnost má. Tento provozní režim je nazván jako opakovač. 
\img{iface/img/repeater}%
    {78mm}%
    {Jednotka $R$ ve funkci opakovače pro spojení mezi $P$ a~$Q$}%
    {fig:iface:rptr}%
\par\noindent
Spuštění této funkce se provede zasláním příkazu $D$ se shodnými argumenty, jako je tomu u~požadavku na radiově dostupnou jednotku. Navíc je však nutné specifikovat adresu jednotky $R$, která vzájemné spojení zprostředkuje. Adresa této jednotky je označena $rrr$.
\medskip
\par\noindent
Jednotka $P$ vyšle inicializační paket s~potřebnými argumenty směrem k~$R$. Typ příkazu je $B$.
\medskip
\par\noindent
\texttt{P: *rrrpppBVSqqq}
\medskip
\par\noindent
Jednotka $R$ odpoví zasláním indexu $iii$.
\medskip
\par\noindent
\texttt{R: *ppprrriii}
\medskip
\par\noindent
Následuje předání klíče $kkkkk$.
\medskip
\par\noindent
\texttt{P: *rrrpppkkkkk}
\medskip
\par\noindent
Pokud byl klíč v~pořádku, jednotka $R$ si ověřila identitu jednotky $P$ a~nyní předá povel jednotce $Q$. Jednotka $P$ bude čekat na odpověď po dobu definovanou konstantou RPTR Delay. Její hodnota je konfigurovatelná a~závisí na době trvání celé transakce mezi $R$ a~$Q$ včetně potvrzovacího paketu pro jednotku $P$. Orientační hodnota může být cca 30 s.
\medskip
\par\noindent
\texttt{R: *qqqrrrAVS}
\medskip
\par\noindent
Jednotka $Q$ odpoví zasláním indexu $iii$.
\medskip
\par\noindent
\texttt{Q: *rrrqqqiii}
\medskip
\par\noindent
Následuje předání klíče $kkkkk$.
\medskip
\par\noindent
\texttt{R: *qqqrrrkkkkk}
\medskip
\par\noindent
Pokud je klíč v~pořádku, dojde k~zaslání potvrzení o~provedení požadované akce jednotce $R$. Zároveň jednotka $Q$ fyzicky provede požadovanou akci.
\medskip
\par\noindent
\texttt{Q: *rrrqqq1}
\medskip
\par\noindent
Jednotka $R$ přepošle potvrzení inicializační jednotce $P$.
\medskip
\par\noindent
\texttt{R: *ppprrr1}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Ověření dostupnosti}
Test dostupnosti je doplňková funkce, vhodná především na diagnostické účely. Pokud se vyjde z~uspořádání definovaného na obr. \link{fig:iface:authtrans}, je pro spuštění testu dostupnosti nutné zaslat příkaz L~společně s~adresou vzdálené jednotky Q. Vlastní test pak probíhá bez autentizace a~to z~důvodu, že v~podstatě jakákoliv odpověď od vzdálené jednotky znamená, že jednotka je dostupná.
\medskip
\par\noindent
Jednotka $P$ vyšle inicializační paket. Příkaz je typu $C$.
\medskip
\par\noindent
\texttt{P: *qqqpppC}
\medskip
\par\noindent
Jednotka $Q$ odpoví potvrzením své dostupnosti.
\medskip
\par\noindent
\texttt{Q: *pppqqq1}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Firmware}
\label{kap:iface:firmware}
Firmware\footnote{Programové vybavení elektronických zařízení. Úzce vázáno na hardware.}  interface je vytvořen v~programovacím jazyce C. Ke kompilaci zdrojových kódů byl využit volně dostupný kompilátor avr-gcc. Je primárně určen pro operační systémy unixového typu, ale lze jej provozovat i~v~prostředí Microsoft Windows. Zde je však vhodnější využít již předpřipraveného balíku WinAVR \cite{lit:web:winavr}, který výrazně zjednodušuje instalaci a~to včetně všech základních knihoven. Podrobně komentované zdrojové kódy jsou uvedeny v~příloze \ref{kap:supp:cd}.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Formát příkazů}
Uživatelská komunikace s~jednotkou probíhá prostřednictvím sériové sběrnice v~terminálovém režimu. Parametry sériového portu jsou uvedeny v~kapitole \ref{kap:aplikace} společně s~několika ukázkami vhodného a~ověřeného software. Vzhledem k~omezenému prostoru flash paměti MCU bylo nutné při realizaci uživatelského 
terminálového prostředí pojmout minimalistickým způsobem.
\medskip
\par\noindent
Formát příkazu: \texttt{<příkaz><argument>}
\medskip
\par\noindent
Význam jednotlivých polí:
\medskip
\begin{itemize}
\item{\textit{příkaz}: přesně jeden alfanumerický znak z~intervalu A--Z.}
\item{\textit{argument}: žádný nebo několik numerických znaků. Následuje bez mezery za příkazem. V~průběhu zpracování argumentu je testována korektnost zadaných hodnot. Pokud je argument nesprávný, je vypsána příslušná chybová zpráva a~příkaz stornován.}
\end{itemize}
\medskip

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Informační příkazy}
\begin{itemize}
\item{\texttt{H}: zobrazí nápovědu včetně základní syntaxe. Výpis nápovědy je uveden v~příloze \ref{kap:supp:help}.}
\item{\texttt{P}: test dostupnosti lokálně připojeného interface.}
\item{\texttt{V}: aktivuje/deaktivuje režim výpisu podrobných stavových informací v~průběhu komunikačních operací. Lze tak snadněji nalézt příčinu případných problémů.}
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Konfigurační příkazy}
\label{kap:iface:cfgcmd}
Tyto příkazy jsou určeny pro zápis a~čtení konfigurace interface. Hodnoty jsou uloženy v~paměti EEPROM a~jsou tedy trvalé i~po odpojení napájení. 
\medskip
\begin{itemize}
\item{\texttt{A}: zobrazí aktuální adresu interface.}
\item{\texttt{N<adresa>}: nastaví novou adresu interface. Argument adresa je trojciferná numerická hodnota v~intervalu 000-200.}
\item{\texttt{R<index>}: vypíše kód z~tabulky kódů. Argument index je trojciferná hodnota ukazující na konkrétní řádek v~této tabulce. Povolený interval je 000--200.}
\item{\texttt{W<index><kód>}: zapíše nový kód do tabulky kódů. Význam argumentu index je shodný s~příkazem R. Povolený rozsah čtyřciferného argumentu kód je 0000--9999.}
\item{\texttt{I}: zobrazí aktuální nastavení časových konstant. Výpis je proveden formou 5-tice tříciferných numerických řetězců oddělených mezerou. První tři řetězce z~levé strany reprezentují konstanty TX Delay, RX Delay a~RPTR Delay. Skutečná hodnota jejich časového údaje v~ms vznikne vynásobením zobrazeného čísla základním krokem 150 ms. Zbylé dva řetězce představují konstanty Tone Time a~Space Time. Jejich základní krok je 10~ms.}
\item{\texttt{K<TX Delay><RX Delay><RPTR Delay><Tone Time><Space Time>}: jedná se o~funkci, která hromadně uloží všechny časové konstanty. Akceptovatelný tvar argumentů konstant TX Delay, RX Delay a~RPTR Delay vznikne celočíselným podílem příslušné konstanty v~ms základním krokem 150 ms. Následuje doplnění o~počáteční nuly tak, aby výsledkem byl tříciferný numerický řetězec. Modifikace argumentů konstant Tone Time a~Space Time je podobný jako u~předchozích konstant, pouze základní krok je zde 10~ms. Pro všechny argumenty platí, že vypočtená hodnota musí ležet v~intervalu $\langle0;255\rangle$.}
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Komunikační příkazy}
\label{kap:iface:comcmd}
Následující tři příkazy jsou určeny ke spuštění komunikačních funkcí mezi lokálně připojeným a~vzdáleným interface. Komunikační protokol je popsán v~kapitole \ref{kap:iface:protocol}.
\par
Mezi společné rysy příkazů patří argumenty adresa a~opakovač, které musí obsahovat tříciferný numerický řetězec v~intervalu 000-999. Význam argumentů výstup a~čas je uveden v~kapitole \ref{kap:iface:direct}.
\medskip
\begin{itemize}
\item{\texttt{C<adresa><výstup><čas>}: požadavek na přenos povelu k~interface s~adresou adresa a~parametry výstup a~čas.}
\item{\texttt{D<adresa><opakovač><výstup><čas>}: požadavek na přenos povelu k~interface s~adresou adresa a~parametry výstup a~čas. K realizaci přenosu má být využito interface s~adresou opakovač jako zprostředkovatele.}
\item{\texttt{L<adresa>}: požadavek na ověření dostupnosti vzdáleného interface s~adresou adresa. Dostupnost je potvrzena výpisem \uv{L: Remote device alive.}}
\item{\texttt{X<výstup><čas>}: požadavek na vykonání povelu na lokálně připojeném interface. Parametry jsou výstup a~čas.}
\end{itemize}
\medskip
\par\noindent
V průběhu komunikace jsou na terminál zasílány stavové zprávy ve tvaru, které mohou být snadno zpracovány nadřazeným systémem pomocí regulárních výrazů. Současně jsou však srozumitelné i~pro člověka. Jedná se o~tři druhy zpráv, které se liší svým prefixem.
\medskip
\begin{itemize}
\item{\textit{Prefix EM – error message:} fatální chyba a~stornování komunikace.}
\item{\textit{Prefix IM – info message:} informativní zpráva vhodná do logu.}
\item{\textit{Prefix GM – good message:} potvrzení úspěšného předání povelu.}
\end{itemize}
\medskip
\par\noindent
Výpis stavových zpráv je uveden v~příloze \ref{kap:supp:states}. 


