Portál AbcLinuxu, 26. dubna 2024 08:23

Jednoduchý linuxový server pro chytrou domácnost v Delphi 10.2 Tokyo

22. 1. 2018 | Redakce
Články - Jednoduchý linuxový server pro chytrou domácnost v Delphi 10.2 Tokyo  

Od základní motivace po naprogramování systému chytré domácnosti na Linuxu s využitím vývojového nástroje Delphi 10.2 Tokyo – zásuvky, světla, mediální centrum s TV. Klienty s Windows 10 i Androidem, pohání to Linux s MySQL na Raspberry Pi, ani to moc nežere… Prostě IoT pro domácnost.

Delší dobu jsem si pohrával s myšlenkou proměnit svoji domácnost v tzv. chytrou. Jako vývojář jsem nechtěl sáhnout po komerčním řešení, ale navrhnout si svoje vlastní, které bude jednak vyhovovat mým potřebám a zároveň nezruinuje rodinný rozpočet.

Na projektu jsem začal pracovat v polovině roku 2016, jeho dokončení předpokládám do tří let. Takže pořád jde o relativně ranou fázi.

Představení systému chytré domácnosti

Systém je založený na otevřených platformách Arduino a Raspberry Pi. V současnosti ho tvoří devět zásuvek RF (tři odlišné typy), čtyři spínače vnitřního osvětlení (Livolo), dvě desky Arduino Uno s ethernetovým rozšířením a naprogramovaným RF vysílačem ovládajícím zásuvky, dvě zařízení Raspberry Pi 3 s nainstalovaným mediálním centrem Kodi (OpenELEC) a připojená ke dvěma TV, jeden server NAS sloužící jako úložiště multimediálních souborů a konečně hlavní server Raspberry Pi 3 s linuxovým prostředím Raspbian, který celý systém ovládá.

Interakce se systémem probíhá pomocí klientů. Hlavní klient běží na stroji s Windows 10 s dotykovou obrazovkou, další klienti běží na zařízeních s Androidem (mobilní telefon, tablet).

Systém v této chvíli umí ovládat zařízení napojené na zásuvky RF. Je možné nastavovat jejich spínání v čase. Dále je možné spouštění multimediálních souborů na připojených TV, vytváření alarmů, připomínek a událostí ve formě zvukové či obrazové. Systém si dělá statistiku o spouštěných multimediálních souborech, z toho je pak schopný nabídnout např. oblíbenou hudbu atd.

Software použitý k ovládání

Ovladače zásuvek jsou napsané v jazyku Wiring (Arduino: jak pro něj začít programovat), určeném pro platformu Arduino. Na obou zařízeních běží jednoduchý HTTP server. Zařízení se pak ovládá pomocí protokolu HTTP jednoduše zavoláním jeho IP adresy a příkazem na zapnutí/vypnutí zásuvky.

Delphi 10.2 Tokyo

Na multimediálních Raspberry Pi 3 běží linuxový systém Openelec s mediálním centrem Kodi (bývalé XBMC). K zařízení se přistupuje opět protokolem http. Kodi má skvěle implementované API, pomocí kterého lze zařízení plně ovládat příkazy JSON, viz. http://kodi.wiki/view/JSON-RPC_API/v6.

Delphi 10.2 Tokyo

Klient pro MS Windows je psaný v Delphi 10.2 Tokyo. Je to aplikace VCL. Klient pro zařízení s Androidem je psaný v Delphi 10.2 Tokyo FireMonkey. Vzhledem k tomu, že není příjemné udržovat dva různé klienty (VCL a FireMonkey), uvažuji o nahrazení klienta VCL právě tím univerzálním pro FireMonkey, zbývá však doladit responzivní návrh. Výhoda univerzálního klienta do budoucna spočívá v platformní nezávislosti a možnosti použití i na zařízeních s iOS (i když v této chvíli takové nevlastním).

Nejdůležitějším prvkem je hlavní server. Preferoval jsem malé, relativně výkonné zařízení, které by mohlo běžet 24/7 a neodebíralo půl bloku jaderné elektrárny. Padlo proto rozhodnutí na Raspberry Pi s Linuxem. Server používá databázi MySQL pro možnost zápisu a čtení uživatelem definovaných událostí.

Ovládací software je složen ze tří částí:

  1. Speciální XMPP klient, kterým lze ovládat zařízení zvenku (mimo domácí LAN). Napsaný je v Lazarusu 1.6. Po přijetí zprávy od autorizovaného uživatele pošle tuto tzv. AIML botovi (Program-O napsaný v PHP, běžící lokálně na hlavním serveru). Ten přetransformuje lidský příkaz do patřičné podoby v JSON, kterou zpracuje hlavní jádro serveru a odpoví.
  2. Scheduler – aplikace, která každou minutu kontroluje v databázi MySQL, nemá-li být v daném čase spuštěná nějaká událost (např. sepnutí zásuvky, přehrání alarmu atd.). Aplikace je napsána v Lazarusu 1.6.
  3. Jádro serveru napsané v PHP. To reaguje na příkazy ve formátu JSON voláním příslušných PHP skriptů. Server provede požadovaný příkaz a zašle zpět odpověď (JSON).

Delphi 10.2 Tokyo

Převod existujícího řešení do Delphi 10.2

S možností otestovat nové Delphi 10.2 s podporou Linuxu mě napadlo, že zkusím portovat svůj server z Lazarusu a PHP na Delphi. Mít server napsaný v jediném prostředí by bylo příjemné. Mohl bych v nejedné situaci přímo využít již dříve napsané části kódu z jiných projektů. Bude-li toto řešení funkční, pouvažuji o výměně stávajícího Raspberry Pi 3 s procesorem ARM za něco jiného, například mini PC od Intelu, běžící na x84-64, protože kompilátor Delphi 10.2 pro Linux je zatím jen pro platformu x84-64. Zatím tedy budu testovat ve virtuálním stroji.

Instalace Delphi 10.2 proběhla naprosto bez problémů, dokonce jsem měl pocit, že o něco rychleji, než kdysi 10.1, což potěší. Následovala instalace virtuálního linuxového stroje. Jako návod mi výborně posloužil blog na embarcadero.com.

Jako linuxovou distribuci jsem si vybral Ubuntu Server 16.04.2 LTS.

Instalace na mém stroji (AMD FX8300, 8 GB RAM, SSD) proběhla za několik málo minut. Následovala instalace PAServeru dle návodu. Po otevření Delphi jsem si zvolil novou konzolovou aplikaci, napsal tradiční „Hello world“, přidal platformu 64bitový Linux, zkompiloval a nasadil. Vše proběhlo podle očekávání, aplikace se skutečně ve virtuálním stroji rozběhla a v konzoli pozdravila svět. Za to Embarcaderu veliká pochvala. Žádné velké komplikace, křížová kompilace funguje tak, jak má. Pro vývojáře zvyklé na kompilaci projektů FMX (FireMonkey) pro mobilní platformy to bude věc, na kterou jsou zvyklí. Kompilace pro Linux je pohodlná a rychlá.

Nastal tedy čas na přepsaní existujících tří částí serveru. Prvotní myšlenku sloučit tři aplikace do jedné samostatné jsem brzy zavrhl, zůstanu u stávajícího řešení tří částí – Scheduler, XMPP klient a jádro.

Nejjednodušší je Scheduler. V Lazarusu je to jednoformulářová (GUI) aplikace obsahující komponentu TTimer, která s periodou 60 sekund pošle dotaz na výskyt nějaké události pro danou minutu do databáze MySQL. V případě, že dotaz vrátí záznam(y), zabalí je do formátu JSON a pomocí http send je zašle jádru v PHP. Akce zaslání a odpovědi jádra se zalogují do Mema. Aplikace též jednou denně aktualizuje denní seznam událostí v databázi. Například o víkendu se pouští jiné události než v pracovní dny.

Při přepisu do Delphi je zásadní rozdíl v tom, že nepůjde o grafickou aplikaci, ale konzolovou. Trochu mi to připomnělo roky dávno minulé, kdy jsem psával aplikace pro DOS. Člověk si však rychle zvykne. V Delphi jsem zvolil konzolovou aplikaci, která při inicializaci vytvoří DataModul, celá další funkčnost se pak už odehrává v něm. Pohodlné bylo vytvoření načtení souboru ini pro nastavení aplikace (dala se použít ta samá jednotka, kterou čte soubor ini klientská aplikace ve Windows). Malý zádrhel nastal při snaze použít komponentu TTimer. Ta pro konzoli není, nevložíte ji ani jako komponentu do DataModulu. Řešení bylo v přidání nekonečné smyčky se sleepem. Aplikace se dotáže, pak na minutu usne, a pak zase dotaz…

Pro připojení k databázím jsem zvyklý používat komponenty třetích stran (ve firmách v ČR velice oblíbené komponenty od Devartu, v Lazarusu jsem použil komponenty ZEOS. Nic z toho v současné době pod Delphi 10.2 zatím podporováno není, tak byl čas vyzkoušet nativní FireDAC. S komponentami se pracuje velice podobně, jako se zmiňovanými komponentami třetích stran. Vytvořil jsem konexi pomocí TFDconnection, přidal TFGPhysMySQLDriverLink a pak už jednotlivé TFDQuery. Překvapilo mně, že to hned nefungovalo a dožadovalo se to ještě stažení libmysql.dll ve Windows a příslušné knihovny .so v Linuxu.

Řešení pro Windows je vidět zde.

Pro Ubuntu Linux bylo potřebné doinstalovat vývojové balíčky MySQL:

sudo apt-get install libmysqlclient-dev

Po tomto kroku už vše chodí tak, jak má. Aplikaci s příslušným souborem ini jsem nasadil do virtuálního stroje, běží podle očekávání.

Druhá aplikace v pořadí na přepis byl XMPP klient. V Lazarusu je to opět jednoformulářová aplikace, která se přihlásí k vybranému XMPP (Jabber) serveru (je potřeba mít vytvořené konto na některém z veřejně přístupných Jabber serverů, viz např. Jabbim. Přepisování jsem začal podobně, jako u Scheduleru. Konzolová aplikace, DataModul, načtení souboru ini … pak přišla část s implementací Jabber/XMPP.

Delphi 10.2 Tokyo

A zde narazila kosa na kámen. V Lazarusu jsem použil řešení využívající nějakou starší verzi knihovny Synapse. Plus další jednotky, které implementovaly XMPP a byly postavené nad touto verzí Synapse. Vím i o snaze Ing. Radka Červinky o aktualizaci Synapse pro Linux (SynapseTCP), nepovedlo se mi to však celé s unitami pro XMPP rozchodit, bude to potřeba přepsat. Netroufnu si odhadnout, jak dlouho mi to zabere. Možná někdo přijde s implementací dřív. I když pravdou je, že se od protokolu XMPP upouští (například konec Google Talk apod.). Zatím tedy tato část serveru zůstává v Lazarusu. Tady je nutno podotknout, že řešení pomocí XMPP je pro budoucnost nevhodné, jelikož závisí na funkčnosti serveru třetích stran. Ideální by bylo použít nějaké vlastní řešení, jenže to asi bude chtít veřejnou IP adresu.

Delphi 10.2 Tokyo

Třetí částí je serverové jádro. Implementováno je v PHP. Na serveru je nakonfigurovaná služba Apache2 s podporou PHP a MySQL. Toto by po implementaci v Delphi mělo odpadnout. Aplikace samotná bude běžícím webovým serverem.

Tady musím říct, že jsem si podpory pro Linux užil nejvíc a implementace proběhla velice hladce. Z menu Delphi se vybrala možnost New Web Server Application, zaškrtla se možnost pro Linux, vybralo se Stand-alone console application, vybral se port a základ nejjednoduššího web serveru je hotov. Žádné nastavování navíc, po nasazení (Deploy) na Linux bylo možné hned po spuštění otestovat v prohlížeči. Implementace vlastností webového serveru tak, aby se choval stejně, jak ten na původním Raspberry Pi, už byla jen otázkou několika hodin běžné práce s Delphi. Žádné složitosti, ani překvapení nenastala. Hlavní obsluha serveru se odehrává v DataModulu, který reaguje na příchozí požadavek HTTP. Skutečně velkou výhodou bylo, že jsem mohl použít téměř všechny nevizuální komponenty pro komunikaci se zařízeními chytré domácnosti, které jsem měl už napsané například pro klienty z VCL nebo FireMonkey (u jedné komponenty jsem měl použitý TTimer, tak to bylo nutné vyhodit a vymyslet jiné řešení, ale nic zásadního). Takže tady Embarcaderu dík, člověk v podstatě nepozná, že píše server pro Linux a ne pro Windows.

Dojmy a shrnutí

Embarcadero připravilo zajímavou možnost, jak efektivně vyvíjet aplikace pro Linux pro delphisty. Je velmi příjemné mít možnost vyvíjet ve svém oblíbeném RAD Studiu. Není nutné vyvíjet přímo v prostředí Linuxu, podobně, jak není nutné vyvíjet aplikace pro mobilní zařízení přímo na těchto zařízeních. Pro vývojáře mobilních aplikací to bude vstup do známých vod, kde v podstatě jen přepnou cíl kompilace. Všechno to zní hezky, ale má to v současné době několik velkých „ALE“:

Jen ve verzi enterprise

Asi největší problém je v přístupu k linuxovému kompilátoru až ve verzi Enterprise. Chápu, že Embarcadero cílí na velké firmy, které potřebují ušetřit na celkových nákladech se správou serverů a použití linuxových serverů namísto Windows vyjde v součtu levněji. Problém je, že i pro firmy (v ČR to platí dvojnásob) jsou edice Enterprise edice drahé. Setkávám se běžně s preferencí edicí Delphi Professional i ve velkých firmách.

Jen pro x86-64

Linux je dnes nejrozšířenějším OS. Nemám samozřejmě na mysli stolní počítače, ale spoustu zařízení od drobných, jako routery, TV, multimediální centra, servery NAS, až po výkonné firemní servery. Většina z nich je založená na různých linuxových distribucích a klonech. Zaměření jen na firemní servery a firemní klientelu je z hlediska Embarcadera krátkozraké. Dále je tu rozvíjející se segment zařízení IoT. Určitě by bylo žádoucí vyvinout i kompilátor pro architekturu ARM.

Jen příkazová řádka

Kompilace jen pro příkazovou řádku. Tady je trochu těžké říct, je-li to výhoda, nebo nevýhoda. Linuxové servery většinou grafické uživatelské rozhraní nepotřebují. Uživatelsky přívětivé nastavení lze udělat přes webové rozhraní. Zkušení uživatelé si jistě vystačí s příkazovou řádkou. Na druhou stranu, představa FireMonkey pro Linux by byla hezká. Nejspíš takhle neuvažuji jen já a existuje již projekt FmxLinux. Tím by se možnosti vývoje pro Linux dostaly na úplně jinou úroveň. Bude někdy FireMonkey for Linux standardní součástí Delphi? Zůstávám optimistou, všichni pamatujeme, jaký kus cesty ušla podpora pro vývoj mobilních aplikací od uvedení po dnešek.

Myšlenka podpory Linuxu pro Delphi je skvělá. Vyhovující je i koncept psaní kódu na běžném stolním počítači s Windows v prostředí RAD studia a jeho následný build na linuxový stroj. Vývojáři mobilních aplikací jsou na to zvyklí a pracuje se jim tímto stylem pohodlně. Není nutno vytvářet nativní RAD studio pro Linux. Nakonec v minulosti taková snaha již existovala (Kylix) a neujala se.

Aby se však vývoj v Delphi pro Linux stal plnohodnotnou, ne exotickou možností, bude muset Embarcadero zapracovat v první řadě na licenční politice. Edice Enterprise jsou drahé i pro leckteré firmy. Aby došlo k rozšíření, bude muset probublat ideálně až k jednotlivcům. Nejspíš ve formě rozšiřujícího balíčku k nižším verzím Delphi. Stejně jako je to dnes u mobilního balíčku už k verzi Professional. Ruku v ruce jde pak i rozšíření podpory pro architekturu ARM a přidání podpory GUI. Delphi jsou oblíbené nejen u některých velkých firem, ale hlavně mezi menšími nezávislými vývojáři. V blízké budoucnosti dojde k rozkvětu nových startupů zabývajících se například IoT. Věřím, že pro Embarcadero by rozšíření Delphi s podporou Linuxu mezi tyto nadějné subjekty mohlo být ekonomicky zajímavé.

Můj článek je poděkováním neúnavnému propagátorovi Delphi Pawlovi Glowackému, který již bohužel není mezi námi.

Autor Štefan Dušík, narozen 18. 2. 1979 v Košicích. Od roku 1997 žije v Praze. Vystudoval MFF UK (2002 Mgr., 2010 Ph.D.), obor Fyzika plazmatu a ionizovaných prostředí. Od roku 2003 aktivně programuje v prostředí Delphi. Má dlouholeté zkušenosti s databázemi Oracle, MSSQL a jinými. Pracoval jako programátor v prostředí velkých českých bankovních institucí, podílel se na vývoji informačního systému pro některé české univerzity, v současnosti pracuje jako vývojář mobilních aplikací ve firmě Asseco Solutions. Ve volném čase se věnuje železničnímu modelářství, zpěvu a rekreačnímu sportu.

Další články z této rubriky

Jarní výprodej s až 91% slevou: originální a permanentně aktivovaný OS Windows 10 jen za €14, Office za €24!
Speciální jarní slevy na software, Windows 11 za €21 na Goodoffer24
Goodoffer24 uvádí v březnu výprodej Windows 11 za €20 a mnoho dalších slev
Výprodej u Goodoffer24 v březnu: 91% sleva na Windows 11 za €20, Office za €24
Valentýnský výprodej s až 91% slevami! Kupte Windows jen za €12 od Goodoffer24

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.