A belső tanulási folyamataink elemei a proof of concept (POC) projektek. Ezek során valós, piaci igények alapján megfogalmazott feladatokat valósítunk meg kicsit leegyszerűsített követelményekkel. Az egyik legutóbbi ilyen projektünkben a résztvevők az AWS szolgáltatásainak megismerését kötötték össze IoT-rendszerek megvalósításával. Így készült el egy beléptető kártyás, valamint egy hőmérséklet szenzorokat monitorozó rendszer.
A bejegyzés inkább technikai jellegű, de üzleti személyek számára is hasznos lehet, hiszen láthatják, hogy a felhőben milyen gyorsan és olcsón valósítható meg egy komplex rendszer.
Blogcikkünkben Murányi Bence és Hajnal Erik fejlesztő kollégáink foglalták össze projektjüket, az elért eredményeket, tapasztalatokat, valamint a felhasznált szolgáltatásokról is írnak, hogy az ezekben kevésbé jártasaknak se kelljen utánaolvasni.
A feladat
Az AWS IoT moduljához kapcsolódva egy ESP8266 eszközről szeretnénk a hozzá kapcsolt RFID kártyaleolvasó által érzékelt eseményeket eljuttatni a vezérlési logikához, ahol az alapján, hogy az adatbázisban felvett – engedélyezett – kártyáról van-e szó, engedélyezzük vagy tiltjuk az ajtónyitást. A belépéseket AWS-en adatbázisban tároljuk, amit egy felületen meg is jelenítünk táblázatos formában. Továbbá ezen a felületen lehetővé tesszük a leolvasó eszköz ki- és bekapcsolását. A másik funkció, hogy egy hőmérséklet szenzoros eszköz adatait is eljuttatjuk az adatbázisba, a mérési adatokat pedig ugyanezen a felületen megjelenítjük egy grafikonon. A felület az interneten publikus, de autentikációval védett, így az arra jogosult személyek bárhonnan képesek elérni és használni.
Megvalósítás
A rendszer a kártyaleolvasó eszköz kivételével teljes mértékben AWS szolgáltatások használatával került megvalósításra. Az eszközeinket (a feladatban a hőmérséklet szenzoros ESP32 modult és az RC522-MFRC kártyaleolvasóval összekötött ESP8266-ot) az AWS IoT core modulja köti össze a többi szolgáltatással. Az MQTT protokoll alapján itt definiált topicok biztosítják a kétirányú kommunikációt. A megvalósítás során cél volt, hogy ne kelljen külön szervert fenntartanunk, hanem minden szükséges feladatot meg tudjunk valósítani serverless szolgáltatásokkal.
Felhasznált AWS szolgáltatások
AWS IoT
Az AWS IoT Core modulja biztosítja mindkét irányba a kommunikációt a két eszköz és a többi AWS szolgáltatás között. A kommunikáció MQTT topicok definiálására és az ezeken keresztül JSON formátumú üzenetek küldésére- és fogadására épül. A beérkező üzenetek feldolgozásának triggereit message routing rule-ok biztosítják, ezek hatására például kártyabeolvasás eseménykor közvetlenül ír az adatbázisba, vagy ha komplexebb folyamat esetén elindít egy Lambda-t.
DynamoDB
A rendszer mögött elhelyezkedő adatbázis DynamoDB-ben került elhelyezésre. Itt tárolódnak azok a kártya azonosítók, amiket beengedünk, továbbá külön táblában a belépések, az eszköz állapot és a hőmérséklet szenzor adatok is.
A táblázatos, lapozható megjelenítéshez egy relációs adatbázis megfelelőbb lenne, elsősorban a POC költségeinek alacsonya tartása miatt esett a választás a DynamoDB-re.
S3
Az Amazon S3 az AWS storage megoldása, ami támogatja statikus weboldalak hostolását is.
https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html
Ez a megoldás azért előnyös, mert így az adminisztrátori felület publikálásához sincs szükségünk dedikált szerverre. Az S3 viszont önmagában csak HTTP protokollon keresztüli elérést biztosít, a HTTPS-hez szükségünk van a CloudFrontra is. A megoldás abból áll, hogy a lebuildelt frontend projektet feltöltjük egy S3 bucketba és onnan hostoljuk.
CloudFront
A CloudFront egy CDN (Content Delivery Network) szolgáltatás. Az S3 elé bekötve ezen keresztül lehet elérni a felületet egy külön, a CloudFronthoz dedikált URL-en keresztül, így biztosított a HTTPS protokoll támogatása is.
Cognito
A Cognito felel az authetikációért és authorizációért. A Cognitoban tárolt user poolban lévő, előre felvett userek számára érhető el a felület. A frontend a Cognito által biztosított OATH2 provideren keresztül kéri le a JWT tokeneket. Ezeket használja a hozzáférhetőség ellenőrzésére, illetve ezekkel hívja az API végpontokat, amikhez szintén be van kötve a Cognito-s authorizer, így ezek elérése is csak bejelentkezett felhasználók számára biztosított.
Az authentikáció admininsztrálását a Cognitoban tudjuk megoldani, a felületen csak előre megadott email címmel lehet belépni. Első belépéskor egy generált jelszóval, majd sikeres bejelentkezés után, új jelszó megadásával léphetünk be a felületre. A továbbiakban a user által megadott jelszó lesz érvényes.
Lambda
Lambdákat több helyen is használunk a megvalósításban. A frontendet kiszolgáló API Gateway végpontok mögé egy-egy Lambda van bekötve, amik kommunikálnak az adatbázissal, és az IoT topicokkal történő üzenetek küldésével az eszközökkel is. Az eszközök felől kártyaleolvasáskor érkező message routing rule triggerek is indítanak lamdát, hiszen itt a logika az, hogy az adatbázis állapota alapján ellenőrizni kell, hogy az adott eszköz bekapcsolt állapotban van-e, a kártya belépésre jogosult-e és ezeknek megfelelően válasz üzenetet kell visszaküldeni arra vonatkozóan, hogy nyitható-e az ajtó.
API Gateway
Az API végpontok az AWS API Gateway szolgáltatásával vannak kiajánlva, a megvalósításnál a REST API típust használtuk. Minden végpont mögé be van kötve a cognito authorizer, így védve vannak az illetéktelen hívástól, illetve egyes végpontoknál (pl. a belépési eseményekhez tartozó listás lekérdezéseknél [GET /employees/events]) be van kapcsolva a proxy integration kapcsoló, amire azért van szükség, mert a feldolgozó lambdában a requestből származó adatokra is szükségünk van. A korábban említett végpont esetében például a lapozáshoz használt limit, offset attribútumok query paraméterként kerülnek átadásra.
Kártyaolvasó és hőmérséklet-szenzor
Az IoT eszközök oldalán két kontrollert használtunk:
a beléptetétőrendszerért egy ESP8266-os mikrokontroller, és egy hozzá csatlakoztatott RC522-MFRC RFID olvasó felel.
A hőmérséklet szenzoros adatok előállításához az ESP32 modul beépített hőmérséklet szenzorját használjuk. Mindkét eszköz csatlakozik az AWS IoT moduljához, és üzenetekkel kommunikál az MQTT protokoll használatával.
Működésüket tekintve mindkettőn Arduino keretrendszer fut, a használt boardok a következők voltak:
ESP8266: Generic ESP8266 Module
ESP32: DOIT ESP32 DEVKIT V1
A fejlesztéshez szükséges néhány előzetes beállítás az Arduino IDE-ben. Az alábbiakban ezek vannak részletezve.
A board managerek közé ezeket kell felvenni:
https://arduino.esp8266.com/stable/package_esp8266com_index.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
A használt, telepítendő libek:
- MQTT (2.5.1)
- PubSubClient (2.8)
- MFRC522 (1.4.10)
- ArduinoJson (6.21.3)
- TaskScheduler (3.7.0)
A hőmérséklet adatok megjelenítésére az ApexCharts tool segítségét használtuk. Egy állítható skálázású grafikonon jelenítjük meg az utolsó maximum 100 mért értéket.
Pár kép a használatról
Az adminisztrátori felületre bejelentkezést követően megnézhetjük a korábbi belépéseket:
Belépés engedélyezett kártya esetén:
Belépés visszautasítása:
A hőmérséklet adatokat is megtekinthetjük az adminisztrátori felületen:
A szenzor logja:
Ha új eszközt akarunk felvenni a rendszerben, akkor azt a management konzolban az IoT Core felületén a Things menüpontban fel kell venni, és az eszközoldali kódban is gondoskodni kell arról, hogy a generált tanúsítványok használatával kapcsolódjon az AWS IoT szolgáltatáshoz (a generált certificate-eket a Secrets.h-ba fel kell venni).
A Secrets.h-ban állítható be továbbá a WIFI kapcsolódáshoz szükséges adatok a WIFI_SSID és WIFI_PASSWORD változókban.
Összefoglalva a POC-ot az látható, hogy bizonyos komplexebb rendszerek is viszonylag olcsón és gyorsan megvalósíthatók, ha a gyártó által biztosított saját szolgáltatásokat is igénybe vesszük. Ezek arra is jók, hogy ha valaki még csak ismerkedik a clouddal a szervezeténél, kipróbálja azokat, ha tetszik és működik, akkor élesbe állítja, ha nem, akkor egyszerűen leállítja az accountot. Ez utóbbi esetben nem fog a polcon állni egy feleslegesen beszerzett szerver, hanem csak a teszt idejéig futott (ráadásul a Free Tier miatt ingyen, vagy bizonyos fizetős szolgáltatások esetében részben ingyen) egy AWS account.