Druhý díl o chytré zasedačce: jak funguje a jak přemýšlet o softwaru, který řídí počítač se všemi součástkami — rádiem, infradiodou a čidly.
Dostal jsem pár reakcí a dotazů k minulému článku — tématem bylo, jak funguje software pro náš mozek zasedačky, co musí řešit a jak o něm přemýšlet. Zkusím do toho vnést trochu světla.
Máme jeden počítač a pár součástek k tomu (rádio, infradioda, teploměr s vlhkoměrem, pohybové čidlo a fotorezistor) — připojte si téměř libovolné další, hrubý princip je stejný. Bez programu, který to celé bude řídit, je to celkem k ničemu.
Nekomplikujme to
Typicky (a v tomto případě to je přesně tak) se o programování těchto malých počítačů uvažuje ve dvou logických celcích.
Počítač nastartuje — prostě jsme ho zapnuli, on něco chvilku dělá (jako když startuje auto, musí začít téct benzín) a pak už je celý náš. Po startu je pak potřeba provést ještě pár úkonů z naší strany. Obvykle jsou to úkony, které je potřeba vyřešit jednou. Něco nastavit, nakonfigurovat, naladit. V příměru s autem jako když nastartujete, máte nastaveno, že se rozsvítí světa, začne hrát rádio, naladí se sedačka a zrcátka.
Počítač běží—už dokončil všechny ty úkoly, co jsme po něm chtěli po startu. Klidně o tom zatím uvažujte tak, že počítač po celou dobu běhu vykonává nějaký kus kódu pořád a pořád dokola. V případě zasedačky tento kód řeší v principu dva úkoly:
Jednou za nějaký rozumný čas změří teplotu, vlhkost, osvětlení a pohyb a hodnoty někam odešle. Odesláním hodnot to končí. Rozhodně není starostí počítače, aby řešil, kde/kdo/kdy/jak tyto hodnoty uvidí.
Zbytek času počítač poslouchá. Čeká, jestli po něm něco nechceme, třeba rozsvítit nebo zatopit. Když se dočká a někdo po něm něco chce, udělá to. Tady naopak rozhodně je jeho starostí, aby věděl, co má udělat když někdo chce pípnout rádiem—musí vědět, kde ho má připojeno a jak nakonfigurováno.
Jak to funguje v našem příkladu?
Teď už to bude malinko techničtější, ale snad to udržím srozumitelné. Hned po startu provedu pár nastavení.
Inicializace vstupů/výstupů: Senzory jsme k počítači nějak připojili a musíme mu říct, co na které nožičce může čekat.
Inicializace sériové linky. Tohle se hodí hlavně pro vývoj, kdy si po sériové lince posíláme informace. Na druhém konci linky je něco s displejem (třeba notebook), na kterém pak sleduju, co se děje.
Inicializace Wi-Fi. Protože jsem se rozhodl, ze komunikovat budu po Wi-Fi, potřebujeme se umět k Wi-Fi připojit. Zatím mi stačí na tvrdo zadat jméno sítě a heslo — dalo by se k tomu udělat nějaké rozhraní.
Inicializace času. Občas je potřeba vědět, kolik je hodin. Na rozdíl od notebooku, náš počítač to po startu neví, musí se na to někoho zeptat.
Inicializace rádia. Komunikační modul je potřeba zkonfigurovat, hlavně parametry vysílaného signálu.
Inicializace komunikace. Naměřené hodnoty chceme někam posílat, na to by stačil HTTP(S) protokol. Navíc ale chceme, abychom uměli i poslouchat, kdo po nás co chce—pro tyto účely existuje několik protokolů, já použil MQTT.
Těmito úkoly počítač stráví zhruba pár stovek milisekund až několik málo sekund a pak už jen posílá hodnoty a čeká na příkazy. Je to vlastně úplně jednoduché, sekvence je zhruba taková:
Mrkni kolik je hodin s kdy naposled jsi posílal naměřené hodnoty. Nejen proto jsem potřeboval, aby počítač věděl, kolik je hodin.
Pokud od posledního odeslání neuběhl dostatek času, nic posílat nebudu. Nepotřebujeme měřit teplotu stokrát za sekundu, že?
Pokud je vhodný čas, posbírej hodnoty — přečti teplotu, přečti vlhkost, zjisti jestli se svítí a mrkni jestli se něco hýbe (k tomu máme ty moduly a součástky z minula).
Posbírání hodnot samo o sobě se v hrubém principu děje buď jako přečtení analogové hodnoty (třeba napětí na nějaké nožičce), přečtení digitální hodnoty (0–1 na nějaké nožičce), nebo komunikace s modulem skrz sběrnici (často I2C nebo SPI, ale i některé další).
Pak všechny tyto hodnoty vhodně zapiš (používám JSON), aby se mi s nimi pak dobře pracovalo. Nakonec to všechno pošli do světa (a dál se nestarej; maximálně počkej na potvrzení, ze byly pořádku přijaty).
Mrkni jestli po tobě někdo něco chce. Když jo, tak mrkni co chce a pokud je to něco, co umíš, tak to udělej. Hned jak to uděláš, tak nekoukej kolik je hodin, rovnou posbírej hodnoty a pošli je (když rozsvítím, chci obratem vidět, jestli se svítí).
O pár řádků výš jsem psal pošli (data) do světa. To si zaslouží trochu rozebrat. Potřebuju nějakého prostředníka v internetu, kterému počítač dokáže poslat data (posbírané hodnoty), který dokáže data poslat počítači (příkazy), který toto dělá spolehlivě a bezpečně. Nebudu vymýšlet kolo, na toto se perfektně hodí IoT Hub od Microsoftu. Ten umí několik typů komunikací (včetně MQTT nad WebSockety, o kterém jsem psal), kompletně spravuje zařízení (ví s kým/kdy/jak/kdo může komunikovat) a celé je to zabezpečeno pomocí TLS/SSL. Je to takový pošťák, co doručuje zprávy, kam je potřeba — dnes podáte, hned dodáme.
Je to bezpečné?
Zatím jsem se tím příliš netrápil a vygeneroval si token s platností (TTL) na pár měsíců. To není úplně nejlepší přístup, protože kdo zná tento token, může pár měsíců komunikovat za mě. Bude fajn alespoň naučit náš počítač tento token spočítat, pak nebude nic bránit tomu, aby měl platnost třeba pět minut. Pak je otázkou bezpečnost fyzická — takhle jak mi to leží na stole, není problém vytáhnout jednu součástku a místo ní tam strčit něco, co bude podvrhovat nepravdivé hodnoty. Bezpečnost je obsáhlé téma, dalo by se udělat ještě o kus víc, ale o to je na delší povídání.
Asi stojí za zmínku, že software pro počítač do zasedačky je docela hloupý — jen posílá nějaké hodnoty (o kterých ani netuší, co vyjadřují) a přijímá příkazy (o kterých ani netuší, co dělají). Ale tak jsem to chtěl — celá logika toho, co znamená rozsviť světla, je jinde, mimo tento software. Proč? Tento počítač bude někde zavřený a nemusí k němu být snadný přístup (=je fajn, když bude jednoduchý a obecný) a taky proto, že má relativně omezené zdroje (=paměť). Už předbíhám, ale když bych takových počítačů měl víc, tak nechci ke každému z nich chodit a něco na nich modifikovat. Zkrátka je mnohem jednodušší zaktualizovat nějaký server-side, který je jeden jediný a přístup k němu je odkudkoliv.
To je v podstatě celá věda na straně zasedačky. Nic víc to nedělá a nepotřebuje dělat. Zbytek — jak to vypadá, odkud a jak se to dozví jestli světla svítí, kam a jak to posílá příkazy, jak se to aktualizuje někdy příště, pokud bude zájem. Stejně jako minule, pokud to někoho zajímá víc, klidně se ozvěte nebo stavte.