VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky Obor Aplikovaná informatika
A p l i k a c e p ro v z d á l e n o u s p r á v u p o č í t a č e bakalářská práce
Autor: Jan Starka Vedoucí práce: Ing. Marek Musil Jihlava 2015
Abstrakt Tato bakalářská práce se zabývá návrhem a realizací aplikace pro vzdálenou správu počítače na platformě Microsoft .NET Framework. Řeší problematiku přenosu příkazů a videa přes sít internet s důrazem na co nejnižší množství přenesených dat a univerzální použitelnost bez ohledu na umístění koncových stanic, za použití standardizovaných a volně dostupných technologií, jako je protokol XMPP. Výsledkem této práce je plně funkční aplikace, která umožňuje vzdálenou správu počítače včetně přenosu videa a příkazů.
Klíčová slova .NET, C#, síťová komunikace, vzdálená správa, XMPP
Abstract This bachelor thesis deals with the design and implementation of application for remote computer management based at Microsoft .NET Framework. It solves an issue of commands and video transfer over the internet network with emphasis to the lowest amount of data transfer and universal usability regardless to end station location, with usage of standardized and freely available technologies, like XMPP protocol. The result of this thesis is fully functional application allowing remote management of computer, including video and commands transfer.
Key words .NET, C#, network communication, remote management, XMPP
Prohlašuji, že předložená bakalářská práce je původní a zpracoval/a jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil/a autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ. Byl/a jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom/a toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutí licence. V Jihlavě dne
............................................... Podpis
Poděkování Na tomto místě bych rád poděkoval svému vedoucímu práce Ing. Marku Musilovi za poskytnutí tématu a možnost vytvářet ho pod jeho vedením.
Obsah 1
Úvod.......................................................................................................................... 7
2
Současný stav na trhu ............................................................................................... 8
3
Analýza řešení......................................................................................................... 10
4
3.1
Instalátor ........................................................................................................... 11
3.2
Serverová část .................................................................................................. 11
3.3
Klientská část ................................................................................................... 12
3.4
XMPP zprávy ................................................................................................... 15
3.5
Navazování komunikace .................................................................................. 20
3.6
Připojení k ZeroTier ......................................................................................... 21
Implementace .......................................................................................................... 23 4.1
Použité technologie .......................................................................................... 23
4.2
Video proud ...................................................................................................... 26
4.3
Diagram užití .................................................................................................... 28
4.4
Implementace serverové části .......................................................................... 28
4.5
Implementace klientské části ........................................................................... 31
4.6
Implementace společné knihovny .................................................................... 34
5
Testování ................................................................................................................. 36
6
Závěr ....................................................................................................................... 37
Seznam použitých zdrojů ................................................................................................ 38 Seznam obrázků .............................................................................................................. 39 Seznam použitých zkratek .............................................................................................. 40 Přílohy............................................................................................................................. 41 1
Obsah přiloženého CD ............................................................................................ 41
2
Uživatelský manuál................................................................................................. 42
3
Diagramy ................................................................................................................ 44
1 Úvod Každá výpočetní technika se musí spravovat. Ať už se jedná o počítače nebo síťovou architekturu, někdy je potřeba spravit problém nebo provést rekonfiguraci. Tyto akce bývají náhodné a nepravidelné a často se požaduje jejich rychlé řešení. Pokud má daná infrastruktura k dispozici neustále technicky znalého administrátora, dají se problémy řešit rychle. Ne vždy tomu tak ale je, často si například firmy nechají zřídit infrastrukturu jednorázově a při poruše musejí spoléhat na externí pomoc, která nemusí být hned k dispozici. Navíc si odborní technikové účtují za všechny operace nemalé částky, zejména pokud je situace urgentní. Nyní ale existuje řešení, které v určitých případech může přispět k mnohem vyšší efektivitě. Tímto řešením je vzdálené připojení k dané infrastruktuře pomocí sítě internet, která už je nyní rozšířena téměř všude. Toto řešení se nazývá obecně „vzdálená správa“. Rozšíření internetu ale přináší i nevýhody. Touto nevýhodou je zejména velká vytíženost internetu a nyní již vyčerpaný počet veřejných adres. Čím více subjektů je tedy připojeno k internetu, tím je složitější vzájemné propojení uživatelů a dochází k velké centralizaci služeb. Existující programy a služby pro vzdálenou správu jsou buďto vytvářeny na míru dané firmě za jednorázový či opakující se poplatek nebo lze využít řešení, která jsou zdarma, ale jejich používání není triviální. Důvod, proč jsem se rozhodl se tomuto tématu věnovat je následující. Ve firmě Fotostudio v Jindřichově Hradci občas poskytuji podporu v IT oblasti, jako je správa systému, sítí a zejména řešení problémů. Majitel firmy i já bydlíme v Dačicích, takže kvůli každému problému jsem musel jezdit do Jindřichova Hradce. Z důvodu studijních povinností trávím navíc většinu času v Jihlavě, což situaci ještě více znesnadňuje. Proto mě napadlo využít možnost vzdálené správy, díky které bych se mohl připojit k firemním počítačům na dálku. Narazil jsem ovšem na řadu problémů. Aplikace, které jsou zdarma pro komerční použití, umožňují přístup pouze k počítačům s veřejnou IP adresou nebo správně přesměrovaným portem. V případě, že jak počítač, ze kterého se připojuje, tak i počítač, ke kterému se připojuje, veřejně přístupný z internetu, je nutné použít program, který toto omezení dokáže obejít a může použít server pro přesměrování dat. Takový program ale není zdarma pro komerční použití. Proto jsem se rozhodl vytvořit si program vlastní.
7
2 Současný stav na trhu Tato kapitola obsahuje souhrn současného stavu aplikací pro vzdálenou správu na trhu. V současnosti existuje několik aplikací pro vzdálenou správu. Některé z nich jsou komerčně zdarma použitelné, ostatní jsou placené buď jednorázově, nebo paušálně. Následuje jejich srovnání a rozdělení.
Aplikace pouze pro nekomerční použití o TeamViewer rozsáhlé možnosti funguje i mimo LAN klient, ke kterému se chceme připojit, nám musí poslat údaje pro připojení, které se pokaždé mění o Splashtop podobné vlastnosti jako TeamViewer poskytuje komplexní řešení na míru pro větší firmy aplikace podporuje mobilní zařízení se systémy Android a iOS o AmmyAdmin umožňuje komerční používání zdarma pouze na zkušební dobu funguje i mimo LAN řešení pro firmy požadující garanci funkčnosti nebo hlasovou komunikaci s klientem jednorázová licence o Microsoft Lync primárně instant messaging umožňuje předání kontroly na počítačem po souhlasu vzdáleného uživatele pouze pro větší firmy placeno měsíčně
8
Komerčně zdarma použitelné aplikace o Windows Remote Desktop aplikace pro vzdálenou správu od firmy Microsoft je integrovaná v systémech Windows, avšak pouze ve verzích Professional a vyšších při připojení vzdáleného uživatele přeruší práci uživatele, ke kterému se přihlašujeme funguje pouze v lokální síti o TightVNC funguje pouze v lokální síti mimo lokální síť je nutné nastavit směrování portu, což není vždy možné kvůli omezení poskytovatele, jako například symetrický NAT o
Chrome remote desktop aplikace spojená s prohlížečem Google Chrome umožňuje přístup mimo LAN uživatel, ke kterému se chceme připojit, musí poslat údaje pro připojení po nějakém externím kanálu, například pomocí e-mailu komerční použití není firmou Google specifikováno
9
Analýza řešení
3
Tato kapitola obsahuje analýzu řešení, návrh datových struktur, programových částí a grafického rozhraní. Cílem projektu je vytvořit aplikaci, která bude splňovat následující požadavky:
připojení ke vzdálené stanici
neexistence nutnosti schválení připojení
nepřetržitý a nepřerušitelný provoz
neexistence nutnosti veřejné dostupnosti kterékoliv strany
zabezpečené připojení
komerčně zdarma použitelné
Volitelně projekt bude obsahovat návrh, jak implementovat následující požadavky:
odesílání souborů na vzdálenou stanici
vytváření předdefinovaných úloh
Hlavním účelem aplikace bude schopnost připojit se ke vzdálené stanici. Touto stanicí bude desktopový počítač s operačním systémem Windows. Po připojení bude možno vidět obrazovku vzdálené stanice, dále bude možné stanici ovládat pomocí klávesnice a myši způsobem, jako kdyby uživatel byl u stanice fyzicky přítomen. Aplikace nebude vyžadovat žádnou akci od uživatele, ke kterému se uživatel vzdáleně připojuje, jako například zasílání připojovacích kódů, schvalování připojení nebo ruční spouštění. Aplikace bude běžet neustále na pozadí vzdálené stanice a bude čekat na připojení. Aplikace bude schopna propojit dva počítače bez ohledu na to, jestli jsou veřejně přístupné z internetu, zejména v případě, kdy je každý z počítačů v síti jiného poskytovatele bez veřejné IP adresy. Aplikace bude komerčně zdarma použitelná. Aplikace bude umožňovat odeslání souborů na vzdálenou stanici do vybraného umístění. Aplikace bude připravena na možnost rozšíření o vytvoření předdefinovaných úloh, které bude možné spustit buď jednorázově, nebo opakovaně. Aplikace bude zabezpečena před neoprávněným vzdáleným připojením heslem a seznamem povolených uživatelů. Aplikace bude podporovat pouze tyto základní operace, na rozdíl od některých komerčních aplikací, které umožňují například odpojit vzdáleného uživatele od kontroly periferií, spuštění video chatu nebo nahrávání obrazu. To zejména z důvodu dosáhnout co nejmenší síťové zátěže, aby aplikace odesílala pouze nejnutnější data. Aplikace se dělí do několika částí. Těmito částmi jsou instalátor, klientská aplikace, serverová aplikace. Instalátor je použitý pro distribuci aplikace, klientská část je použitá 10
pro připojování na vzdálené stanice a serverová část běží na vzdálené stanici a vykonává příchozí příkazy. Klient a server sdílejí některé části kódu, které se nacházejí ve společné knihovně.
3.1 Instalátor Tato část umožňuje snadno nainstalovat jak klientskou, tak serverovou část aplikace. Po spuštění se zobrazí výběr, zda chce uživatel na tento počítač nainstalovat serverovou nebo klientskou část. Po potvrzení výběru následuje možnost registrace vytvoření účtu na XMPP serveru. V případě výběru instalace serverové části následuje vytvoření hesla pro komunikaci a white listu povolených uživatelů, čímž se daná konfigurace zapíše do konfiguračního souboru. Uživatel má možnost vyexportovat soubor s nastavením pro import do klientské části. V případě výběru klientské části se instalace úspěšně ukončí. Uživatel potom na svojí domovské stanici s nainstalovanou klientkou částí naimportuje soubor, čímž se umožní vzdálená kontrola dané stanice. Druhou možností je přidat informace o vzdálené stanici ručně.
3.2 Serverová část Tato část aplikace se nachází na vzdálené stanici, která bude přijímat příkazy. Serverová část běží na pozadí, uživatel nemá možnost s aplikací jakkoliv manipulovat. Po spuštění serverové části se aplikace připojí na XMPP server pomocí přednastavených přístupových údajů a čeká na příkazy od klientské části. Až přijde zpráva o požadavku na připojení, provede se kontrola, zda běží služba ZeroTier, pokud ne, spustí se. Ve zprávě o požadavku připojení se bude nacházet identifikátor ZeroTier sítě, IP adresa v ZeroTier síti a porty pro přenos XMPP zpráv a pro přenos videa. Aplikace podle těchto dat naváže spojení na danou ZeroTier síť a v ní na přijatou IP adresu a port. Po XMPP kanálu běžící na TCP protokolu, se přijímají příkazy, jako je vstup myši a klávesnice. Po video kanálu běžícím na UDP protokolu se periodicky posílá video rozdělené do paketů. Pro spuštění této aplikace je potřeba minimálně operační systém Windows Vista a .NET framework verze 4.0.
11
3.3 Klientská část Tuto část má nainstalovanou vzdálený administrátor. Pomocí této aplikace lze ovládat vzdálenou stanici způsobem, jako byste u ní byli fyzicky přítomni. Tato aplikace se skládá z přihlašovacího okna, seznamu stanic, editoru seznamu a okna vzdálené stanice. Pro spuštění této aplikace je potřeba prozatím minimálně operační systém Windows 7 a .NET framework verze 4.5. Je pravděpodobné, že se v budoucnu požadavky sníží.
Obsah klientské části Klientská část aplikace obsahuje následující okna a komponenty:
přihlašovací okno
hlavní okno
seznam stanic
editor seznamu
okno vzdálené stanice
Přihlašovací okno Toto okno se zobrazí při spuštění aplikace. Uživatel do něj musí zadat přihlašovací jméno a heslo pro účet na XMPP serveru. Po úspěšném přihlášení se aplikace přepne do hlavního okna. Zadané uživatelské jméno se automaticky uloží do historie, takže uživatel nemusí příště jméno zadávat znovu
Obrázek 1: Přihlašovací okno
Hlavní okno Toto okno obsahuje seznam stanic a menu pro možnost otevření editoru seznamu, připojení ke stanici, odeslání aktualizace a zobrazení nápovědy.
12
Toto okno obsahuje následující části:
kontextové menu
seznam vzdálených stanic
odeslání aktualizace
Z kontextového menu lze otevřít editor vzdálených stanic, okno nastavení a okno „O programu“. Dále se z něho lze připojit k vybrané vzdálené stanici a odhlásit se z XMPP účtu. Tlačítko „Stáhnout aktualizaci“ slouží k odeslání aktualizace aplikace vzdálené správy a použije se následujícím způsobem. Nejdříve se do textového pole „Update URL“ vloží přímý odkaz na novou verzi serverové části programu. Tato URL musí vést na přímé stažení programu. Potom se v seznamu vzdálených stanic vybere stanice, kam aktualizaci chcete poslat. Nakonec se klikne na tlačítko „Stáhnout aktualizaci“ a na vybranou stanici se pošle zpráva s aktualizací. Tato zpráva způsobí to, že vzdálený server stáhne aktualizaci z dané URL, vytvoří a spustí dočasný aktualizační skript a server následně sám sebe ukončí. Skript smaže binární soubor serveru, přejmenuje stažený soubor a spustí ho. Následně skript smaže sám sebe.
Obrázek 2: Hlavní okno
Seznam stanic Z tohoto seznamu vybere uživatel stanici, ke které se chce připojit. Stanice je podbarvena zeleně, jestliže je připojená a červeně, jestliže je odpojená. Pokud se uživatel pokusí připojit k odpojené stanici, nejdříve se pošle zpráva, tázající se, zda je stanice připojena. Pokud stanice odpoví, podbarví se zeleně a začne proces navazování spojení vzdálené správy. Je možné vybrat pouze jednu stanici najednou. Tento seznam lze upravit pomocí editoru seznamu.
13
Editor seznamu Pomocí okna editoru lze přidat, odstranit a upravit existující stanice. U každé stanice je potřeba nadefinovat XMPP jméno, popis stanice, heslo pro komunikaci a white list. Pokud se pole hesla a white listu změní, automaticky se pošle na vzdálenou stanici zpráva, která dané parametry změní i vzdáleně. Kdyby se totiž uživatele pokoušel komunikovat se špatným heslem, všechny zprávy by byly automaticky zahozeny. Stanici je možno přidat, smazat nebo upravit tlačítky pro to určenými. Po úpravě je nutno kliknout na tlačítko „Uložit“, aby změny nebyly zahozeny.
Obrázek 3: Editor seznamu stanic
Okno vzdálené stanice Toto okno se zobrazí, pokud je připojení ke stanici úspěšné. Zde vidí administrátor obrazovku vzdálené stanice. Obraz se automaticky přizpůsobí velikosti okna. Komponenta obrazu přijímá kliknutí levým a pravým tlačítkem myši, dvojité kliknutí levým tlačítkem myši, přetažení a vertikální pohyb kolečka. Dále přijímá vstupy z klávesnice. Mezi přijímané patří znaky ASCII včetně diakritiky, mrtvých kláves a číslic, dále fungují klávesové zkratky v kombinaci s klávesami Shift, Control a Alt. Veškerá interakce s tímto oknem se automaticky odesílá na vzdálenou stanici, kde se provádí. Daná interakce vyvolá změnu obrazu, která je poslána zpět do tohoto okna vzdálené stanice.
14
Obrázek 4: Okno vzdálené stanice
3.4 XMPP zprávy Pro komunikaci mezi klientem a serverem se používají XMPP zprávy. XMPP zprávy mají syntaxi ve tvaru XML. Zprávy se skládají z následujících částí:
hlavička
předmět
heslo
obsah zprávy
zakončení
Každá zpráva začíná následující hlavičkou, kde
[email protected] je uživatelské jméno stanice, kam zprávu posíláme a
[email protected] je uživatelské jméno stanice, která zprávu poslala: <message to="
[email protected]" type="normal" from="
[email protected]" xml:lang="cs" xmlns="jabber:client">
Následuje předmět zprávy, podle kterého se rozlišuje typ zprávy. Předmět vypadá takto: <subject>Předmět. Následující obrázek popisuje, jaké typy zpráv existují a odkud kam se posílají.
15
Obrázek 5: Typy zpráv
Dále každá zpráva musí obsahovat správné heslo. Zprávy s neplatným nebo chybějícím heslem jsou zahozeny. Heslo se ve zprávě vkládá takto: <Password>heslo. Heslo musí být ve zprávě zařazeno bezprostředně za předmětem, aby zpráva byla správně zpracována. 16
Nejdůležitější na zprávě je její obsah. Zprávy mohou mít speciální XML tagy pro dodatečná data, která vypadají jako <SpeciálníTag>data. Následuje popis zpráv, které aplikace dokáže zpracovat a vytvořit.
Zprávy pro ovládání myši Většina těchto zpráv má dva společné speciální tagy: Xcoord a Ycoord. Tyto tagy určují pozici na souřadnicích X (horizontálně) a Y (vertikálně). Například následující tagy popisují souřadnici X o velikosti 500 a Y o velikosti 300: <Xcoord>500
300. Všechny zprávy pouze simulují danou činnost. Následuje seznam zpráv pro ovládání myši a jejich popis. MoveMouse – přesune myš na souřadnice dané tagy Xcoord a Ycoord. ClickMouseLeft – provede kliknutí levého tlačítka myši na souřadnicích daných tagy Xcoord a Ycoord. ClickMouseRight – provede kliknutí pravého tlačítka myši na souřadnicích daných tagy Xcoord a Ycoord. DoubleClickMouse – provede dvojité kliknutí levého tlačítka myši na souřadnicích daných tagy Xcoord a Ycoord. DragMouse – provede stisknutí a držení levého tlačítka myši na souřadnicích daných tagy Xcoord a Ycoord. DropMouse – provede uvolnění levého tlačítka myši na souřadnicích daných tagy Xcoord a Ycoord. Kombinace DragMouse a DropMouse se používá pro přetahování objektů. MouseWheel – provede posun kolečka vertikálně. Tato zpráva obsahuje tagy Delta a Sign. Tag Delta má hodnotu násobku čísla 120. Každý násobek čísla 120 znamená jeden krok posunu kolečka myši. Tag Sign má hodnotu „plus“ nebo „minus“ a řídí se podle něho to, zda se kolečko má otočit směrem dopředu nebo dozadu.
Zprávy pro ovládání klávesnice PressKey – tato zpráva simuluje stisk klávesy ve smyslu stisku a uvolnění. Klávesa, která se stiskne je popsaná tagem Keycode. Tento tag obsahuje virtuální kód klávesy, který odpovídá kódu pro WinAPI. Při implementaci není nutné vytvářet žádnou tabulku převodů kódů kláves. Kód klávesy je celé číslo. Příklady kódů: 20 = „Caps Lock“, 50 = „ě“, 65 = „a“. Kódy 66 a dále odpovídají anglické abecedě. Dalšími tagy jsou KeyCtrl, KeyShift, KeyAlt. Tyto tagy mohou mít hodnotu nula nebo jedna. Pokud 17
má tag hodnotu 1, znamená to, že se stiskne navíc odpovídající klávesa při simulaci stisku klávesy. Například, pokud je KeyCtrl rovno jedné a Keycode rovno 65, stiskne se klávesová zkratka Control+A.
Stahování dat Tyto zprávy umožňují stažení souboru na vzdálený počítač a odeslání aktualizace serverové části. DownloadUpdate – odešle aktualizaci serverové části. Obsahuje tag Address, který obsahuje URL, ze které se aktualizace stáhne a nainstaluje. URL musí odkazovat na přímé stažení, jinak aktualizace nebude fungovat. Některé znaky URL je nutné upravit na příslušnou escape sekvenci dle [4]. DownloadFile – odešle soubor z klientského počítače, do počítače, na kterém běží serverová část. Obsahuje tagy Port, Filename a Destination. V tagu Port je číslo TCP portu, na který se server připojí. Pro přenos souboru se vytvoří dočasný TCP kanál pro přenos dat souboru. Tag Filename obsahuje jméno souboru, pod kterým se má stažený soubor uložit. Tag Destination obsahuje cestu, kam se má soubor uložit.
Připojování Tyto zprávy se posílají v průběhu připojování na vzdálenou stanici. Jsou nutné pro výměnu informací potřebných k připojení. GetScreenResolution – odešle dotaz na zjištění rozlišení obrazovky na stanici, kde běží server. Tato zpráva nemá žádné speciální tagy. ScreenResolution – odpověď na zprávu GetScreenResolution. Obsahuje rozlišení vzdálené stanice, které je potřeba pro přepočet souřadnic. Rozlišení je popsáno tagy Width a Height. ZeroTierID – stěžejní zpráva pro připojení. Tato zpráva obsahuje tagy ID, IP, PortVideo, PortXMPP. Tag ID obsahuje jedinečný identifikátor sítě ZeroTier, do které se musí server připojit, aby fungoval video přenos. Tag IP absahuje IP adresu v rámci ZeroTier sítě. Tag PortVideo obsahuje UDP port, na který se server připojí a kam se následně odesílá video proud obrazovky. Tag PortXMPP je TCP port, po kterém jde komunikace v XMPP zprávách z důvodu minimalizace zátěže na XMPP server, přes který bylo spojení inicializováno. ChangeParam – změní nastavení v konfiguračním souboru serveru. Obsahuje tagy Name a Value. Tag Name obsahuje název proměnné v konfiguračním souboru, tag Value 18
obsahuje hodnotu, na kterou se má tato proměnná upravit. Pokud tato promenná neexistuje, bude vytvořena. Touto zprávou lze upravit například heslo pro komunikaci, uživatelské jméno nebo while list. Ping – neobsahuje žádné speciální tagy. Používá se, když klient potřebuje zjistit, zde je server aktuálně aktivní. Pong – také neobsahuje žádné speciální tagy. Je odpovědí serveru na Ping. Disconnect – odpojení od stanice. Přeruší přenos videa i XMPP zpráv přes ZeroTier a server se vrátí na příjem zpráv z XMPP serveru.
Předdefinované úlohy Aplikace bude umožňovat vytvořit předdefinované úlohy, které se budou spouštět buď jednorázovým požadavkem, nebo automaticky opakovaně v předdefinovaném periodickém čase. AddTask – přidá předdefinovanou úlohu. Obsahuje tagy Name, Path, Periodic, Time. Tag Name obsahuje jedinečné jméno úlohy, pomocí které se úloha vzdáleně spustí. Tag Path obsahuje cestu k danému souboru, který se tímto příkazem spustí. Tento soubor může být jakýkoliv skript či program, který je na vzdálené stanici nastaven tak, aby se vykonal při běžném systémovém volání pro spouštění. Může to být buď binární program (*.exe), dávkový soubor nebo skript v libovolném jazyce jako například Python nebo Perl. Tag Periodic říká, zda má být úloha spouštěna periodicky. Nabývá hodnot nula nebo jedna. Tag Time obsahuje časovou periodu, která říká, jak často se má ploha opakovat. Hodnota periody je v sekundách. RunTask – spustí předdefinovanou úlohu. Obsahuje tag Name, který říká, která úloha se má spusit. RemoveTask – odstraní předdefinovanou úlohu. Obsahuje také tag Name pro identifikaci úlohy, která se má odstranit.
Zabezpečení Aplikace bude obsahovat dva typy zabezpečení. Prvním je již zmíněné heslo. Serverová část aplikace má heslo nastavené v konfiguračním souboru. Při příchozí zprávě se heslo zprávy porovná s nastavením aplikace. Je možné, aby klient heslo vzdáleně změnil pomocí speciální zprávy. V momentální podobě návrhu se heslo přenáší nešifrovaně. Vzhledem k povaze hash funkcí, která se k posílání hesel zpravidla posílá, by šifrování na úrovni aplikace nepřineslo žádné zvýšení zabezpečení. Pro zabezpečení hesla se
19
doporučuje připojovat se k serveru pomocí šifrovaného spojení, které znemožňuje odchycení hesla třetí osobou, protože se data dešifrují až na cílovém počítači. Druhým způsobem zabezpečení, který se používá současně s heslem je tzv. „white list“, neboli „seznam povolených uživatelů“. Každý server v konfiguračním souboru seznam uživatelských jmen. Pouze uživatelé přihlášení pod těmito jmény mohou posílat zprávy na server, ostatní budou zahozeny.
3.5 Navazování komunikace Následující diagram zobrazuje, jakým způsobem se navazuje připojení se vzdálenou stanicí.
Obrázek 6: Navazování připojení
Když se uživatel chce připojit na vzdálenou stanici, provedou se následující operace. Nejdříve se odešle Ping na server. Jestliže je server připojen, odpoví zprávou Pong. Pokud je server odpojen, zobrazí se chybová hláška. Když přijde zpráva Pong, spustí se konstruktor okna vzdálená stanice a odešle se zpráva GetScreenResolution žádající server 20
o rozlišení obrazovky. Pokud server neodpoví zprávou ScreenResolution, aplikace se dostane do chybového stavu a okno vzdálené stanice se uzavře. To se může stát pouze v případě nečekaného výpadku připojení k internetu. Když zpráva přijde, rozlišení je uloženo do patřičných proměnných a odešle se zpráva ZeroTierID s informacemi, které server potřebuje k navázání video přenosu. Server se pak připojí dle instrukcí zadaných zprávou. Možnost, že by se server nepřipojil, spadá mimo tento diagram.
3.6 Připojení k ZeroTier Následující diagram ukazuje, jaké operace probíhají při připojení k síti ZeroTier.
Obrázek 7: Připojení k síti ZeroTier
Aplikace nejdříve zjistí, zda je služba ZeroTier nainstalovaná. Pokud ne, nainstaluje se správná služba podle toho, zda je operační systém 64 nebo 32 bitový. Dále se služba spustí. Pak se spustí příkaz pro připojení k síti. Identifikátor sítě přijde přes XMPP zprávu. 21
Začne se posílat periodicky ping na IP adresu klienta v síti ZeroTier pomocí protokolu ICMP. Ping se posílá do té doby, dokud nepřijde první odezva. To je nutné proto, že připojení k síti ZeroTier nějakou dobu trvá. Pokud by se toto neprovedlo, data by se ze začátku ztrácela.
22
4 Implementace Tato kapitola obsahuje popis implementace aplikace, použité technologie, popis tříd a jejich metod.
4.1 Použité technologie Stěžejní funkce aplikace, kvůli kterým byla implementována, by nebyly proveditelné, kdyby neexistovaly některé programy a knihovny, které danou funkčnost umožňují.
4.1.1 XMPP protokol Protokol byl původně založen pro účely instant messagingu, lze ho ale použít i pro komunikaci mezi počítači. Funguje na principu posílání krátkých XML zpráv. Protokol má plně otevřenou. Knihovny, které protokol implementují, existují téměř pro každý rozšířenější programovací jazyk. Protokol je zaštítěn skupinou XMPP Standards Foundation [1] a je specifikován v dokumentu RFC-3920 [2]. Pro přenos XMPP zpráv se standardně používá protokol TCP, protože má XMPP zprávy jsou krátké a garance doručení TCP protokolu tedy síť nijak nezatěžuje. Navíc při použití TCP jsou zprávy seřazené a lze je číst a posílat jednu za druhou, aniž by bylo nutné kontrolovat konzistenci zprávy. Aby komunikace fungovala, je potřeba najít XMPP server, ke kterému se připojit. Na tomto serveru uživatel musí vytvořit nový uživatelský účet. Při vytvoření účtu si vybere jedinečné uživatelské jméno. Uživateli pak lze posílat zprávy na jedinečný identifikátor ve tvaru „
[email protected]“. Pod vytvořeným účtem se uživatel přihlásí a pak už může posílat zprávy. Pro poslání zprávy je potřeba vědět adresu uživatele, kterému zprávu chce poslat. Výhodou je, že nezáleží, na kterém serveru je uživatel, jemuž chceme zprávu poslat, zaregistrován. Servery jsou mezi sebou synchronizované a zprávy si posílají navzájem. Protokol definuje několik typů zpráv. Hlavním typem je zpráva, kterou posílá jeden uživatel druhému, ta je uzavřena v XML tagu „message“. Existují i další, jako třeba tag „presence“, který oznamuje stav uživatele, jako například „Nerušit“ nebo „Pryč“. Tag „iq“ je používán pro využití různých nadstandartních služeb, který může server poskytovat, jako třeba registrace uživatele, vlastní seznam uživatelů nebo hledání 23
uživatelů. Pro účely implementace této aplikace se použije pouze tagu „message“, ostatní se budou používat pouze do míry, která je nezbytně nutná pro správnou komunikaci se serverem.
4.1.2 XMPP knihovna Před implementací bylo potřeba nejdříve najít knihovnu, která obsahuje implementaci XMPP protokolu. Pro prostředí .NET existuje knihoven několik, můj výběr se nakonec omezil na dvě. První je knihovna „JabberNet“ od firmy Google. Tu bohužel nebylo možné použít, protože měla špatně implementované přihlašování a šifrování. Druhá knihovna, která také byla nakonec použita, se jmenuje „Ubiety XMPP“. Ovšem i tam bylo nutné spravit část, kdy se knihovna připojovala k serveru šifrovaným spojením. Dále bylo nutné upravit část, která přijímala zprávy, protože knihovna neobsahuje dokumentaci a není tedy jasné, jak zprávy přijímat. Příjem zpráv Knihovna automaticky vytvoří třídy, které lze programově zpracovat ze zpráv, které jsou definovány XMPP protokolem. Pro případy implementace aplikace pro instant messaging je toto chování vhodné. Pro potřeby tohoto projektu to ale vhodné není, protože zprávy mají vlastní formát, který je rozdílný od standardu. Příjem surových zpráv Do knihovny byla přidána událost „OnRawMessage“, která vrací příchozí zprávu těsně po tom, co je přečtena ze síťového proudu. To sice vytváří nevýhodu, že metodu aktivují i zprávy, které tento projekt nepoužívá, ale těchto zpráv je minimum. Tato metoda vrací přijatou zprávu v podobě textového řetězce, který je potřeba dále analyzovat pomocí konečného automatu. Pro potřeby tohoto projektu je to vhodné, protože s postupem ruční analýzy zpráv bylo počítáno od začátku návrhu. Odesílání zpráv Je s podivem, že původně knihovna vůbec možnost odesílání zpráv neumožňovala, bylo tedy nutné přidat veřejnou metodu „SendString“, která posílá textový řetězec zadaný parametrem metody. Metoda neprovádí žádnou kontrolu XML validity odesílané zprávy, takže je potřeba validitu ošetřit v klientské aplikaci.
24
4.1.3 ZeroTier One Tento program je nezbytný proto, aby aplikace dokázala komunikovat mimo lokální síť. ZeroTier One je projekt s otevřeným zdrojovým kódem, který vytváří virtuální lokání síť mezi počítači bez ohledu na to, kde se jednotlivé počítače nacházejí. Protokol XMPP posílá pouze krátké zprávy s mizivým objemem dat, takže nelze použít pro přenos videa. ZeroTier dělá to, že zjišťuje, který typ NAT používá lokální síť, ve které se počítač nachází, pro připojení k internetu a na základě toho vytvoří oboustranné spojení mezi dvěma vzdálenými počítači. Program je schopný takto udržovat spojení s mnoha počítači najednou. Pokud spojení není možné, použije se k přemostění dat server s veřejnou IP adresou, což ovšem zmenšuje rychlost spojení. Pro připojení do virtuální sítě je potřeba udělat následující. Nejdříve je nutné si z domovských stránek ZeroTier One [3] stáhnout a nainstalovat aplikaci ZeroTier. Tato aplikace v počítači vytvoří službu a virtuální síťový adaptér. Dále je potřeba na stejných stránkách vytvořit nový účet a přihlásit se do něj. Pod tímto účtem pak uživatel vytvoří vlastní virtuální síť, které přiřadí libovolné jméno. Tato síť dostane přiřazený jedinečný identifikátor, který se skládá z šestnácti znaků šestnáctkové soustavy. Dále si uživatel může vybrat, zda bude síť, kterou vytvořil privátní nebo veřejná. Pokud je síť privátní, je potřeba každý nové přihlášený počítač schválit. Pokud je síť veřejná, může se do sítě připojit kdokoli. Uživatel pak otevře grafické rozhraní programu, který nainstaloval a zde zadá identifikátor sítě. Tímto se virtuální síťové kartě přiřadí virtuální IP adresa. Od té doby mohou všechny programy v počítači posílat data na adresy v této síti, aniž by se musely starat o to, zda je vzdálená adresa dosažitelná, o to se postará služba ZeroTier. Tato aplikace tedy poskytuje pouze vrstvu pro komunikace, ale neposkytuje žádné služby. Těmito službami může být cokoli, co komunikuje přes síť, například tedy webový server, e-mailový server, sdílení souborů nebo datových proudů.
25
Obrázek 8: Webová aplikace ZeroTier One
Ve webové aplikaci ZeroTier lze vytvářet vlastní sítě a upravovat a mazat existující. Pro účely této aplikace stačí vytvořit pouze jednu síť. To se provede tak, že do pole „network name“ zadáme uživatelsky přívětivý název sítě a klikneme na tlačítko „Create Network“. Vytvořená síť se zobrazí na začátku stránky. Zde můžeme vidět identifikátor skládající se z hexadecimálního čísla o délce šestnácti znaků. Dále je možné vybrat, zda síť bude veřejná nebo privátní. U privátní sítě je potřeba schválit připojované počítače. Webová aplikace má ještě další možnosti, jako třeba povolené pakety nebo typ přiřazování IP adres, které není potřeba měnit pro potřeby tohoto projektu. Nakonec v nejnižší části vidíme seznam počítačů, jejich IP adresy, dobu, kdy byly naposledy připojeny k této síti a uživatelský popis. Je možné každou stanici odstranit tlačítkem se symbolem křížku.
4.2 Video proud Po připojení klienta k serveru se vytvoří video proud s obsahem obrazovky počítače, na kterém běží server. Tento video proud není generován kodekem, ale je skládán z malých obrázků. Obrazovka počítače serveru se rozdělí na mřížku dvacet krát dvacet. V aplikaci 26
běží vlákno, které periodicky porovnává obsah obrazovky a vytváří rozdílové výřezy o velikosti jedné dvacetiny obrazu. Tyto rozdíly jsou posílány pomocí UDP protokolu na počítač klienta, kde jsou poskládány do původní podoby. Celý obraz při každé časové periodě se neodesílá proto, aby se snížilo množství odesílaných dat.
Odesílání videa Data se odesílají po jednotlivých paketech. Každý paket obsahuje jeden obrázek. Pokud se obrázek do paketu nevejde, je rozdělen do více paketů. Strukturu paketů ukazuje následující obrázek.
Obrázek 9: UDP paket
Hodnoty X, Y, D a I jsou celá čísla. X a Y jsou souřadnice, na které se má obrázek vložit a mohou mít rozsah nula až devatenáct. D je počet paketů, ze kterých se obrázek skládá. D se rovná jedné, jestliže se paket vešel do jednoho obrázku. Když je D větší než jedna, znamená to, že je obrázek rozdělený do několika paketů. Hodnota I pak značí, kolikátý paket je aktuální. I tedy dosahuje hodnot jedna až D a to tak, že první paket rozděleného obrázku má číslo jedna, druhý číslo dva až do té doby, dokud se neodešlou všechny pakety, kdy je I rovno D. Data v paketu je obrázek ve formátu PNG. Tento formát byl zvolen kvůli tomu, že obsahuje kompresi, která zmenšuje velikost obrázku. Tato komprese ovšem nezmenšuje čitelnost obrázku.
Příjem videa Video proud se přijímá paket po paketu. U každého paketu se čte hlavička a podle hlavičky program zjistí, kam má obrázek vložit. Obrázek se vloží na pozici X a Y v poměru vůči velikosti videa na straně klienta. Například, pokud je video zmenšeno na velikost 300 krát 300, obrázek se zmenší v poměru a vloží se na odpovídající místo v mřížce. Pokud je obrázek rozdělen do více paketů, uloží se do dočasného zásobníku. Až tehdy, když se přijme poslední paket dané souřadnice, je obrázek vložen na své místo do videa.
27
4.3 Diagram užití Diagram užití pro klienta Aplikace na straně klienta má jediného aktéra. Tím je uživatel. Předpokládá se, že vzdálenou správu bude mít na starosti uživatel znalý postupů a rizik, má tedy neomezený přístup ke všem funkcím programu. Diagram je v příloze 3.4.
Diagram užití pro server Serverová část má dva aktéry. Prvním je uživatel, který program vzdáleně ovládá. Jeho vstupy jsou přijímány serverem a dále simulovány a vykonávány pomocí funkcí systému. Druhým aktérem je čas. Tento aktér je virtuální. Periodické úlohy se pouští automaticky a rozhodujícím prvkem je právě čas. Diagram je v příloze 3.5.
4.4 Implementace serverové části Třída ControlCore Hlavní třída serverové části. Jejím úkolem je navázat a udržovat připojení na XMPP server, provádět vzdálené příkazy, odesílat video a připojit se k síti ZeroTier. Konstruktor – načte data z konfiguračních souborů a podle těchto dat se připojí k XMPP serveru. Dále konstruktor vytvoří vlákna, bitmapy a delegáty. Vlákna jsou vytvářena pro odesílání videa, příjem XMPP zpráv po síti ZeroTier a udržování XMPP spojení. Spuštěno je pouze vlákno pro udržování spojení a vlákno pro navázání spojení na XMPP server, které je ale plně v režii XMPP knihovny. Ostatní vlákna se spustí až po připojení klienta. Bitmapy se používají při vytváření video přenosu. Do těchto bitmap se později ukládají data sejmutá z obrazovky. Delegáti jsou potřeba pro zpětná volání při příjmu XMPP zprávy. OnInvalidCertificate – obsluha události XMPP knihovny. Tato událost nastává, když server pošle certifikát, který není na stanici nainstalován. Třída provede to, že certifikát nainstaluje do úložiště kořenových certifikátů. Je úkolem administrátora používat XMPP server, který je důvěryhodný, aby se do systému nenainstaloval certifikát, který by mohl později způsobit škody. OnRawMessage – obsluha události XMPP knihovny. Tato událost se vyvolá, když přijde nová zpráva po XMPP kanálu. Nejdříve se zjistí, zda zpráva začíná řetězcem „<message“. Pokud ano, pošle se zpráva na zpracování do metody ProcessMessage. Pokud zpráva
28
začíná jiným textem, ignoruje se. U některých serverů se stává, že připojení selže a přijímají se pouze prázdné zprávy. V tom případě se spojení přeruší a znovu se naváže. BuildKeyPress – vytvoří strukturu pro použití v systémovém volání SendInput. Parametry funkce je kód klávesy a klávesové zkratky, které se mají stisknout. Výstupem metody je pole INPUT. Do tohoto pole se nejdříve vloží hodnoty pro klávesu ve stisknuté poloze a pak hodnoty v uvolněné poloze. Pokud se vytváří zkratka, je potřeba nejdříve přidat klávesu zkratky a pak klávesu s kódem. Po zavolání funkce SendInput se nasimuluje stisk kláves v tom pořadí, ve kterém byly vloženy do pole. DownloadUpdate – stáhne aktualizaci z daného umístění. Parametrem je URL, odkud se má aktualizace stáhnout. Soubor se stáhne po jménem „downloaded“. Následně se vytvoří aktualizační skript v podobě dávkového souboru pod jménem „updater.bat“. Nakonec je aktualizační skript spuštěn a program ukončí sám sebe. Aktualizační skript pak smaže serverovou část aplikace, přejmenuje stažený soubor a spustí ho. Nakonec se skript smaže. SetRemoteEndPoint – Vytvoří sokety pro síťovou komunikaci a naváže spojení k síti ZeroTier dle dat z příchozí zprávy. Dále naváže spojení na těchto soketech a vytvoří vlákna pro posílání videa a XMPP komunikaci po síti ZeroTier. Sokety se vytvoří tak, aby se připojily na portech, které nejsou obsazeny. Nakonec se vytvoří bílý obdélník do objektu grafiky pro ukládání obsahu obrazovky. To je proto, aby se při prvním porovnání obrazovek poslal kompletní obraz. CompareScreens – porovná snímky obrazovek uložených v proměnných a vytvoří seznam rozdílových obrázků. Snímky jsou uloženy v instančních proměnných screenBitmap a screenBitmap2 typu Bitmap. Pomocí funkce LockBits se získají surová data obrázku a uloží se do proměnné typu BitmapData. Tyto data se pak pomocí vlastnosti Scan0 zkopírují do dvou polí, pro každou bitmapu jedno. Zpracování obrázku tímto způsobem je nesrovnatelně rychlejší než získávat pixely přímo z bitmapy pomocí metody GetPixel. Tyto pole se porovnají standartním for cyklem. Pokud se hodnoty liší, provede se následující. Z aktuálního indexu pole se spočítá, do kterého obdélníku v rozsahu dvacet krát dvacet daný pixel spadá. Otestuje se, zda tento obdélník již je v seznamu pro odesílání. Pokud ne, přidá se do seznamu nový obdélník. Do tohoto obdélníku se uloží daný výřez snímku obrazovky. Takto se porovnají celá pole. Až cyklus dokončí činnost, funkce vrátí seznam rozdílných obrázků. UdpVideoStreamer – odesílá periodicky aktuální obraz klientovi. Tato metoda běží v samostatném vlákně. Funkce běží v cyklu while, který je ovládán hodnotu proměnné 29
threadRunVideo. Na začátku cyklu se získá snímek celé obrazovky a uloží se do proměnné. Druhý snímek obrazovky, který se porovnává, už je zachycen buď z předchozí iterace cyklu, nebo z inicializace bitmapy, kde je snímek uložen. Voláním funkce CompareScreens se získá seznam rozdílných obrázků. Proměnná screenBitmap2 se nyní přepíše obsahem proměnné screenBitmap. Pokud byl seznam obrázků prázdný, vlákno se uspí na jednu sekundu a cyklus přejde do další iterace. Nyní se v cyklu projde seznam obrázků a postupně se odešle přes síťový soket. To se děje následujícím způsobem. Nejdříve se vytvoří proměnná ms typu MemoryStream. Tato proměnná se chová jako proud dat, který se ukládá do paměti. Nejdříve se do proudu uloží souřadnice, na které se má obrázek vložit. Pak se obrázek převede do formátu JPEG a zjistí se, zda je jeho délka menší než 1468 bytů. Pokud je obrázek menší nebo roven této hodnotě, do proudu ms se zapíší dvě jedničky, jak je vysvětleno v kapitole o přenosu videa. Do proudu se zapíše obrázek ve formátu JPEG a odešle se metodou Send přes síťový soket. Pokud je větší, spočítá se, kolik paketů je potřeba na jeho přenesení. Následně se proud postupně přepisuje tak, že se zvyšuje identifikátor pořadí paketu do té doby, dokud nedosáhne počtu celkových paketů pro daný obrázek. Po každém přičtení identifikátoru pořadí se do proudu opět zapíše obrázek ve formátu JPEG a odešle se přes síťový soket. TcpXmppReceiver – přijímá XMPP zprávy po ZeroTier síti. Metoda běží ve vlastním vlákně. Metoda nejdříve čeká na připojení od klienta. Když se připojení naváže, funkce periodicky testuje, zda přišla data na soket. Pokud přišla, přijatá data se nejdříve ověří. Otestuje se, zda je zpráva celá. Pokud se jedná o zprávu Disconnect, uzavře se XMPP soket a vypne se odesílání vida i připojení na klienta. Pokud se přijalo více zpráv najednou, rozdělí se. Nakonec se zprávy zašlou do metody ProcessMessage a cyklus se opakuje. ChangeParam – změní parametr v konfiguračním souboru. Technologie .NET umožňuje použít konfigurační soubor, který se načte automaticky při spuštění programu. Toho bylo využito a veškerá konfigurace serveru se ukládá a načítá z tohoto souboru. Pro načtení konfigurace
se
použije
metoda
OpenExeConfiguration
ze
statické
třídy
ConfigurationManager. Dále se získá sekce userSettings pomocí metody GetSectionGroup. V této sekci se nachází všechna potřebná nastavení. Pomocí tříd jako je XmlDocument a dalších z této třídy odvozených se upravuje XML kód konfigurace, aniž by bylo nutné XML parsovat ručně. Metoda ChangeParam tedy nejdříve zjistí, zda nastavení dané vstupním parametrem existuje. Pokud existuje, upraví 30
se jeho hodnota podle vstupního parametru. Pokud neexistuje, hodnota se vytvoří. Nakonec se takto upravená konfigurace uloží zpět na disk a provede se její znovunačtení pomocí metody RefreshSection.
4.5 Implementace klientské části Soubory Klientská aplikace pracuje s několika konfiguračními soubory ve formátu XML. Jejich seznam je následující:
seznam stanic
historie uživatelských jmen
identifikátor ZeroTier sítě
Třída LoginForm Implementuje přihlašovací dialog. Tento dialog se zobrazí při spuštění aplikace. Konstruktor – parametrem je reference na hlavní okno. Zjistí se, zda existuje soubor s historií uživatelských jmen. Pokud ano, provede se deserializace souboru a hodnoty ze souboru se načtou do seznamu historie. Seznam historie se načte do ComboBoxu, kam se zadává uživatelské jméno. AddXmppToHistory – přidá daný účet do historie uživatelských jmen a tento seznam uloží do souboru. Pokud již soubor existuje, je přepsán. Tato metoda je veřejná a volá se z hlavního okno. To se děje proto, aby se do seznamu ukládala pouze platná uživatelská jména, ke kterým se uživatel úspěšně přihlásil. Pokud uživatelské jméno již existuje, nepřidá se, funkce tedy kontroluje duplikáty.
Třída MainForm Konstruktor – vytvoří delegáty pro zpětná volání při příchozí XMPP zprávě. Dále vytvoří instanci XMPP knihovny, společné knihovny a přihlašovacího formuláře. Ping – pošle zprávu Ping na XMPP adresu danou parametrem. XmppOnMessage – obsluha události při přijaté XMPP zprávě. Nejdříve se ověří, zda má zpráva správnou XML hlavičku. Pokud ano, pošle se zpráva na zpracování do metody ProcessMessage. Pokud uvnitř metody ProcessMessage dojde k vyjímce typu XmlException, tak se výjimka ignoruje, protože některé XMPP servery mohou posílat neočekávané zprávy, takže nelze postihnout konkrétní případy. Mělo by však být zajištěno, že správné zprávy budou řádně zpracovány. 31
XmppOnError – obsluha události při chybě v XMPP komunikaci. Dle parametru ErrorEventArgs se zjistí, k jaké chybě došlo. Pokud dojde k chybě při autorizaci, zobrazí se chybová hláška a je zobrazen přihlašovací dialog. Ostatní chyby se zaznamenávají do logu. ConnectToRemoteStation – připojení na vzdálenou stanici. Metoda se pokusí připojit na tu stanici, která je vybraná v seznamu stanic. Nejdříve se ověří, zda je počítač připojen v síti ZeroTier. Na stanici se pošle zpráva Ping a proměnná waitForPong se nastaví na true. Vytvoří se instance časovače nastavená na dvě sekundy. Pokud stanice do té doby neodpoví, zobrazí se příslušné oznámení. XmppLogin – připojí se k XMPP serveru. Parametrem metody je uživatelské jméno a heslo XMPP účtu. Z uživatelského jména se vyextrahuje regulárním výrazem název serveru. Nastaví se potřebné parametry XMPP knihovny a přiřadí se metody obsluhující události. Nakonec se spustí připojení metodou Connect. XmppOnAuthenticate – obsluha metody XMPP knihovny, pokud bylo přihlášení úspěšné. Metoda pošle zprávu Ping na všechny stanice v seznamu a přidá uživatelské jméno do souboru historie pomocí metody AddXmppToHistory. XmppWrite – odešle zprávu přes XMPP kanál. Metoda se rozhoduje podle toho, zda je navázáno XMPP spojení přes síť ZeroTier. Pokud ano, tak se zpráva pošle přes patřičný soket. Pokud ne, pošle se zpráva přes knihovnu XMPP. Pong – zpětné volání knihovny při příchozí zprávě Pong. Parametrem je uživatelské jméno stanice, která zprávu odeslala. Metoda zvýrazní odpovídající stanici v seznamu stanic. Pokud byla proměnná waitForPong nastavena na true pošle se na stanici, ze které přišla tato zpráva, XMPP zpráva pro získání rozlišení.
Třída StationList Obsahuje metody pro manipulaci se seznamem stanic. Umožňuje přidat, upravit a odstranit stanici. Dále umožňuje načíst a uložit seznam stanic do souboru.
Třída RemoteStationEditor Konstruktor – načte seznam z třídy StationList a zkopíruje jej do komponenty ListBox. Metody tlačítek – pro každé tlačítko existuje obslužná metoda. Tlačítka mají standartní funkci pro seznam. Tím jsou funkce přídání, úprava a odebrání. Úpravy a přidávání se zapisuje do textových polí pro to určených. Po úpravě musí uživatel stisknout tlačítko 32
Uložit, jinak se úpravy zahodí. Pokud uživatel změní heslo, je automaticky poslána na vzdálenou stanici zpráva o změně. Záměrně je vypnuta funkčnost standartního zavíracího tlačítka. Pro uzavření dialogu musí stisknout tlačítko Hotovo.
Třída SettingsForm Prozatím třída obsahuje pouze metody pro úpravu a zobrazení identifikátoru sítě ZeroTier a jeho uložení a načtení ze souboru.
Třída RemoteForm Konstruktor – nastaví příslušné obslužné metody událostí, vytvoří časovač pohybu myši a spustí vlákno pro příjem videa. Metody pro ovládání vzdálené stanice – třída obsahuje metodu pro většinu operací, které lze provést s myší nebo klávesnicí. U myši jde o operace kliknutí, dvojitého kliknutí, stisknutí nebo uvolnění tlačítka, posunu myši a otočení kolečka. Operace přetažení se spustí pouze tehdy, když se kurzor pohnul více jak o pět pixelů. Operace posunu se odesílá každou sekundu. U klávesnice jde o operace stisknutí jedné standartní klávesy nebo klávesové zkratky. Při každé operaci se vytvoří proměnná typu MsgMessageData. Do této proměnné se uloží uživatelské jméno odesílatele i příjemce, heslo pro komunikaci a případně dodatečné XML tagy, které jsou pro konkrétní zprávy unikátní pomocí metody Add. VideoUdpReceiver – metoda pro příjem videa, běží ve vlastním vlákně. Inicializuje dvourozměrné pole screenTmpArray typu MemoryStream. Metoda běží v nekonečné smyčce, dokud není zastavena hodnotou proměnné socketListenRun. Pokud jsou v soketu pro příjem videa dostupná nová data, tak se tyto data přijmou metodou Receive do pole buf. Pokud je třetí prvek pole buf roven jedné, znamená to, že se obrázek vešel do jednoho paketu a vykreslí se na komponentu pomocí metody setBitmap. Pokud obsahuje jiné číslo, uloží se obsah přijatých dat na odpovídající pozici do pole screenTmpArray. SetBitmap – zkontroluje, zda pole, které bylo poslané v parametru, má správný formát. Pokud ano, vyřízne z pole čistý obrázek bez dalších dat a tato data pošle do komponenty.
Třída PanelScreen Tato třída je vlastní vytvořená komponenta okna. Jejím účelem je zobrazovat video, které přijde ze serveru. Komponenta dědí po třídě UserControl, což je základní třída pro výrobu komponent. 33
OnPaint – volá se pokaždé, když je komponenta překreslena. Toto volání způsobuje subsystém oken v systému. Dochází k němu také při změně velikosti komponenty. Metoda vytvoří proměnnou třídy Graphics a pomocí ní vykreslí postupně pole screenArray, které obsahuje video od serveru uložené jako pole 20 krát 20. SetBitmap – podle parametrů X a Y nastaví prvek pole videa na hodnotu parametru B.
4.6 Implementace společné knihovny Třída ProcessMessage ProcessMessage – zpracuje XMPP zprávu jako textový řetězec předaný parametrem. Pro čtení zprávy se používá třída XmlReader. Při volání funkce Read třídy XmlReader je vrácen typ XML uzlu. Zpráva je takto zpracována konečným automatem. Podle typu uzlu a obsahu XML tagů se nastaví odpovídající proměnné. Pokud je zpráva ve správném formátu a projde skrz bezpečnostní kontrolu, vytvoří se pole s parametry dle přijaté zprávy a toto pole je posláno do odpovídající funkce zpětného volání (callback).
Třída MsgMessageData Třída, kam se ukládají data o zprávě před jejím odesláním. Pomocí metody Add se nahrají speciální tagy zprávy. Pomocí metody Get se data získají zpátky.
Třída CommandMsg MsgMessageType – výčtový typ, který popisuje názvy typy zpráv dané předmětem zprávy. Výčtový typ je užitečný při porovnání, protože je interpretován překladačem jako číslo a práce s ním je tedy rychlejší. Message – metoda, která vytvoří zprávu dle parametrů MsgMessageType a MsgMessageData.
Třída DelegateList Úkolem třídy je uložit seznam asociující název metody s delegátem. Tato metoda se používá pro nahrání delegátů pro zpětná volání z metody ProcessMessage. Třída, která figuruje jako kontext aplikace, přidá odkazy na delegáty. Metoda ProcessMessage tyto odkazy volá, když zpracuje zprávu. To umožňuje potenciálně použít celou knihovnu pro 34
zpracování v úplně jiném programu. Metoda ProcessMessage volá zpětná volání, kterými mohou téměř jakékoliv funkce. Jedinou podmínkou pro takové funkce jsou jejich parametry. Invoke – zavolá metodu danou parametrem. Metoda má dva parametry – název metody, kterou chce uživatel volat a parametry, se kterou ji chce volat. Pomocí metody DynamicInvoke zavolá metodu s danými parametry.
Třída CommonMethods StartZeroTierService – spustí službu ZeroTier a vrátí výsledek operace. Pomocí funkce GetServices třídy ServiceController získá všechny služby, které projde. Pokud existuje služba „ZeroTierOneService“, spustí se a vrátí true. Jinak vrátí false. ZeroTierConnect – připojí se na síť ZeroTier. Nejdříve se pokusí zapnout službu ZeroTier pomocí metody StartZeroTierService. Pokud služba neexistuje, nainstaluje se do systémového oddílu do cesty „ProgramData\ZeroTier\One“. Následně se spustí příkaz k připojení k síti ZeroTier. Nakonec se spustí ping pomocí protokolu ICMP na protější stanici dokud stanice neodpoví. InstallZeroTierService – nainstaluje službu ZeroTier. Společně se službou se nainstaluje i ovladač virtuálního adaptéru.
35
5 Testování Testování probíhalo dvěma způsoby. Prvním způsobem bylo testování na virtuálním počítači. Ve virtuálním počítači běžel server a v reálném klient. Byla testována a optimalizována rychlost přenosu videa, responzibilita ovládání klávesnicí a myší. Dále byla testována a optimalizována rychlost odesílání a příjmu videa. Byl měřen čas porovnání rozdílu obrazovek, při čemž bylo zjištěno, že funkce pro získání snímku obrazovky je velmi výpočetně náročná, proto se musí vykonávat co nejméně. Byla ověřena funkčnost posílání stisku kláves. Byla testována funkčnost klávesových zkratek v kombinaci s písmeny anglické abecedy. Byla zjištěna nefunkčnost kláves šipek a některé kombinace zkratek, jako například Control+Home. Další fáze testování probíhala již ve firmě Fotostudio, pro které je aplikace určená. Bylo zjištěno, že přenos mezi videa dvěma reálnými počítači je mnohem rychlejší, protože je k dispozici dvojnásobný výpočetní výkon. Dále bylo zjištěno, že funguje správně ovládání služby ZeroTier na pozadí. Zatím z neznámého důvodu se spojení na XMPP po zhruba dvou hodinách nečinnosti přeruší. I když do aplikace byl vložen kód pro udržování spojení a pro jeho znovunavázání, na reálném počítači problém přetrvává. Na virtuálním tento problém nenastal. Výsledky testování prokázali, že navržený koncept komunikace funguje a bude se dále rozšiřovat.
36
6 Závěr Aplikace byla vyvinuta a otestována jak ve virtuálním, tak reálném prostředí. Testy ukázaly, že aplikace splňuje požadavky dané návrhem. Bylo úspěšně implementováno vzdálené ovládání počítače a přenos videa. Funkčnost programu je dostatečná na to, aby se aplikace dala pohodlně používat. Některé funkce, které doplňují hlavní účel programu, jako je zabezpečení heslem, byly implementovány. O další funkce, jako je přenos souborů, může být aplikace rozšířena. Pro účely, ke kterým byla aplikace původně vyvíjena, je aplikace funkčně dostačující. Aplikace nyní obsahuje instalátor, serverovou část a klientskou část. Pro implementaci byl použit jazyk C# a technologie .NET. Aplikace používá binární programy třetích stran, jako jsou programy ovládající službu a virtuální rozhraní ZeroTier One a XMPP knihovnu Ubiety. Aplikace by se dala v budoucnu rozšířit o překlad rozhraní do cizích jazyků a zejména širší podpory operačních systémů, jako Windows XP nebo linux.
37
Seznam použitých zdrojů [1]
XMPP
Standards
Foundation.
XMPP
Standards
Foundation
[online].
[cit. 2015-05-16]. Dostupné z: http://www.xmpp.org [2]
SAINT-ANDRE, P. RFC 3920. Extensible Messaging and Presence Protocol
(XMPP) [online]. 2004 [cit. 2015-04-25]. Dostupné z: http://tools.ietf.org/html/rfc3920 [3]
ZeroTier
One
[online].
2014
[cit.
2015-04-25].
Dostupné
z:
http://www.zerotier.com [4]
JID Escaping. Transformations [online] [cit. 2015-5-16]. Dostupné z:
http://www.xmpp.org/extensions/xep-0106.html#transforms [5]
PETZOLD, Charles. Programování Microsoft Windows Forms v jazyce C#. Vyd.
1. Překlad Karel Voráček. Brno: Computer Press, 2006, 356 s. ISBN 80-251-1058-3. [6]
MAREŠ, Amadeo. 1001 tipů a triků pro C#. Vyd. 1. Brno: Computer Press, 2008,
360 s. ISBN 978-80-251-2125-2. [7]
VIRIUS, Miroslav. C# 2010: hotová řešení. 1. vyd. Brno: Computer Press, 2012,
424 s. K okamžitému použití (Computer Press). ISBN 978-80-251-3730-7.
38
Seznam obrázků Obrázek 1: Přihlašovací okno ......................................................................................... 12 Obrázek 2: Hlavní okno .................................................................................................. 13 Obrázek 3: Editor seznamu stanic .................................................................................. 14 Obrázek 4: Okno vzdálené stanice.................................................................................. 15 Obrázek 5: Typy zpráv ................................................................................................... 16 Obrázek 6: Navazování připojení ................................................................................... 20 Obrázek 7: Připojení k síti ZeroTier ............................................................................... 21 Obrázek 8: Webová aplikace ZeroTier One ................................................................... 26 Obrázek 9: UDP paket .................................................................................................... 27
39
Seznam použitých zkratek .NET
Dot Net
ASCII
American Standard Code for Information Interchange
ICMP
Internet Control Message Protocol
JPEG
Joint Photographic Experts Group
TCP
Transmission Control Protocol
UDP
User Datagram Protocol
WinAPI
Windows Application Programming Interface
XML
Extensible Markup Language
XMPP
Extensible Messaging and Presence Protocol
40
Přílohy 1 Obsah přiloženého CD Na přiloženém CD se v kořenovém adresáři nachází tato bakalářská práce ve formátu bakalarska_prace.pdf s jednoduchým návodem navod.txt pro obsluhu programu. Ve složce src se nachází zdrojový kód ve formě projektu Visual Studia pro všechny části aplikace. Ve složce bin se nachází všechny části programu ve spustitelné formě.
41
2 Uživatelský manuál 2.1 Registrace XMPP účtu Na stránkách https://xmpp.net/directory.php se nachází seznam mnoha XMPP serverů, kde lze zdarma zaregistrovat nový účet. Důrazně se doporučuje používat pouze XMPP servery se zabezpečením třídy A. Každý server má způsob registrace nepatrně jiný, proto je třeba hledat instrukce pro registraci na stránkách daného serveru. Obyčejně je ale registrace podobná a sestává z výběru uživatelského jména a hesla.
2.2 Instalátor V instalátoru uživatel vybere, zda chce nainstalovat na daný počítač klientskou nebo serverovou část aplikace výběrem daní karty.
Instalace klienta Klienta uživatel instaluje na počítač, ze kterého bude probíhat vzdálená správa. Pokud nemá uživatel již vytvořený XMPP účet, použije odkaz „Vytvořit XMPP účet“ pro přesměrování na seznam serverů, které jsou k dispozici. Pokud uživatel nemá vytvořeno vlastní síť ZeroTier, přejde na stránky https://www.zerotier.com a vybere registraci nového účtu. Po vytvoření účtu se přihlásí a vytvoří novou síť. Na názvu sítě nezáleží. Uživatel musí zkopírovat šestnáctimístný identifikátor sítě a vložit ho do aplikace instalátoru. Nakonec uživatel vybere složku, kam chce klientskou aplikaci instalovat a instalace již proběhne automaticky.
Instalace serveru Server bude uživatel instalovat na počítač, který bude vzdáleně spravován, Instalaci je tedy nutné provádět lokálně. Je nezbytné vytvořit pro každý server vlastní XMPP účet. Po vytvoření účtu na XMPP serveru je nutné zadat přihlašovací údaje do instalátoru. Dále je nutné zadat heslo pro komunikaci. Po zadání těchto údajů stačí už jen vybrat cílovou složku, kam chce uživatel server nainstalovat. Při instalaci se server automaticky vloží do položek po spuštění počítače. Nakonec je potřeba ověřit, zda je zabezpečení připojení k internetu nastaveno tak, aby programu byla umožněna funkčnost.
42
2.3 Ovládání klienta Po spuštění programu se zobrazí přihlašovací okno. Zde je nutné vyplnit přihlašovací údaje k XMPP účtu, který uživatel vytvořil při instalaci a stisknout tlačítko „Přihlásit“. Po prvním úspěšném přihlášení bude použité uživatelské jméno automaticky uloženo do historie, aby příště bylo přihlášení pohodlnější. Po přihlášení se zobrazí hlavní okno aplikace. V seznamu vlevo jsou zobrazené vzdálené stanice. Ty, které jsou podbarveny zeleně, jsou připojené, ty které červeně, jsou odpojené. V kontextovém menu jsou položky:
Připojit
Seznam
Nastavení
Nápověda
Pro úpravu seznamu stanic vyberte v menu Seznam položku Upravit. Zobrazí se editor stanic. V menu Nastavení lze nastavit identifikátor sítě ZeroTier, který by měl již být nastavený, pokud byla provedena instalace dle instrukcí. Pokud ne, lze zde identifikátor upravit. Pod menu Nápověda lze zobrazit informace o programu o technologiích třetích stran a licenci. Pod menu Připojit se lze připojit na vzdálenou stanici nebo odhlásit od aktuálního XMPP účtu. Pro připojení ke stanici nejdříve vyberte stanici v seznamu a klikněte pod menu Připojení na položku „Připojit na vzdálenou stanici“. Zobrazí se okno vzdálené stanice. Nyní může trvat až půl minuty, než se spojení naváže. Navázané spojení poznáte tak, že uvidíte obsah obrazovky vzdáleného počítače.
Ovládání stanice Místo, kde se zobrazuje obrazovka vzdáleného počítače, funguje jako virtuální monitor. Pokud změníte velikost okna, velikost virtuální obrazovky se změní také v poměru stran okna. Pokud kliknete do virtuální obrazovky, operace kliknutí se přenese na vzdálený počítač, kde se provede. Změna, kterou kliknutí vyvolá, se následně zobrazí v okně. Myší lze vzdálený počítač ovládat operace kliknutí, dvojité kliknutí, přetažení a vertikální pohyb kolečka. Stejným způsobem funguje ovládání klávesnice. Pokud například kliknete na vzdáleném počítači do textového pole, tak se symboly napsané na klávesnici přenesou a zobrazí tak, jako byste u počítače byly přítomni osobně. Další možností okna je zapnutí a vypnutí vzdáleného ovládání a přepnutí „always on top“. 43
3 Diagramy Diagram tříd serveru
44
Diagram tříd klienta
45
Diagram tříd společné knihovny
46
Diagram užití klienta
47
Diagram užití serveru
48