Önálló laboratórium beszámoló BME-TTT
Készítette: Gruber Kristóf Szak:
műszaki informatikus
E-mail cím:
Konzulens(ek):
Email címe(k): Tanév:
Neptun-kód: YCN70J Szakirány: Médiainformatika
Dr. Vida Rolland
[email protected]
2007/2008. 2. félév
Téma címe: Virtuális Post-It
A témán a félév során közösen dolgoztam Sik András Ferenc kollégámmal. Természetesen a munkának voltak közös fázisai, döntések, melyeket közösen kellett meghoznunk. A beszámolóban azonban teljes mértékben nyomon követhető az önállóan elvégzett munka. Feladat:
A feladat célja egy elektronikus "üzenőfal" létrehozása, amely alkalmas un. "virtuális post-it" üzenetek fogadására és tárolására, személyre szabott megjelenítéssel. A konkrét megvalósítás egy kijelzőből (pl. LCD monitor) és vezetéknélküli hozzáférési képességekkel (Bluetooth, WiFi, infra) rendelkező PC-ből (vagy egyéb hasonló képességekkel rendelkező eszközből) áll. Az üzenetet hagyni kívánó, ill. az üzeneteket olvasni akaró felhasználó a platform elé állva hagyhat, ill. kaphat üzenetet. Üzenetek elhelyezése lehetséges minden vezetéknélküli hozzáférést támogató kézi eszközről (pl. okostelefon, PDA). Az üzenetek leolvasása a felhasználó azonosítása után történik majd. Lehetnek publikus, mindenkinek szóló üzenetek, vagy személyre szabott, virtuális post-it-ek is. A feladat szervesen kapcsolódik a TMIT kutatóinak a Mobil Innovációs Központ (MIK) keretein belül végzett munkájához.
1. A laboratóriumi munka környezetének ismertetése, a munka előzményei és kiindulási állapota Bevezető/elméleti összefoglaló
A feladat a közismert “Post It” cetlik elektronikus megvalósítása, kihasználva ennek előnyeit. A célunk az volt, hogy egy adott helyre fixen beszerelhető gépen olyan szoftverkörnyezetet alakítsunk ki, amely alkalmas vezeték nélküli üzenettovábbításra több, a közelben tartózkodó felhasználónak, anélkül, hogy az üzenetet illetéktelenek megkapnák. Vezeték nélküli technológiának a Bluetooth-t választottuk, mivel ilyen kis méretű igény szerint kialakuló hálózatok létrehozására az tűnt a legalkalmasabbnak. A Bluetooth technológia segítségével lehetőségünk adódott arra, hogy az eszköz, amire a programot írtuk, képes legyen érzékelni és a beregisztrált telefonok és PDA-k alapján azonosítani is a közelben tartózkodó embereket. Így csak a nekik szóló üzeneteket kézbesíti majd ki. A vezeték nélküli képességeken kívül idén nagy hangsúlyt fektettünk a Nokia 770-es kijelzőjének kihasználására, vagyis hogy lehetőség legyen az érintőképernyőn navigálva böngészni a nekünk szóló üzeneteket, valamint újakat küldeni onnan, talán kényelmesebb módon, mint a saját kisebb, nem erre kiélezett mobiltelefonunkról. A munka állapota, készültségi foka a félév elején
A munka során a korábbi, 2007-2008/1. féléves önálló labor témánkat folytattunk. Az előző félév végére elkészült egy, a Nokia 770-es Internet Tablet-en futó, Python nyelven íródott program, mely bizonyos időközönként lekérdezte a közelben tartózkodó Bluetooth eszközök címeit, és kiszűrte közülük az előre regisztrált felhasználókat, valamint felhasználói csoportokat. Továbbá képes volt az üzenetek tárolására, és elkészült az üzenetek kézbesítését megvalósító kód is, azonban a konkrét Bluetooth file küldést nem sikerült megvalósítani. Konkrétan az előző félévről kapott anyagok: • Felkonfigurált, fejlesztésre alkalmas Nokia 770 • 125 programsornyi Python kód, amely alkalmas a fent említettekre
2. Az elvégzett munka és eredmények ismertetése Az általam konkrétan elvégzett munka bemutatása
Az előző félévben abbahagyott munkát folytattam. Andrással párhuzamosan dolgoztunk a projekten. Amíg ő a Bluetooth fájlküldés, valamint fájl fogadás problémáját sikerrel megoldotta, én a grafikus felület lehetőségeit kezdtem el tanulmányozni. A grafikus felület tanulmányozása
A Nokia 770-esen futó IT OS 2006 rendszer (ami egy Debian alapú Linux disztribúció) alapértelmezett grafikus interfésze egy GTK/Gnome alapokra épülő, Hildon elnevezésű felület. A lehetőségeknek alaposan utánajártam és úgy döntöttem, hogy kielégítő mennyiségű dokumentáció és példaprogram áll rendelkezésre Python-hoz a Hildon[1] interfész használatának elsajátításához, így elkezdtem különböző tanító anyagokat[2] vizsgálni a Hildon működéséről, valamint különbőző, egyszerű programokat írtam, amik a felület képességeit próbálgatták[3][4]. Miután elég felkészültnek láttam magamat az érdemi munka elkezdéséhez, nekiláttam a tavalyi alkalmazásunk grafikus felülettel való kiegészítéséhez. Ez egy bizonyos, elég kezdetleges szintig el is jutott, utána viszont Andrással felismertük, hogy ha később is felhasználható, olyan kódot szeretnénk írni, ami nem csak belső használatra állja meg a helyét, akkor át kell térnünk a Modell-View-Controller (MVC) architektúrára, ami lehetővé teszi, hogy a program üzeneteket kezelő része és a grafikus megjelenítésért felelős programkód egymástól független legyen. Így később — pl. asztali PC-n futtatáskor, vagy egy okostelefon port elkészítésekor — nem függünk a GTK meglététől, hanem a grafikus felületet egyszerűen lecserélhetjük az aktuális eszköz által támogatottra. Objektum-orientált szemlélet
Az MVC architektúrához szervesen párosul az objektum-orientált szemlélet, ami számunkra szintén új dolog volt a Python nyelvben, így pár napot a Python objektumorientált képességeinek megismerésével töltöttünk[5]. Felmerült a probléma, hogy párhuzamosan több feladatot is végre kell hajtanunk (pl. GUI-t kezelni és üzenetet fogadni), így a szálkezelés lehetséges megoldásait[6] is tanulmányoztam Python nyelven. Ezek után újragondoltam a programunkat objektum-orientált szemléletben, és kialakítottam az új osztályainkat. A meglévő kód adaptációja szintén igénybe vett pár napot.
A következő osztályok kerültek kialakításra: • VirtualPostIt A Controller-t megvalósító osztály. Feladata a program osztályainak létrehozása, a PyGTK rendszer inicializálása, a szálkezelés elindítása, valamint a Nokia 770es bizonyos hibáinak futási időben történő előzékeny javítása (pl. a Bluetooth szerver kívülről láthatóságának bekapcsolása, mivel a BlueZ config fájlban eltárolt értéket hajlamos figyelmen kívül hagyni a készülék[7]). Szintén itt történik meg indításkor az előző futtatások után hátramaradt felesleges fájlok törlése is, hogy biztosan ne zavarjon be semmi. Izgalmas kutatómunkát igényelt[8] annak megoldása is, hogy a program indításakor, valamint új üzenet érkezésekor a kijelző háttérvilágítását bekapcsolja a program. A megoldást szintén alkalmazza a VirtualPostit osztály screen_turn_on metódusa. • OutgoingHandler A modellhez tartozó osztály, amely a rendszerben lévő üzenetek kézbesítéséért felelős. A Controller példányosítja. A program indítása után elindultó négy fő szál (VirtualPostit, MainWindow, IncomingHandler és OutgoingHandler) egyike. Példányosítása után első dolga betölteni az előre definiált nevű könyvtárakban levő adatokat (felhasználók, csoportok, üzenetek, ld. később). Ezeket feldolgozza, a program működéséhez elengedhetetlenül szükséges asszociatív tömböket felépíti belőlük. A fő ciklusa tartalmazza nagyrészt a tavaly megírt programrészletet, ami a felhasználók periodikus scannelését végzi, beazonosítja az ismert felhasználókat a regisztrált eszközeik alapján, és kikézbesíti nekik Bluetooth-on a rendszerben lévő, nekik szóló üzeneteket. A kódon csak kisebb fejlesztéseket végeztem, kivéve a küldés pontos implementálását, ami tavaly parancssori OBEX fájlküldő program hiányában nem volt megvalósítható: A kiküldéshez a program a fun_encode.py fájlban lévő segédfüggvények segítségével (melyeket András írt) vNote formátumú üzenetet állít elő a nyers szöveg formátumú tárolt üzenetekből, majd ki is kézbesíti a kreált fájlt a megfelelő paranccsal. • IncomingHandler A modellhez tartozó osztály, amely a bejövő üzenetek feldolgozásáért felelős. A bejövő üzeneteket nem a programunk, hanem a megfelelően feltelepített és beállított sobexsrv[9] OBEX szerver program fogadja, és menti el egy megadott könyvtárba (/home/user/receive). Az IncomingHandler feladata periodikusan fi-
gyelni a könyvtár tartalmát, ha ott megjelenik egy fájl, akkor azt feldolgozza, vagyis amennyiben az vNote formátumú üzenet, akkor a tartalmazott szöveget kinyerje belőle, ha ASCII szöveg, akkor üzenetként értelmezze, különben pedig dobja el. Az értelmezett üzenetek a messages mappába képződnek le. Az osztály nagyrészt András munkája, de én is sokmindent hozzátettem. • MainWindow A program fő ablakát megjelenítő osztály. (Ablakok alatt a Hildon interfész esetén teljes képernyőt betöltő, inkább logikai egységeket kell érteni.) Az ablakok felépítése következetesen minden képernyőn hasonló, a navigációt megkönnyítendő. Az ablak bal felében a program logója, alatta pedig a főbb funkciók elérésére szolgáló funkciók találhatóak (jelen esetben “Add User” és “Login without Own Device”), jobb oldalon pedig az aktuális ablak érdemi tartalma (jelen esetben a Bluetooth-on észlelhető, tehát a közelben tartózkodó, azonosított felhasználók neve, és zárójelben, hogy hány olvasatlan üzenetük van). Az osztály példányosítása után elkészíti a grafikus felületet, valamint a modelltől lekérdezi annak állapotát (pl. a modell épp scannelést végez, üzenetet kézbesít), valamint a modell által látott felhasználók listáját. Ezeket az információkat periodikusan frissíti. A modell állapotát a logó alatti szövegmezőben jeleníti meg (“Scanning…”, “Delivering…”, “Scanning & Delivering…”). A gombok jelenleg nem implementált funkciók elérését indítanák, így azok egyelőre inaktívak. A jobb oldalon a modelltől kapott információk alapján a MainWindow megjeleníti a látható felhasználók listáját[10]. A gombokra kattintva A UserWindow osztályból készül egy új példány. Külön figyelmet fordítottam a GUI frissítésének villogásmentes megvalósítására. (Vagyis egy-egy frissítési ciklus közt csak akkor változtasson a rendszer a GUI-n, ha tényleg történt változás.)
1. ábra: A MainWindow ablak (VNC-n keresztül)
• UserWindow A felhasználók a MainWindow ablakában a nevüket a kijelzőn megérintve “beléphetnek” üzeneteik közé. Az üzenetlistájukat megvalósító osztály a UserWindow. A későbbiek során egy jelszavas azonosítást fogunk implementálni ide, ami lehetővé teszi, hogy ne nézhessék meg egymás üzeneteit a közelben lévő felhasználók. Az ablak felépítése hasonló a MainWindow-éhoz: A bal oldalon az új üzenet létrehozására szolgáló gombot és a kilépés gombját találjuk. Előbbi a NewMessageWindow-hoz visz, utóbbi pedig vissza a MainWindow-ba. A jobb oldalon az üzenetek listája található, aminek kezelése hasonlóan megoldott a MainWindow-ban lévő felhasználói lista frissítéséhez (csak változás esetén frissül a lista). Az üzenetek két GUI objektumból állnak: egy szövegmező tartalmazza magát az üzenetet, és mellette egy, az üzenet törlésére szolgáló gomb foglal helyet[11].
2. ábra: A UserWindow ablak (VNC-n keresztül)
A UserWindow szintén a modellel kommunikál a MainWindow-tól kapott felhasználó üzeneteinek lekérése érdekében. • NewMessageWindow A program új üzenetek írására szolgáló ablaka. Az osztályt nagy részben András írta. A bal odalon a UserWindow-hoz visszavezető Cancel gomb található, jobb oldalt pedig egy szövegmező, amelybe az üzenetet írhatjuk. A Delete after delivery checkbox-ot bepipálva az üzenet Bluetooth kézbesítést követően automatikusan törlődik a rendszerből, ellenkező esetben viszont a program minden adandó alkalommal próbálja kézbesíteni azt. Az OK gomb megnyomása után az osztály kinyitja a RecipientsWindow-t, amiben a felhasználók és csoportok listájából választhatunk címzettet, majd az üzenet “elküldésre kerül”, vagyis bekerül a megfelelő formátumban a kimenő üzenetek közé, amit a modell a következő könyvtár-olvasás alkalmával észlelni fog, és beolvas. Érdemes megemlíteni, hogy az érintésre előugró (a 3. ábrán látható) stylus-szal használható billentyűzeten kívül a Nokia 770 lehetőséget nyújt az ujjal való gépelésre is, amit egy teljes képernyős, nagy gombokat tartalmazó billentyűzet segít (4. ábra).
3. ábra: A NewMessageWindow (VNC-n keresztül)
4. ábra: Az ujj-billentyűzet (VNC-n keresztül)
• RecipientWindow Az üzenetküldéskor címzettválasztót megjelenítő osztály. Teljes egészében András írta. A program fájljai
A fent említett osztályokat tartalmazó fájlok: • • • • • • • •
fun_encode.py incominghandler.py mainwindow.py newmessagewindow.py outgoinghandler.py recipientwindow.py userwindow.py virtualpostit.py
A program indítására a start.sh bash script szolgál, ami törli a Python cache fájljait, kilövi a program esetleg beragadt, de még futó példányait, majd a python értelmezővel elindítja a program főosztályát (virtualpostit.py). A program által használt könyvtárak: • groups - a felhasználók csoportjait tartalmazza. Minden csoport külön fájl, minden fájlban található. A fájlok tartalma a felhasználók nevének listája (minden sorban új lista), a fájl neve határozza meg a csoport nevét. • messages - a már értelmezett, kézbesítendő üzenetek. Üzenetenként külön fájl. A fáljnév lényegtelen, jelenleg az aktuális dátumból generálódik. Az üzenetek tartalma a tavalyi dokumentációban megadott formátumú (címzett, kézbesítés után törlendő-e, kézbesítve van-e, majd az üzenet tényleges tartalma). Kézbesítés után (amennyiben az adott flag értéke ezt diktálja) az üzenetet törli az OutgoingHandler. • outbox - azok az üzenetek kerülnek ide, amiket elkezdett kézbesíteni a rendszer. A messages-ből beolvasott üzenet tartalma kerül ide vNote formátumba kódolva. Sikeres kézbesítés után törlődnek az üzenetek innen is. • parsefolder - az IncomingHandler által használt könyvtár, ami arra szolgál, hogy ha az említett osztály új, általa értelmezhető formátumú (vNote, ASCII text), Bluetooth-on fogadott fájlt talál a sobexsrv fogadásra kijelölt könyvtárában (/home/user/receive), akkor ide mozgatja azt, majd innen kezdi meg értelmezni és az üzenet tartalmát kibányászni a vNote fájlból. (Értelemszerűen ASCII text-tel is hasonló a helyzet, csak ott nincs szükség “kibányászásra”.)
• users - a felhasználókat tartalmazó könyvtár. Minden ember több eszközzel is be lehet regisztrálva a rendszerbe. A könyvtárban lévő fájlok nevei adják meg a felhasználó nevét, a fájlok tartalma pedig a felhasználók eszközeinek Bluetooth Address-e. A későbbiekben a grafikus felületen is lehetőség lesz új eszközök hozzáadására, amiket a rendszer majd ezekbe a fájlokba fog kiírni. A projekt által felhasznált külső programok (a Nokia 770-en alapból fenn lévőkön felül): • sobexsrv - nyílt forráskódú OBEX szerver BlueZ-ra • obexftp[12] - nyílt forráskódú OBEX kliens. Képes parancssori paraméterezéssel Bluetooth-on keresztül fájlt küldeni megadott eszközre.
Összefoglalás
A félév során a következő problémákat oldottam meg: • Nokia 770-en fellelhető grafikus felületek tanulmányozása • Ismerkedés a Hildon interfésszel • Ismerkedés a GTK programozással • Ismerkedés a PyGTK programozással • Ismerkedés a Python szálkezelésével • Ismerkedés a Python objektum-orientált programozásával • A program objektum-orientálttá tétele • A program MVC architektúrájának kialakítása • A program grafikus felületének elkészítése
3. Irodalom, és csatlakozó dokumentumok jegyzéke A tanulmányozott irodalom jegyzéke: [1] Maemo.org: Python-maemo-3.x: Hildon Widgets API for Python http://maemo.org/development/documentation/apis/3-x/python-maemo-3.x/pyhildon_widgets_all.html
[2] Maemo.org: Using Python in maemo 3.x http://maemo.org/development/documentation/how-tos/3-x/python_maemo_3.x_howto.html
[3] Maemo.org: Maemo 2.x APIs for Python http://maemo.org/development/documentation/apis/2-x/python-maemo-2.x/
[4] PyGTK 2.0 Tutorial http://www.pygtk.org/pygtk2tutorial/index.html
[5] Python Objects http://docs.python.org/tut/node11.html
[6] LinuxGazette.net: Understanding Threading in Python http://linuxgazette.net/107/pai.html
[7] Johan Hedberg: Nokia 770 Bluetooth discovery (a Bluetooth discovery bug javítása) http://nokia770.com/65
[8] Internet Tablet Talk Forums: Full backlight control from console http://www.internettablettalk.com/forums/showthread.php?t=16238&page=2
[9] Collin R. Mulliner: Scripting/Secure OBEX Server http://www.mulliner.org/bluetooth/sobexsrv.php http://www.mulliner.org/nokia770/
[10] The Pango Markup Language (PyGTK widget-ek formázása) http://www.pygtk.org/pygtk2reference/pango-markup-language.html
[11] Learning Python: Writing a Custom Widget Using PyGTK http://www.learningpython.com/2006/07/25/writing-a-custom-widget-using-pygtk/
[12] Obex-ftp WiKi http://dev.zuckschwerdt.org/openobex/wiki/ObexFtp
Csatlakozó egyéb elkészült dokumentációk / fájlok / stb. jegyzéke: A munkánk eredménye a későbbiek során elérhető lesz a http://gk.lka.hu címen található honlapomon.