Internet of Things mini keretrendszer

A keretrendszer vezetéknélküli szenzorokat és beavatkozókat köt az Internetre. Közben egy template alapú transzformációval a szenzorok bináris adatait ember által olvasható JSON formátumú üzenetekké alakítja, így megkönnyíti a hibakeresést, vezérlőüzenetek manuális injektálását és csökkenti a magasabb szintű alkalmazások illesztésével járó hiba kockázatát.

A szenzorcsomópontokat Arduino mikrokontrollerek adják, melyek NRF24L01+ rádiós interface-el vannak felszerelve. A szenzorhálózat és az Internet közti átjárást egy Raspberry Pi biztosítja. Az üzeneteket egy MQTT bróker osztja szét a különböző komponensek közt.

Előfeltételek

A Raspberry Pi-re telepíteni kell a Raspbian operációs rendszert. A teljes installáció tartalmaz minden szükséges alkalmazást és eszközt. Telepítés után engedélyezni kell az SPI busz használatát (raspi-config -> Advanced Options) és beállítani, hogy indításnál töltse be a kernelmodult. A Raspbian telepítésének menete itt érhető el. Nem szabad megfeledkezni a partíció kiterjesztéséről a teljes SD kártyára!

A szenzorcsomópont fejlesztéséhez szükséges az Arduino fejlesztőkörnyezet. Érdemes a legfrisebb verziót használni, mert sok hasznos szolgáltatással bővült az alkalmazás. Az Arduino IDE innen tölthető le.

A csomópontokon futó szoftver és könyvtár git repóból érhető el, ehhez szükség van git verziókezelő rendszerre. Windows alatt talán a legjobban használható felhasználói felülettel a git-scm rendelkezik.

A Raspberry-n végzett munkához szükséges egy SSH kliens, Windows alatt ez tradícionálisan a putty. E mellett kényelmes egy grafikus SCP kliens használata is, Windows alatt a WinSCP.

Az mqtt-spy futtatásához szükséges a legfrisebb Java, érdemes az SDK-t feltenni.

Telepítés menete

Szerver

A rendszer komponensei egy MQTT brókeren keresztül fognak egymással kommunikálni. Ezt a szerepet a mosquitto foja ellátni rendszerünkben. A nyílt forráskódú alkalmazás letölthető minden meghatározó platformra, de része a Debian, Ubuntu és Raspbian repóknak is. Egyetlen portot használ, így hostolható NAT-olt hálózaton is, ha az átjáró támogatja a port továbbítást.

Ha fejlesztés közben nem áll rendelkezésre dedikált szerver, a mosquitto futtatható a fejlesztői gépen, vagy egy Raspberry-n is.

Fejlesztői gép

Az előfeltételek mellett a fejlesztői gépre érdemes feltenni a korábban már említett mqtt-spy alkalmazást. Ez egy Java alapú MQTT kliens, amin keresztül elérhető az összes MQTT szolgáltatás. Telepítést nem igényel, a JAR file letölthető a projekt-oldalról. Letöltés után létre kell hozni egy konfigurációs file-t (a funkció elérhető a grafikus felületről), ezt követően lehet csatlakozásokat hozzáadni.

Kisérletképpen érdemes csatlakozni a korábban telepített mosquitto szerverhez, feliratkozni az összes topic-ra (#) majd közzétenni néhány üzenetet.

Raspberry Pi

Az RPi-n az NRF24 átjárót és az MQTT illesztőt kell futtatni. Mivel az NRF átjáró paraméterként várja azt az UDP portot, ahova a beérkező csomagokat tovább kell küldeni, érdemes az MQTT illesztővel kezdeni a munkát.

Data MQTT proxy

A data_mqtt_proxy egy egyszerű Java alkalmazás, mely template-ek alapján feldolgozza az UDP csomagokban kapott bináris üzeneteket, és JSON formátumban továbbítja azt egy MQTT brókernek, illetőleg a megadott vezérlő topicon érkező üzeneteket ugyanezen template-ek alapján átfordítja bináris üzenetekké és a megadott UDP portra küldi. Ez elsősorban egy absztakciós réteg, ami elválasztja a magas szintű alkalmazásokat a bináris adatoktól, így a mobil- és webalkalmazások kódja független lesz az NRF hálózat üzenetformátumától és számábrázolásától. Illetőleg könnyebbé válik a szenzorok mokkolása, a felhasználói alkalmazás tesztelése és debuggolása.

A letöltött jar file-t érdemes a Raspberry-n futtatni, de helyet kaphat akár a szerveren is, ameddig a Raspberry tudja címezni a komponens UDP portját. A jar három paramétert vár a futáshoz, az első a konfigurációs file-okat tartalmazó könyvtár elérhetősége, a második a mappa, amibe a dekódolt csomagokat menti, a harmadik pedig az alkalmazás-log mappája. A konfigurációs file-okra elérhető itt egy minta. A base_config.json tartalmazza az alkalmazás indításához szükséges információkat. Az egyes típusokhoz tartozó konfigurációkat az alkalmazás dinamikusan frissíti, ha változik a konfigurációs könyvtár tartalma.

A data_mqtt_proxy-t a rendszerrel együtt érdemes elindítani, de bármikor újraindítható, a többi komponens működését az újraindítása nem befolyásolja.

NRFGW

Az NRFGW egy átjáró, ami az NRF hálózatban kapott csomagokat kiegészíti a küldő csomópont címével és egy időbélyeggel, majd továbbküldi a data_mqtt_proxy-nak. Ehhez először az áramtalanított Raspberry Pi-hez illeszteni kell egy NRF24L01+ modult. Az SPI busz mellett egy CE lábat is be kell kötni, a küönböző NRF könyvtárak ennek a megválasztásában is eltérnek. A Raspberry Pi könyvtárakban sajnos a data_ready interrupt nem működik, így nem kell bekötni. Az általunk használt pinout az alábbi ábrán látható.

Ha készen áll a hardware, telepíteni kell egy NRF24 drivert. Sok implementációja létezik az NRF kezelőnek, ezek többé kevésbbé - és külnböző teljesítménnyel - működnek. A mi rendszerünk a TMRH20 fork-ra támaszkodik. Követve az itt elérhető telepítési útmutatót néhány lépésben készen áll a driver. Érdemes telepíteni az összes komponenst, amire rákérdez.

Ezt követően le kell tölteni az NRFGW kódját az alábbi paranccsal:

git clone http://gitlab.tmit.bme.hu/smartcity/nrf.git

Belépve az nrfgw könyvtárba le kell fordítani az alkalmazást:

make
make install

A háttérben futtatáshoz fejlesztés alatt nem túl elegáns, de kényelmes megoldás egy tmux session-ben indítani el bootoláskor az alkalmazást:

sudo apt-get install tmux

Majd a projekthez mellékelt startup.sh.sample alapján kell megírni a saját startup scriptet. A két fontos paraméter az UDP host és port, ahova a bináris adatcsomagokat a rendszer ki fogja küldeni, és a csatorna, amelyiken az NRF figyelni fog.

cp startup.sh.sample startup.sh​

Futási jog adása a startup.sh-nak.

chmod +x startup.sh

Itt érdemes kipróbálni a scriptet

./startup.sh

Végül ki kell egészíteni az /etc/rc.local filet a startup.sh hívásával, hogy a rendszer indulásakor elinduljon az NRFGW is.

Arduino

Az Arduino-hoz egy kicsit átalakított NRF24 könyvtárat használunk. Ezt a fejlesztői gépre kell gittel letölteni:

git clone http://gitlab.tmit.bme.hu/smartcity/nrf.git

Letöltés után az arduino könyvtár tartalmát tömöríteni kell egy NRF24_TMIT.zip file-ba. zip file-t hozzá kell adni az Arduino IDE-ben könyvtárként. Ezt követően a boards_ss.txt-file tartalmát hozzá kell másolni a saját boards.txt file-hoz, ami a c:\Program Files (x86)\Arduino\hardware\arduino\avr\ mappában található. A sikeres másolás ellenőrzésére újra kell indítani az Arduino IDE-t, és a Tools menüben a Board almenü alatt elérhető lesz a SmartSwitch család. A lapka pontos kiválasztása a Processzorok közt történik. A hardver verziója rá van szitázva a NYÁKra (2016.03.10.-én a legfrisebb lap a 9x9 v0.2).

Ezt követően valamely mintakód betöltésével használható a rendszer.

Rendszer használata

A fenti rendszer megfelelően konfigurálva eljuttatja a SmartSwitch-en generált vagy gyűjtött adatokat az MQTT brókerig. Az MQTT egy széles körben elterjedt protokoll, minden meghatározó programozási nyelvhez elérhető hozzá illesztőkönyvtár, amik segítségével létrehozhatóak a felhasználói alkalmazások.

Arduino szenzor alkalmazás

Az Arduino könyvtár két mintakódot tartalmaz. Egy "szenzort", ami egy sorszámot küld másodpercenként, és egy "beavatkozót" ami a kapott byte-ot kiírja a soros porton. A keretrendszer teszteléséhez a szenzor kódot kell feltölteni az Arduino-ra vagy SmartSwitch lapkára. Hasznos alkalmazás a csomagvesztés kimérése, ehhez érdemes a csomagok közti időt csökkenteni, vagy kivenni minden késleltetést.

A mintakód 2Mb/s -os sebességet, és maximális erősítést használ. Tapasztalataink szerint ezekkel a beállításokkal lehet a legjobb átvitelt biztosítani, de ez függhet a konkrét hardware-től, ezért érdemes más kombinációkkal is próbálkozni. A lehetséges értékek az RF24.h file elején találhatóak az enum deklarációkban. Fontos az nrfgw2 sebességét is ugyanarra az értékre állítani (-s opció), egyébként az eszközök nem látják egymás csomgajait. A csatornák közt nem találtunk kiemeltet, itt csak arra kell figyelni, hogy minden eszköz, aminek egymással kell kommunikálnia ugyanazt a csatornát használja.

Java alkalmazás

MQTT kliensként egy Java alkalmazásra mutatunk példát, de minden nyelven (python, node.js, C++, ruby ....) elérhetőek könyvtárak. A Java alkalmazás fejlesztéséhez az Eclipse fejlesztőkörnyezetet, és 7-es vagy 8-as Java-t érdemes használni. MQTT illesztéshez a paho könyvtár használható. Hasznos eszköz adatok megjelenítéséhez a JFreeChart, mely nagyon sok különböző grafikont képes megjeleníteni, köztük az órát és a dinamikus XY plotot, ez a két komponens jól használható valós idejű adatok megjelenítésére. A mellékelt két Java file mintát tartalmaz az MQTT kliens és az óra használatára.