Fejlesztői dokumentáció I. Python - adipapp/Raspberry GitHub Wiki

Bevezetés, célok

Egy komplex szenzorikai méréseket megvalósító szoftver megalkotása volt a célunk, amelynek segítségével minimális informatikai háttértudás mellett - elsősorban az általános és középiskolás diákok számára - is lehet érdekes és hasznos fizikai méréseket végezni a Raspberry PI szenzoraival. Ennek megvalósítására készítettünk egy elsősorban frontend alapokra épülő webes felületet, amely a felhasználói interakcióért, a mérési paraméterek feldolgozásáért illetve Raspberry-nek való küldéséért, és részben az adatmegjelenítésért felelős, az adatok begyűjtéséért a megadott paraméterek alapján, valamint azok a további egyszerű felhasználhatóságának biztosítására pedig készítettünk több kódot Python programozási nyelven. Azért döntöttünk a frontend web technológiák mellett, mert célunk a minél egyszerűbb és kézenfekvőbb használat megvalósítása volt. Így egyszerű böngészőablakból, mindenféle külső program vagy szoftver elindítása nélkül lehet használni, illetve a backend kód minimalizálásával pedig a szükségtelen oldal újratöltések és http kérések elkerülhetővé válnak. A Raspberry ezen felül, mint szerver is funkcionál web, illetve mail szerepkörökkel. Ezen dokumentációban bemutatásra kerül az összes olyan technika, amit az adatok begyűjtéséhez, kezeléséhez használtunk illetve az ezekhez kapcsolódó backend kódok.

Feladatleírás, követelmények

A szenzorok által küldött adatok kezeléséért, feldolgozásáért felelős kódokkal szemben állított követelmények, ellátandó funkciók listája:

  • a kódnak átadott paramétereknek megfelelően választott szenzorral mérés elvégzése
  • a mérési paraméterek megfelelő fizikai mennyiségekbe való átváltása
  • a mérési adatok rögzítése a felhasználók számára szóló általuk megadott nevű fájlba (.xlsx), illetve a további szoftver által használt kódok számára elérhető mérési eredményeket tároló fájlba (.txt).

Környezet, szükséges csomagok, programok

Működési/tesztelési környezet:

  • HW: Raspberry PI B3+
  • OS: Raspbian Stretch 4.14
  • Browser: Chromium 1.0.154.65

Fejlesztői környezet:

  • OS: Raspbian Stretch 4.14
  • IDE: Thonny 3.0.8

A szükséges csomagok:

  • XlsxWriter
  • adafruit-adxl345
  • Adafruit-BMP
  • adafruit-circuitpython-tsl2591
  • w1thermsensor

Architektúra:

arch

A fenti ábrán projektünk architektúrájának szemléltetése látható. A kliens oldalon a HTML, CSS és pure JavaScript alkotta webes interfész fut a böngészőben, amelyet a Respberry-n egy Apachewebszerver hosztol. Amennyiben a felhasználó interakciót kezdeményez a szerverrel, például mérést indít, a kliens(egész pontosan a JavaScript) egy HTTP kérést küld az Apache szervernek az AJAX technológiának megfelelően. A HTTP kérés mindig egy PHP szkriptre irányul, amely meghívásakor elindítja a megfelelő szenzorhoz tartozó Python szkriptet, emailt küld, adatot olvas, feladata sokrétű. Azaz a PHP egyfajta hídként vagy összekötőként működik a szerver hardverét közvetlen használó és vezérlő Python szkriptek(valamint az email küldést végző Postfix) és a kliens böngészőjében a felhasználóval kapcsolatot tartó JavaScript között.

A webes interfész felépítése

A webes interfész hierarchikus könyvtárstruktúrába szervezett fájlok gyűjteménye. A fájlok aloldalanként külön könyvtárban kaptak helyet a DocumentRoot-ban:

  • welcome: az üdvözlőképernyő fájljai
  • main: a fő, mérésvezérlő oldal fájljai
  • geogebra: a geogebra beágyazásához szükséges fájlok(a GeoGebra nevű alkönyvtárban a GeoGebra 6, és API-jának fejlesztői oldaláról letöltött fájljai találhatóak)
  • error: egy fallback hibajelző oldal arra az esetre, ha valamely kért aloldal nem található vagy valamilyen okból nem tölthető be
  • img: itt találhatóak a felhasznált fényképek, ábrák A webes interfészen belül a python scriptek a main könyvtárban kaptak helyet.

Adatok tárolása, szerializáció:

A mért adatok tárolása .xlsx formátumban történik a későbbi, minél széles körűbb felhasználói hasznosítás miatt. A GeoGebra ezt nagyon könnyedén tudja feldolgozni, de Excelben is sok műveletet hajthatunk végre az adatokon. De mivel ez egy bináris formátum, a JS-nek pedig(legjobb tudásunk szerint) nincs API-ja ezt olvasni, ezért ezzel párhuzamosan egy ideiglenes .txt fájlba is kiírásra kerülnek az adatok. Új mérés esetén a régi .txt fájl íródik felül, így felesleges adattal nem szemeteljük tele a szervert. A listás formátumú adatok vágólapra másolhatóak, és a GeoGebra beágyazott felületébe illeszthetőek további felhasználásra. Az .xlsx fájl pedig emailben elküldhető, így a felhasználó a mérési adatait egyszerű és kézenfekvő módon el tudja magának juttatni, és azokat a továbbiakban felhasználni.

A Python kódok:

Az adatok begyűjtését, kezelését végző kódok, egytől egyig hasonló sémára épülnek, ennek praktikussága, hogy így egyegységes, letisztult érthető kódot kapunk, a további megértést kommentezéssel segítettük. A program részek:

  • aqtemp.py
  • gyro.py
  • lux.py
  • press.py

Az alapvető felépítés a következő:

  • az első sor mindegyik programelem esetében a kódolás beállításával történik (UTF-8)
  • a következő egység a szükséges csomagok importálása, illetve a méréshez szükséges változók deklarálása
  • ezek után megtörténik az .xlsx létrehozása az XlsxWriter csomag segítségével és a .txt fájl létrehozása
    • a .txt neve mindig adott data.txt
    • a .xlsx minden esetben parancssori argumentumtól kapja a generálandó fálj nevét (sys.argv[1])
    • majd a munkafüzet alapvető tulajdonságai kerülnek beállításra.
  • a további mérési paraméterek átvétele következik, szintén a parancssori argumentumokat alkalmazva.
    • frekvencia (sys.argv[2])
    • időköz a frekvencia értékéből számolódik
    • időköz (sys.argv[3])
  • a méréshez szükséges változók deklarálása
  • ezzel előkészítésre került a mérés, itt indul el egy ciklus mely már megfelelő paraméterekkel rendelkezik a méréshez.
    • megtörténik az adatok. txt-be való kiíratása
    • a .xlsx-be való kiíratás
    • ezek után pedig a szükséges változó beállítások
  • miután a ciklus befejezte a futást a fájlok lezárásra kerülnek