Aktualizováno 1.3. 2019

      
 

   Základy programování - vidlácké posílání povelů mezi 2 aplikacemi na jednom PC
 
Základy programování počítačové komunikace pro radioamatérskou praxi s využitím IPC Socketu

 
V naší školní sadě jednoduchých úvodních prográmků jsme si naprogramovali jednoduchý semafor, na kterém můžeme kliknutím měnit jeho stav (barvu, která právě svítí) a naučili jsme se základní práci s vizuálními objekty vývojového prostředí XOJO.

Zadání dnešní úlohy je prosté - napsat druhou aplikaci, které budeme říkat "Řídítka". Z této aplikace budeme ručně řídit stav našeho semaforu. Prakticky to znamená, že obě aplikace doplníme o tzv. IPC Socket, který slouží k tomu, abychom z jedné aplikace poslali povel (zprávu) do aplikace druhé. V aplikaci řídítka použijeme komponetu SegmentedControl. Tato komponenta vypadá jako vlnový přepínač na starém elektronkovém rádiu nebo (taky pro pamětníky) jako tři spřažená tlačítka Isostat. Základní funkce je taková, že když jedno tlačítko zmačkneme, ostatní se uvolní.

Poznámka: Pokud bychom měli zadání, že komunikovat musíme z desktopu na desktop po síti, použijeme TCPSocket. 

Zdrojové kódy obou programů po úpravě si můžeme stáhnout na této stránce:

1. semafor zde
2. řídítka zde

Také se můžeme podívat na listing zdrojových kódů obou aplikací (pdf):

1. semafor zde
2. řídítka zde

Na následujících řádcích jsou ukázky obrazovek vývojového prostředí a důležité detaily, které byly při kreslení aplikací použity.

Přidání IPC Socketu do aplikace Po1 (semafor):

Vidlácký postup je prostý. Šáhneme do Toolboxu (zde se jmenuje Library) a přidáme si do projektu IPV Socket1. Musíme nastavit stejnou cestu s dočasnému souboru, kterou budou mít ostatní aplikace, které budou se semaforem komunikovat - viz obrázek dole, pravá část. Nastavil jsem cestu Path jako Po1:

Vedle nevizuálního IPC Socketu si všimněte další komponety (Timer1). Jde o časovač, který nedělá nic jiného, než sadu příkazů uvedenou na obrázku dole. A sadu příkazů vykonává vždy, když uplyne nastavená doba v milisekundách, např. 1000 ms. Konkrétně časovač každou vteřinu vyčte IPCSocket1 a vyčtený řetězec uloží do proměnné povel. Pak se provede vyhodnocení (pomocí příkazů If then end if). Pokud je podmínka splněna, volá se jedna ze tří metod, které jsme již dříve napsali (Cervena, Zelena, Zluta). Kód metod se postará o to, aby se komponenty Oval1 až Oval3 obarvily předepsaným způsobem.
Ještě se podívejte do listingu na příkaz použitý v metodě Sub Open( ). Na první řádek byl přidán příkaz IPCSocket1.Listen. Tento příkaz nám zapne IPCSocket do režimu naslouchání, s otevřením okna Socket začne naslouchat a my ho můžeme příkazem v Timer1 vyčítat, řetězec ukládat do proměnné, testovat, jaký povel přišel a spustit odpovídající metodu.

Přidání IPC Socketu do aplikace Řídítka

Tady potřebujeme, aby se IPC Socket připojil k naslouchajícímu serveru. To zařídíme tak, že při otevření okna, je to v Sub Open( ), spustíme příkaz IPCSocket1.Connect; v takovém případě nebude Socket naslouchat, ale půjde do něho zapisovat povely. Zase se podíváme do listingu programu. Vidíme tam tři metody, Sub Cervena( ), Sub Zelena ( ), Sub Zluta ( ). V těle každé metody (procedury) je jediný příkaz, který vypadá např. takto: IPCSocket.Write ("Cervena"), atd. Do IPC Socketu je tedy zapsán řetězec znaků mezi uvozovkami.

Na obrázku vidíme novou visuální komponentu SegmentedControl1. Rychle si s použitím tzv. Inspektoru (Properties) osvojíme, co se dá s tímto objektem dělat, jak se přidávají/ubírají tlačítka, jak se mění texty, apod. My potřebujeme, aby při stisknutí odpovídajícího tlačítka (jsou tři) byla zavolána jedna ze tří metod (procedur), kterou jsme si napsali výše. Kód je jednoduchý a je na obrázku dole. Otestujeme, které tlačítko jsme právě stiskli. Otestujeme pomocí příkazu If ItemIndex = 0, atd. Tlačítkům jsou zleva do prava přiřazovány index od 0 do max. počtu tlačítek (zde do 2). Pokud ItemIndex je 0, 1 nebo 2, zavoláme odpovídající metodu (Cervena, Zluta, Zelena). Metoda (procedura) pak odešle odpovídající řetězec do IPCSocketu. A to je vše. Pozor, IPCSocket serveru naslouchá!

Nezbývá, než si to všechno hezky vyzkoušet. Funguje to :-)

Poznámky:

1. Pokud máte jen neplacenou verzi, jako já, musíte spustit ve vývojovém prostředí oba projekty současně.
2. Po otevření projektů spustíme obě aplikace. To už budeme vidět obě okna a můžeme zkoušet posílání povelů z aplikace Řídítka do aplikace Semafor.
3. Je to jednoduché, že? Vidlák, jako já, rád používá komunikaci pomocí tzv. Socketů. Socket je vpodstatě Handle, netuším, jak se to řekne česky. Jde o zapouzdřený kód, který neznáme, který nám zabezpečí komunikaci mezi aplikacemi nebo mezi počítači v síti (TCPSocket) nebo obsluhu sériového portu v USB rozhraní (Serial).
4. Co mě ve Visual Studiu 2017 odradilo? O důvodech, proč Visual Basic Express 2008 musím opustit, jsem psal. Nejsou v něm komponenty typu Socket a nelze v něm napsat perspektivní aplikaci. Ve Visual Studiu 2017 se zase ztrácím. Je to pro mě opravdu nepřehledný, velice objemný Ramlware, který  si klade požadavky na HW. Jenže moje oko tam na první pohled ty Sockety také nevidělo. Při letmém googlování jsem zjistil např. ve kterých třídách ten TCP IP Socket je (viz např. zde: https://www.itnetwork.cz/csharp/pokrocile/csharp-tutorial-tcp-pripojeni-komunikace), je tam i srozumitelný a vysvětlený kód v jazyce C#, jenže moderní vývojový prostředek by snad mohl vidlákovi (a to skutečně jsem) pomoci s rutinami
Imports System.Net a Imports System.Net.Sockets, tedy  "includovat třídy" a s prací "psát několik řádek kódu pro Socket". Mohu konstatovat, že jak Gambas3 (pro Linux) nebo XOJO (pro více platforem) je prostě někde jinde. Pro mě jsou snadnost pochopení, málo práce při kódování a krátký čas na obdržení viditelného výsledku, nesmírně důležité parametry. Ale snad to s tím Imports System.Net.Sockets a psaním řádek taky nějak půjde. To zase bude oser ...

Domácí úkol

V úloze jsme se naučili nové prvky, tzv. IPCSocket pro komunikaci a SegmentedControl (tlačítka). Prvky jsme použili a dopsali k nim příslušné procedury (metody). Zopakovali jsme si prvek Timer, který jsme už dříve vyzkoušeli ve Visual Basic na aplikaci spínacích hodin. Tenkrát jsme tam neřešili komunikaci, protože jsme se jí ještě nenaučili.

Za domácí úkol si můžeme upravit řídítka tak, aby obsahovala jen dvě tlačítka v SegmentedControl a metody zkrátíme tak, aby odcházely jen dva povely (Cervena a Zelena). To je jednoduché, jenom něco vymažeme. Upravíme si však také Semafor. A to tak, že upravíme použité metody tak, aby přechod z červené na zelenou a ze zelené na červenou šel tak, že se na okamžik rozsvítí žluté světlo. To dáme, že?
 

Zpět na obsah


TU 73, Mira, ok1ufc