Aplicatie Practica Pentru Comanda Remote a Unui Building Management System
PROIECT DE DIPLOMĂ
APLICAȚIE PRACTICĂ PENTRU COMANDA REMOTE A UNUI SISTEM BUILDING MANAGEMENT SYSTEM
Cuprins
CAPITOLUL I. Introducere
CAPITOLUL II. Tehnologiile utilizate
II.1 Platforma Android
II.1.1 Software Development Kit Android
II.1.2 Proprietățile principale ale SDK-ului android
II.1.3 Arhitectura sistemului Android
II.2 JAVA
II.3 Serverul HTTP Apache
II.4 JSON
II.5 GSON
II.6 Asynhttp
II.7 WebIOPI
II.8 Web.py (Python Framework)
II.9 Raspbian
CAPITOLUL III. Aplicație practică pentru comanda remote a unui sistem BMS.
III.1 Descrierea sistemului HomeBMS
III.2 Beneficiile aplicației HomeBMS
III.3 Modul de utilizare a aplicației HomeBMS
CAPITOLUL IV. Concluzii
Bibliografie
Anexa 1
Introducere
Motivația temei alese:
Motivația alegerii proiectului de diplomă intitulat Aplicație practică pentru comanda remote a unui sistem BMS se datorează tendinței moderne de a lega și muta totul în sfera digitală. Fiind într-o lume în continuă mișcare, iar evoluția necesității oamenilor de a fi mereu informați este în continuă creștere, altfel internetul a devenit indispensabil societății contemporane, fiind unul dintre cele mai rapide și eficiente metode de informare. Modalitatea rapidă prin care laptopurile au înlocuit desktopurile cu cațiva ani în urmă ne lasă o idee foarte clară asupra trendului crescător al tehnologiei ce dispune de facilități de accesare a datelor de oriunde în orice moment. Dezvoltatorii de aplicații mobile au înțeles foarte repede posibilitatea de înlocuire a laptopurilor și astfel au apărut aplicații mobile pentru iOS ( iPhone / iPad), Android, Windows Mobile, RIM (Blackberry), ce suplinesc softuri cu care ne-am obișnuit de la sisteme de operare ca Windows, Mac OS X sau Linux.
În acest context, s-a încercat dezvoltarea de aplicații mobile diverse. În cadrul acestei lucrări este prezentată o aplicație pentru telefoane mobile ce are ca scop informarea proprietariilor asupra caselor sau clădirilor. O parte din propietari dețin un sistem de alarmă realizat de ei ceea ce implică o rețea de fire în mod special pentru acest lucru și poate și un sistem video sau audio, din nou cu alte rețele de fire. Adunând toate rețele existente rezultă o mulțime de fire ca împânzesc casa, realizând fiecare funcția sa.
Astfel un sitem inteligent este capabil să ofere mai multe facilități fără ca o mulțime de fire să împânească casa. Sistemul dintr-o casă sau clădire dotat cu o aplicați pe telefonul mobil are ca scop creșterea gradului de confort, reducerea costurilor generate de funcționarea și întreținerea clădirii acestora în condițiile de maxim confort și siguranță. Atât acum cât și în viitor casele sau clădirile au nevoie de un sistem pentru gestionarea eficientă a datelor.
Scopul general al acestei lucrări se bazează pe implementarea unui sistem inteligent dotat cu o aplicație pentru telefoane cu sistem de operare Android ce permite proprietariilor să fie informați și să monotorizeze de la distanță o casă sau o clădire. Pentru implemetare hardware și software a sistemului voi folosi tehnologiile avansate pentru soluționarea obiectivelor propuse.
O astfel de aplicație cu sistem ar fi cerută de cei care dețin o casă sau un grup de clădiri, care se află în diferite locații, fără acces la un calculator și care doresc minim de efort și maximă siguranță.
Obiectivul principal al sistemului HomeBMS constă în a oferi controlul mobil al clădirii cu ușurință, astfel spus aplicația HomeBMS să facă dintr-un smartphone o telecomandă ușor de utilizat pentru toate funcțiile clădirii. Implementarea tuturor strategiilor de a reduce pierderile în cazul unor situații de excepție având un răspuns instant și în condiții limită. Aplicația HomeBMS este compatibilă cu sistemele de operare Android.
Tehnologiile utilizate
Platforma Android
Android este alcătuit din mai multe straturi, fiecare reprezentând o funcție specifică și având responsabilități clare. Acestea sunt:
Applications: reprezintă aplicațiile prezente pe Google Play.
Application Framework: Application Framework reprezintă o parte puternic integrată a platformei și a SDK-ului și oferă o serie de API-uri pentru interacțiunea high-level cu sistemul de operare.
Middleware Libraries: este o colecție de componente care fac legătura dintre sistemul de operare și aplicații. Aici sunt conținute funcții, cum ar fi stocarea de date, engine-ul grafic și altele.
Operating System: baza este reprezentată de sistemul de operare care este bazat pe Linux și se comportă exact ca și omologul de pe desktop[26].
Android este o combinație de trei componente:
Un sistem de operare Open Source pentru dispozitive mobile;
O platformă de dezvoltare Open Source pentru creearea aplicațiilor mobile;
Dispozitive, în special telefoane mobile, care rulează sistemul de operare Android și aplicații create pentru acesta.
Android este creat din câteva părți dependente și necesare[1]:
Un design de referință hardware care descrie hardware-ul necesar pentru un dispozitiv mobil care suportă suita software Android;
Un kernel al unui sistem de operare care asigură o interfață low-level cu hardware-ul, managementul de memorie și controlul proceselor, toate optimizate pentru telefoanele mobile;
Librării Open Source pentru dezvoltarea de aplicații care includ: SQLite, WebKit, OpenGL și un manager media;
Un mediu de execuție folosit pentru a executa și pentru a stoca aplicații Android, include mașina virtuală Dalvik și core-ul de librării care asigură funcționalitatea specifică Android. Mediul de execuție este gândit special pentru a fi mic și eficient astfel încât să poată fi folosit pe telefoane mobile;
Un framework de aplicații care expune servicii de sistem către layer-ul de aplicații. Framework-ul include managerul de ferestre și de locație, telefonie și senzori;
Un framework pentru o interfață folosită pentru lansarea în execuție a aplicațiilor;
Aplicații preinstalate livrate cu sistemul;
Un mediu de dezvoltare software pentru a crea aplicații; include diferite unelte, plug-in-uri și documentația necesară dezvoltării de aplicații.
Ceea ce întregește cu adevărat Android este filozofia open source a sistemului, care permite ca orice dezvoltator să poată fixa orice deficiență în interfața cu utilizatorul sau orice problemă de design a aplicațiilor native prin scrierea unor extensii sau prin înlocuirea aplicației. Android oferă dezvoltatorilor oportunitatea de a crea aplicații pentru telefoanele mobile exact așa cum au fost imaginate de către fiecare.
Software Development Kit Android
SDK-ul Android include un set complet de instrumente de dezvoltare. Acestea conțin un program de depanare, biblioteci, un emulator de dispozitiv (bazat pe QEMU), documentație, mostre de cod și tutoriale. Platformele de dezvoltare sprijinite în prezent includ calculatoare bazate pe x86 care rulează Linux (orice distribuție Linux desktop modernă), Mac OS X 10.4.8 sau mai recent, Windows XP sau Vista.
Cerințele includ, de asemenea, Java Development Kit, Apache Ant, și Python 2.2 sau o versiune ulterioară. Mediul de dezvoltare (IDE) suportat oficial este Eclipse (3.2 sau mai recent), utilizând plug-in-ul Android Development Tools (ADT), deși dezvoltatorii pot folosi orice editor de text pentru a edita fișiere XML și Java și apoi să utilizeze unelte din linia de comandă pentru a crea, construi și depana aplicații Android.
Software-ul de dezvoltare Android (SDK) include tot ceea ce ai nevoie pentru a începe dezvoltarea , testarea și debugging-ul aplicațiilor Android.
În SDK sunt incluse:
API-urile Android – Nucleul SDK-ului sunt librăriile de API-uri care asigură dezvoltatorului acces la stiva de aplicații Android. Acestea sunt aceleași librării pe care le folosește Google pentru crearea aplicațiilor native Android[1].
Tooluri de dezvoltare – Pentru transformarea codului sursă în executabil Android SDK-ul include mai multe tool-uri de dezvoltare, care îți permit să compilezi și să faci debugging pe cod.
Managerul virtual de dispozitive Android și Emulatorul – Emulatorul Android este un emulator de device-uri Android care vine cu functionalitatea completă. Emulatorul rulează sub un device virtual Android care simulează configurația hardware a unui dispozitiv. Folosind Emulatorul se poate observa felul în care aplicațiile vor arăta și se vor comporta pe un dispozitiv Android real. Toate aplicațiile Android rulează sub mașina virtuală Dalvik astfel încât emulatorul software este un mediu excelent pentru testare deoarece este independent de hardware.
Documentația completă – SDK-ul include informații despre referințele existente la nivel de cod detaliind exact ceea ce este inclus în fiecare pachet și fiecare clasă și cum pot fi folosite. În plus oferă explicații detaliate despre fundamentele dezvoltării pe un sistem Android.
Exemple de cod – SDK-ul Android include o selecție de exemple de aplicații care demonstrează o parte din posibilitățile oferite de Android[1].
Proprietățile principale ale SDK-ului android
Ca un sistem care suportă aplicații independente de platforma Android , acesta îți oferă oportunitatea de a crea aplicații care se integrează la fel de bine în sistem ca orice altă aplicație venită nativ odată cu sistemul. Următoarea listă evidențiază cele mai importante proprietăți:
Nu se percep taxe de licențiere, distribuție sau dezvoltare
Acces nativ la hardware-ul Wi-Fi
Acces la hardware-ul de telefonie ( GSM AGE 3G) care îți permite să faci transfer de date peste rețelele mobile sau să manipulezi convorbirile și SMS-urile
API –uri complete pentru servicii de localizare cum ar fi sistemul GPS
Acces complet la hardware-ul Multimedia incluzând înregistrarea și redarea video folosind camera și microfonul telefonului
API-uri pentru utilizarea senzorilor,printre care senzorul accelerometric
Librării pentru utilizarea Blutooth-ului pentru transfer de date client-client
Magazii de date partajate pe întreg sistemul[1].
Posibilitate de rulare în background a aplicațiilor și proceselor
Desktop (home-screen) care suportă Widgets , foldere și wallpaper-uri dinamice
Posibilitatea de a integra căutarea din aplicații în căutarea generală a sistemului
Un Browser Open – Source bazat pe un Web Kit ce suportă HTML 5
Suport total pentru aplicații care integrează controlul hărților Google în interfața lor grafică
Librării grafice optimizate pentru telefoanele mobile cu acces la accelerarea hardware a telefonului care includ o librarie grafică 2D și suport pentru grafica 3D folosind Open GL ES 2.0
Un framework de aplicații care încurajează reutilizarea componentelor din alte aplicații și înlocuirea aplicațiilor native[1].
Arhitectura sistemului Android
Arhitectura sistemului Android este compusă din: layer de aplicații, fremework-uri de aplicații, librării, mediul de execuție Android și kernel-ul Linux. Arhitectura sistemului Android se poate observa în figura de mai jos:
Fig. Nr.3 Arhitectura sistemului Android [24]
Simplu spus un nucleul Linux și o colectie de librării C/C++ sunt accesibile printr-un framework de aplicație care asigură diferite servicii pentru managerierea mediului de execuție și a aplicațiilor.
Arhitectura Android încurajează conceptul de reutilizare a componentelor , dând posibilitatea unui dezvoltator să publice și să împartă activități, servicii și date cu alte aplicații, restricționând accesul în funcție de necesarul fiecărei aplicații. Același mecanism care îți permite să creezi un manager de contacte care să-l înlocuiască pe cel inițial sau o aplicație de telefonie, permit unui dezvoltator să expună componentele aplicației pentru a lăsa alte aplicații să fie construite peste aceasta[1].
Următoarele servicii de aplicații sunt pilonii arhitecturali ai tuturor aplicațiilor Android, aceștia asigurând framework-ul folosit în dezvoltarea aplicațiilor:
Activity manager – Controlează durata de viață a tuturor activităților , include stiva de activități.
Views – Utilizate pentru a construi interfața grafică de necesarul fiecărei aplicații. Același mecanism care îți permite să creezi un manager de contacte care să-l înlocuiască pe cel inițial sau o aplicație de telefonie, permit unui dezvoltator să expună componentele aplicației pentru a lăsa alte aplicații să fie construite peste aceasta[1].
Următoarele servicii de aplicații sunt pilonii arhitecturali ai tuturor aplicațiilor Android, aceștia asigurând framework-ul folosit în dezvoltarea aplicațiilor:
Activity manager – Controlează durata de viață a tuturor activităților , include stiva de activități.
Views – Utilizate pentru a construi interfața grafică pentru activități.
Notification manager – Asigură un mecanism consistent neinvaziv pentru semnalarea diverselor evenimente.
Content providers – asigură acesul la date.
Resource manager – Asigură externalizarea resurselor care nu sunt alcătuite din cod figuri grafice.
Librăriile de bază
Fig. Nr.4 Librăriile de bază[24]
Toate aceste librării sunt scrise în C/C++
Surface Manager:
Este responsabil cu compunrea diferitelor ferestre și afișarea acestora pe ecran
Poate compune diferite ferestre ce sunt deținute de diferite aplicații, ce rulează în procese diferite, toate fiind actualizate în momente diferite
Se asigură că pixelii sunt afișați pe eran atunci când trebuie
Principalele 2 librării grafice sunt : OpenGL|ES și SGL
Aceste 2 librării pot fi combinate astfel încât să poată fi folosite în aceeași aplicație
OpenGL ES este o librărie 3D
Conține o implementare software care poate folosi accelerarea hardware dacă dispozitivul are atașat un cip de procesare 3D
SGL este o librărie pentru desenare /afișare 2D
Aceasta este libraria cea mai utilizată pentru afișare
MediaFramework
Se bazează pe PacketVideo's OpenCORE, poate înregistra și utiliza majoritatea formatelor de date audio și video
Cuprinde toate codecurile ce alcătuiesc experiența mediea MPEG4, H.264, MP3, AAC, AMR, JPG si PNG[1].
Fonturi (FreeType)
Curpinde fonturile folosite
SSL
SQLite
Librăria folosită pentru stocarea datelor
WebKit
Motor open source folosit pentru navigarea web, același browser este folosit de Safari (Apple)
Optimizat pentru o funcționare foarte bună pe ecrane mici pentru telefoane mobile
Libc
Sistemul de biblioteci standard C[1].
Nucleul Linux
Kernel Linux controlează serviciile de bază incluzând driverele hardware, procesele și managementul memoriei , securitatea, rețeaua și managementul rețelei de curent, astfel se poziționează între hardware și restul stivei.[1]
Fig. Nr.5 Nucleul Linux[24]
Este folosit linux deoarece oferă un mediu stabil, cu drivere deja existente pentru:
Afișaj
Cameră
Memoria Flash
Binder(IPC)
Tastatură
WiFi
Audio
Linux mai oferă de asemenea:
Gestionarea memoriei
Gestionarea proceselor
Securitate modelului
Gestiunea rețelelor
Infrastructură de bază robustă și a fost garatată de-a lungul timpului
Mediul de execuție Android
Ceea ce diferențiază sistemul Android de o implementare pe telefoanele mobile a unui sistem de operare Linux este mediul de execuție Android. Incluzând librăriile de bază și mașina virtuală Dalvik a mediului de execuție Android este motorul care rulează aplicația și împreună cu librăriile formează bazele framework-ului de aplicații.
Librăriile nucleului – În timp ce dezvoltarea sistemului Android se realizează în Java, Dalvik nu e o mașină virtuală de Java. Librăriile nucleului Android asigură marea majoritate a funcționalităților disponibile în librăriile nucleului Java precum și librăriile specifice nucleului Android.
Mașina virtuală Darvik – Dalvik este o mașină virtuală care a fost optimizată să se asigure că un dispozitiv poate rula mai multe instanțe eficient. Se bazează pe kernel-ul Linux pentru a rula pe mai multe fire de execuție și pentru managementul memoriei la nivel hardware[1].
Aplicații FRAMEWORK
Framework-ul de aplicații asigură clasele folosite pentru a crea aplicația Android. De asemenea asigură o abstractizare generică pentru accesul hardware și asigură managerierea interfeței grafice și a resurselor aplicației.
Reprezintă o sumă de unelte ce pot fi folosite de orice aplicație precum cele care vin cu telefonul sau aplicații scrise de utilizator.
Cuprinde:
Gestiunea activității (ActivityManager)
Coordonează ciclul de viață al aplicațiilor
Conține un back-stack comun astfel încât aplicațiile ce rulează în procese diferite să aibă o navigare cât mai lină
Gestionarea pachetelor (PackageManager)
ține cont ce aplicații sunt instalate pe dispozitiv, dacă descarcăm noi aplicații acest program trebuie să știe ce poate să facă fiecare aplicație în parte
Gestiunea ferestrelor (WindowManager)
gestionează ferestre- cuprinde funcții Jave ce se adaugă la gestiunea oferită de către SurfaceManager
Gestiunea telefonului (TelephonyManager)
Conține API-uri folosite pentru a construi aplicația telefon (principalul motiv al acestui SO)
Providerul de conținut (ContentProvider)
Este întâlnit doar la arhitectura android
Ofera posibilitatea ca datele să fie utilizate de alte aplicații
Este folosit în primul rând la aplicația-contacte astfel încât toată informația din contacte (numere de telefon, nume , adrese,….) să fie accesibilă altor aplicații.
Toate aplicațiile pot să folosescă acest serviciu astfel încât să afere acces liber la date
Gestiunea resurselor (ResouseManager)
Este folosit la stocarea vectorilor, bipmaps, lay-out-file-descptions, toate părțile externe unei aplicații care nu sunt codate[1].
Sistemul de vizualizare (ViewSystem)
Reprezintă o librărie de butoane, liste,toate componente ce pot fi folosite în aplicații.
Optimizat pentru a acepta ecrane de diferite mărimi și rezoluții
Gestiunea locațiilor (LocationManager) și Serviciile XMPP (XMPP_Service)
Conțin câteva API-uri ce oferă posibilitatea dezvoltării unor aplicații speciale
Gestiunea înștiințărilor (NotificationManager)
Oferă posibilitatea oricărei aplicații să pună un mesaj în bara de notificare. [1].
Mașina virtuală Dalvik
Unul din elementele principale ale sistemului Android este mașina virtuală Dalvik. Android folosește propria mașină virtuală creată special pentru a asigura eficiența unui mediu de programare bogat și cu limitările de memorie și chiar și unele constrângeri de proprietate intelectuală care au dus la inovare.
Mediul Android Java oferă o platformă de aplicații bogată și este accesibilă din cauza popularității Java în sine. De asemenea, cererea de performanță, în special în cadrul unei memorii reduse, cum găsiți într-un telefon mobil, este de o importanță majoră pentru piața de telefoniei mobilă. Dar aceasta nu este singura problemă.
Mașina virtuală Dalvik folosește kernel-ul Linux al sistemului pentru a asigura funcționalitatea de nivel scăzut, precum securitatea, rularea pe mai multe fire de execuție și managementul proceselor și a memoriei. Dacă acest lucru se dorește, se pot scrie aplicații C/C++ care rulează direct pe sistemul de operare Linux, dar deși acest lucru este posibil, în cele mai multe cazuri nu există nici un motiv pentru a se proceda astfel.
Întregul acces la hardware-ul dispozitivului și la serviciile sistemului sunt manageriate folosind Dalvik. Prin utilizarea unei mașini virtuale pentru a găzdui execuția aplicațiilor, dezvoltatorii au un layer abstract astfel încât nu trebuie luată în considerare o implementare hardware anume.
Aplicațiile sunt scrise în Java, care este compilat în codurile octet Java și, ulterior, traduse într-o reprezentare similară, dar în diferite fișiere denumit Dex .
Aceste fișiere logice sunt echivalente cu coduri de octeți Java, dar ele permit Android-ului să ruleze aplicații în VM propriu.
Dalvik VM execută fișiere Dalvik executabile (.dex), un format optimizat care asigură o utilizare minimă a memoriei. Se crează executabile .dex prin transformarea claselor compilate Java(.class și .jar) utilizând tool-urile din SDK[1].
Activități
Activitatea este una dintre cele mai importante componente (alături de servicii și Broadcast Recivers) ale unei aplicații Android deoarece este strâns legată de interfața cu utilizatorul. O activitate este utilizată pentru a gestiona interfața cu utilizatorul și este echivalentă cu fereastra sau formularul din aplicațiile desktop[25].
O aplicație conține de obicei multe activități legate una de alta. Tipic, una dintre ele este desemnată principală și este prezentată utilizatorului când pornește aplicația. Fiecare activitate poate porni o altă activitate. De fiecare dată când o nouă activitate începe, cea dinainte este oprită și ținută de sistem într-o listă "back stack". Când o activitate începe, este pusă în aceeași listă și în vederea utilizatorului. Această listă funcționează după mecanismul "ultimul venit, primul ieșit, așadar când utilizatorul apasă butonul "Back" este scoasă din listă și activitatea precedentă continuă.
JAVA
Java este un limbaj de programare orientat pe obiect. Cele mai multe aplicații distribuite sunt scrise în Java, iar noile evoluții tehnologice permit utilizarea sa și pe dispozitive mobile gen telefon, agendă electronică. In felul acesta se creează o platformă unică, la nivelul programatorului, deasupra unui mediu eterogen extrem de diversificat. Acesta este utilizat în prezent cu succes și pentru programarea aplicațiilor destinate intranet-urilor. Limbajul împrumută o mare parte din sintaxă de la C și C++, dar are un model al obiectelor mai simplu și prezintă mai puține facilități de nivel jos. Un program Java compilat, corect scris, poate fi rulat fără modificări pe orice platformă care e instalată o mașină virtuală Java (Java Virtual Machine, prescurtat JVM). Acest nivel de portabilitate (inexistent pentru limbaje mai vechi cum ar fi C) este posibil deoarece sursele Java sunt compilate într-un format standard numit cod de octeți (byte-code) care este intermediar între codul mașină (dependent de tipul calculatorului) și codul sursă[26].
Mașina virtuală Java este mediul în care se execută programele Java.Limbajul de programare Java este înrudit cu C și C++, dar este organizat destul de diferit, cu un număr de aspecte ale C și C++ omise și câteva idei din alte limbi sunt incluse. Acesta este destinat a fi un limbaj de producție, nu un limbaj de cercetare. Principalele caracteristici ale limbajului de programare Java sunt [2][3]:
simplitatea – elimină moștenirea multiplă, supraîncarcarea operatorilor pentru evitarea scrierii unui cod confuz.
robustețea – elimină sursele de erori ce apar în programare prin eliminarea pointerilor, administrarea automata a memoriei cu ajutorul garbage collection, acesta rulând în fundal
complet orientat pe obiecte – elimină programarea procedurală
securitate – cel mai sigur limbaj de programare
neutru din punct de vedere arhitectural
portabilitate – este un limbaj independent de sistemul de operare
dinamicitate
După modul de execuție al programelor, limbajele se împart în două categorii:
limbaje interpretate – instrucțiunile sunt citite de un interpretor și traduse în instrucțiuni mașină.
limbaje compilate – sursa este transformată de către compilator într-un cod ce poate fi executat direct pe procesor.
Programele scrise în limbajul de programare Java pot fi atât interpretate cât și compilate. Codul de octeți e diferit față de codul mașină. Codul mașină este reprezentat de o înșiruire de 1 și 0; codurile de octeți sunt seturi de instrucțiuni asemănătoare cu codul scris în limbaj de asamblare.
Codul mașină se execută direct pe procesor, putând fi folosit doar pe platforma pe care a fost creat; codul de octeți este interpretat de mediul Java, in consecință acesta poate rula pe orice platforma ce foloseste mediul Java[3].
Ciclul de viață al unui obiect
În orice limbaj de programare orientat pe obiecte, crearea obiectelor se realizează prin instanțierea unei clase, aceasta implicând:
Declararea – înseamnă specificarea tipului unui obiect.
Instanțierea – se realizează cu ajutorul operatorului new, acesta alocă spațiul de memorie corespunzător obiectului.
Inițializarea – se realizează prin intermediul constructorilor clasei respective[3].
Eliminarea obiectelor
Unele limbaje de programare impun ca programatorul să țină evidența obiectelor create și să le distrugă în mod explicit atunci când nu mai este nevoie de ele, cu alte cuvinte să administreze memoria ocupată de obiecte.
În Java, programatorul nu mai este responsabil de distrugerea obiectelor sale pentru că in timpul rulării unui program, simultan cu interpretorul Java, rulează și un proces care se ocupă cu distrugerea obiectelor care nu mai sunt folosite. Acest proces se numește garbage collector.
Obiectele se pot elimina în două moduri:
natural – de exemplu terminarea unei metode in care a fost declarat obiectul
explicit – prin atribuirea obiectului valoarea null[3].
Fire de execuție în Java (Thread)
Aproape fiecare sistem de operare sprijină conceptul de procese – programele rulează independent și sunt izolate unele de altele într-o anumită măsură.
Threading-ul este o facilitate ce permite mai multor activități să coexiste într-un singur proces. Cele mai multe sisteme de operare moderne de suportă fire de execuție. Java este primul limbaj de programare ce include în mod explicit conceptul de fire de execuție.
Ca și procesele, firele de execuție sunt independente, concurente într-un program, fiecare fir de execuție având propria sa stivă, propriu contror de program și propriile variabile locale. Un proces poate avea mai multe fire de execuție, acestea par să a fi executate simultan și asincron. Mai multe fire în cadrul unui proces împart aceeași memorie, spațiu de adrese, ceea ce înseamnă că au acces la aceleași variabile și obiecte.
Fiecare program Java are cel puțin un fir de execuție – firul principal. Când un program Java începe, JVM (Java Virtual Machine) creează firul principal și apelează metoda main() a programului[3].
Serverul HTTP Apache
Serverul HTTP Apache joacă un rol important în dezvoltarea webului, fiind folosit în prezent în circa 65.2 % din paginile web. Popularitatea se datorează suportului său pentru numeroase platforme (Unix, FreeBSD, Linux, Solaris, Novell NetWare, Mac OS X, Microsoft Windows si OS/2), capacității de găzduire virtuală ușor de implementat și modulelor sale care îi extind capabilitățile.
Serverul Apache este caracterizat ca fiind un software gratuit și open source, acesta făcând ca, începând din aprile 1996, el să fie cel mai popular server HTTP[4].
Prima versiune a serverului a fost creată de Robert McCool, care la vremea aceea era implicat în proiectul National Center for Supercomputing Applications, cunoscut pe scurt ca NCSA HTTPd. A doua versiune a serverului a fost o rescriere substanțială, de data aceasta punându-se accentul pe crearea unui layer prioritar (Apache Portable Runtime) și a suportului de module.
Caracteristica Apache Portable Routine(APR) optimizează capabilitățile precum administrarea proceselor pentru fiecare sistem de operare, dar permite serverului propriu-zis să ignore distincțiile specifice fiecărei platforme. Acest lucru a îmbunătățit performanța și stabilitatea implementărilor Windows, prin eliminarea emulatorului. Mai mult APR este accesibil și dezvoltatorilor Web care scriu programe multi-platforme în C, care este mai rapid decât limbajele interpretative, precum PHP și Perl, folosite de obicei pentru dezvoltare Web.
API-ul deschis a permis dezvoltatorilor să scrie diferite module care i-au schimbat comportamentul. Dacă serverului îi lipsește o funcție de care are nevoie un sit, sunt mari șanse ca undeva să fie disponibil un modul plug-in[5].
Serverele Web au ca funcționalitate de bază recepționarea de cereri anonime de la clienți și furnizarea de informații într-o manieră dorită a fi eficientă și rapidă. De fapt un server Web este un daemon care acceptă conexiuni conforme protocolului HTTP, răspunzând cererilor recepționate de la clienți. Pentru a asigura servicii HTTP, serverul Apache trebuie să fie instalat în sistem(în mod uzual, fiind vorba de un pachet RPM în Linux sau de un program executabil .exe în Windows), iar daemon-ul httpd pornit.
Apache este un sistem modular, alcătuit dintr-un server de bază și mai multe module care sunt încărcate dinamic într-un mod similar cu funcționarea modulelor din nucleul Linux.
În anumite cazuri, este necesar să se restricționeze accesul la anumite documente, prin intermediul autentificării prin nume de utilizator și parolă sau în funcție de adresa calculatorului clientului Web.
Pentru autentificarea utilizatorilor, vom parcurge doi pași:
se creează un fișier conținând numele și parolele utilizatorilor care vor avea acces la anumite date de pe serverul Web(în particular Apache)
se configurează serverul pentru a seta care resurse vor fi protejate și care sunt utilizatorii care au permisiunea accesării lor, după introducerea unei parole valide.
Apache poate fi configurat cu ajutorul interfeței grafice apacheconf (Apache Configuration Tool). Fișierul de configurare principal este http-conf și este de obicei localizat în directorul /etc/httpd (în versiunile de Linux sau Unix).
Configurarea serverului se poate realiza fie prin fișierul httpd-conf, fie prin .htacces, indicând o zonă protejată, de obicei în funcție de directoarele dorite a fi accesate pe bază de autentificare. Fișierul .htaccess va fi stocat în directorul asupra căruia dorim să modificăm comportamentul implicit al serverului Web. Înainte de a modifica maniera de autentificare din fișierul .htaccess, administratorul serverului Apache va specifica în httpd.conf ca autentificările să se realizeze via .htaccess.
De asemenea, Apache oferă posibilitatea de a servi mai multe situri Web simultan, altfel spus, găzduirea virtuală (virtual hosting). Există două metode de implementare a găzduirii virtuale: prima bazată pe nume și a doua bazată pe adrese IP. Mașinile virtuale bazate pe adrese utilizează adresa IP a conexiunii pentru a determina mașina virtuală corectă. Astfel pentru fiecare găzduire virtuală bazată pe nume, determinarea mașinii virtuale se face pe baza numelui acestuia.
Găzduirea virtuală bazată pe nume este mai simplu de implementat, și este recomandată utilizarea acesteia. Pentru a utiliza serviciul de găzduire virtuală, trebuie mai întâi stabilite adresa IP-ului și portul pentru serverul care va accepta cereri pentru respectiva mașină virtuală.
JSON
JSON (JavaScript Object Notation) este un standard bazat pe text, ușor de utilizat proiectat pentru a facilita schimbul de date între diferite limbaje de programare. JSON este derivat din limbajul JavaScript pentru a reprezenta structuri de date simple și tablouri asociative, numite obiecte. Formatul JSON este independent de limbaj, fiind existente interpretoare pentru mai multe limbaje de programare.
JSON este adesea folosit pentru serializarea și transmiterea datelor structurate pe o conexiune de rețea. Acesta este utilizat în principal pentru a transmite date între un server și aplicații web, servind ca o alternativă la XML [6].
Tipuri de bază in JSON:
Numeric (format în virgulă mobilă)
Șir de caractere (String)
Boolean (true sau false)
Array (o secvență ordonată de valori, separate prin virgule și paranteze drepte, valorile nu trebuie să fie de același tip)
Obiect (o colecție de cheie neordonate: perechi de valoare cu separatot: ":")
nul (null)
GSON
Gson este o bibliotecă Java care pot fi utilizate pentru a converti obiecte Java în reprezentarea lor JSON. Acesta poate fi de asemenea folosită pentru a converti un șir JSON într-un obiect Java echivalent. Gson poate lucra cu obiecte Java arbitrare, inclusiv obiecte de pre-existente, care nu au sursă de cod[7].
Asynhttp
Este o biblotecă Callback-Based Http Client pentru Android. Pentru implementarea facială a comunicării cu serverul am ales librăria asynhttp, care ajută la implementarea foarte ușoară a aplelurilor către server. Această bibliotecă, bine stabilită și pe scară largă care automatizează și simplifică gestionarea conexiunilor de rețea în thread-uri separate. Biblioteca este distribuită sub licența Apache-v2. Executarea unei cererei HTTP GET pentru a primi textul unei pagini web a unui site, pentru acest lucru am nevoie de a crea o instanță a AsyncHttpClient și de a folosi funcția GET în care se trece doi parametri:[8]
URL: URL-ul paginii web
new AsyncHttpResponseHandler() – este funcția de apel invers.
WebIOPI
Este un cadru REST pe care vă permite să controlați GPIO Raspberry Pi de la un browser. Este scris în Javascript pentru clienți și în Python pentru server. Cu ajutorul biblioteci webiopi.GPIO se poate controla GPIO direct din propriul script în Python. WebIOPI interactionează cu pinii plăcii de dezvoltare. REST – este o modalitate de a crea, citi, acutaliza sau șterge informațiile de pe un server folosind apelurile HTTP simplu. Un apel rest este pur și simplu o cerere HTTP pentru server. Instalarea pe Raspberry Pi este foarte ușoară, deoarece necesită doar Python. Se poate instala folosind un terminal sau o conexiune SSH[9].
Caracterisitici:
Foarte flexibil și ușor de configurat
Dispozitive mobile compatibile
Suport până la 30 de dispozitive, inclusiv DAC, ADC, senzori
Bibliotecă completă Python pentru Server, GPIO și dispozitive de driver Serial
Bibliotecă client Python cu suport HTTP [10]
Web.py (Python Framework)
Python este un limbaj de programare dinamic multi-paradigmă de nivel înalt, creat în 1989 de programatorul olandez Guido van Rossum. Van Rossum este și în ziua de astăzi un lider al comunității de dezvoltatori de software care lucrează la perfecționarea limbajul Python și implementarea de bază a acestuia, CPython, scrisă în C. Python este un limbaj multifuncțional folosit de exemplu de către companii ca Google sau Yahoo! pentru programarea aplicațiilor web, însă există și o serie de aplicații științifice sau de divertisment programate parțial sau în întregime în Python. Popularitatea în creștere, dar și puterea limbajului de programare Python au dus la adoptarea sa ca limbaj principal de dezvoltare de către programatori specializați și chiar și la predarea limbajului în unele medii universitare. Din aceleași motive, multe sisteme bazate pe Unix, inclusiv Linux, BSD și Mac OS X includ din start interpretatorul CPython[21].
Python pune accentul pe curățenia și simplitatea codului, iar sintaxa sa le permite dezvoltatorilor să exprime unele idei programatice într-o manieră mai clară și mai concisă decât în alte limbaje de programare ca C. În ceea ce privește paradigma de programare, Python poate servi ca limbaj pentru software de tipul object-oriented, dar permite și programarea imperativă, funcțională sau procedurală. Sistemul de tipizare este dinamic iar administrarea memoriei decurge automat prin intermediul unui serviciu „gunoier” (garbage collector). Alt avantaj al limbajului este existența unei ample biblioteci standard de metode.
Implementarea de referință a Python este scrisă în C și poartă deci numele de CPython. Această implementare este software liber și este administrată de fundația Python Software Foundation. Python este un limbaj multi-paradigmă, concentrându-se asupra programării imperative, orientate pe obiecte și funcționale, ceea ce permite o flexibilitate mai mare în scrierea aplicațiilor.
Din punctul de vedere al sintaxei, Python are un număr de contrucții și cuvinte cheie cunoscute oricărui programator, dar prezintă și un concept unic: nivelul de indentare are semnificație sintactică. Blocurile de cod sunt delimitate prin simplă indentare.
În C un astfel de blocuri sunt deseori desemnte prin acolade, {<cod>}, dar în Python nu este nevoie de astfel de construcții. Nivelele de indentare îndeplinesc această funcție. Această importanță a indentării este foarte suprinzătoare pentru mulți utilizatori noi ai limbajului Python, chiar dacă sunt programatori cu experiență. Dar o astfel de utilizare a indentării permite codului să fie mai ușor de citit și mai compact. Programatorii cu experiență vor indenta implicit codul sursă, oricare ar fi limbajul, fiindcă astfel se permite structurarea codului sursă și evidențierea funcționalității. Python face din această deprindere folositoare în acest sens o cerință strictă[21].
O impunere similară există și în limbajul de programare Java, care forțează programatorii să delimiteze clasele în fișiere aparte, din motive de organizare și sporire a eficienței de scriere a softului în echipe.
Biblioteci și Extindere
Includerea tuturor acestor structuri, precum și a funcțiilor ce permit manipularea și prelucrarea lor, precum și multe alte biblioteci de funcții sunt prezente datorită conceptului “Batteries Included”, ce poate fi explicat prin faptul că Guido van Rossum și comunitatea ce s-a format în jurul limbajului cred că un limbaj de programare nu prezintă utilitate practică dacă nu are un set de biblioteci importante pentru majoritatea dezvoltatorilor. Din acest motiv Python include bibioteci pentru lucrul cu fișiere, arhive, fișiere XML și un set de biblioteci pentru lucrul cu rețeaua și principalele protocoale de comunicare pe internet (HTTP, Telnet, FTP). Un număr mare de platforme Web sunt construite cu Python. Abilitățile limbajului ca limbaj pentru programarea CGI sunt în afara oricăror dubii. De exemplu YouTube, unul din site-urile cu cea mai amplă cantitate de trafic din lume, este construit pe baza limbajului Python.Totuși, Python permite extinderea funcționalității prin pachete adiționale programate de terți care sunt axate pe o anumită funcționalitate. De pildă, pachetul wxPython conține metodele și structurile necesare creării unei interfețe grafice.
Popularitatea limbajului este în creștere începînd cu anul 2000, datorită faptului că Python permite crearea mai rapidă a aplicațiilor care nu cer viteze înalte de procesare a datelor. De asemenea este util ca limbaj de scriptare, utilizat în cadrul aplicațiilor scrise în alte limbaje. Modulele (bibliotecile) Python pot fi de asemenea scrise în C, compilate și importate în Python pentru a mări viteza de procesare[21].
Raspbian
Raspbian este un sistem de operare gratuit bazat pe Debian optimizat pentru hardware-ul RaspberryPi, folosind LXDE mediul desktop. Acesta este sistemul recomandat actual, și a fost lansat oficial în luna iulie 2012, deși este încă în dezvoltare. Este software-ul gratuit și menținut în mod independent de Fundația Raspberry Pi. Raspbian este o comunitate și a fost creat de o echipă mică, dedicată de dezvoltatori care sunt fani de hardware Un sistem de operare este un set de programe de bază și utilitare. Raspbian oferă peste 35.000 de pachete, software-ul de pre-compilare inclus într-un format ușor de instalat pe RaspberryPi. Raspbian este încă în curs de dezvoltare activ, îmbunătățind stabilitatea și performața și cât mai multe pachete Debian posibil. O imagine Raspbian este un fișier care se descarcă pe un card SD, care la rândul său paote fi folosit pentru a pornit RaspberryPi. Folosind o imagine Raspbian este cel mai simplu mod pentru un utilizator nou pentru a începe cu Raspbian[11].
Motivul orientări spre aceste tehnologi:
Android – reprezintă un nou mod de dezvoltare pentru telefoane mobile, un framework bazat pe noile tehnologii mobile, creat de dezvoltatori pentru dezvoltatori.
Având un SDK simplu și puternic fără taxe de licențiere, documentație excelentă și o comunitate de dezvoltatori în continuă creștere, Android reprezintă o oportunitate excelentă pentru a crea software, care schimbă modul în care oamenii își folosesc telefoanele mobile.
Dintr-o perspectivă comercială, Android are următoarele caracteristici:
Nu este nevoie de nici o certificare pentru ca cineva să devină dezvoltator Android
Asigură platforma Android market pentru distribuția și vânzarea de aplicații
Nu există niciun proces de aplicare pentru distribuția de aplicații
Oferă un control total unui producător de telefoane mobile asupra interfeței
Python – este un limbaj de programare puternic și ușor de învățat. Are structuri de date de nivel înalt, eficiente și o simplă, dar eficientă a abordare a programării orientate pe obiect.
Python permite scrierea unor programe foarte compacte și ușor de citit. Programele scrise în Python sunt mult mai mici decat echivalentele în C sau C++ pentru că:
• tipurile de date de nivel înalt va permit să realizați operații complexe într-o singură instrucțiune;
• gruparea instrucțiunilor este dată de paragrafare în loc de blocuri begin/end sau de acolade; • nu este necesară declararea variabilelor.
Aplicație practică pentru comanda remote a unui sistem BMS.
Descrierea sistemului HomeBMS
Sistemul HomeBMS este bazat pe un mini calculator instalat intr-o clădire sau grup de clăririi care controlează și monotorizează echipamentele unei clădiri (ex. iluminat, sisteme de alimentare precum și sisteme de securitate).
Pentru comandă și gestiune a unei clădiri sau locuințe unde se dorește de la distanță controlul prin diverse dispozitive (telefoane mobile sau tablete ) este nevoie atât de partea de software cât și hardware.
Avantajul practic a sistemului este de a oferi confortul și posibilitatea asupra controlului sistemelor incluse într-o locuință (ex. controlul asupra: monotorizarea locuinței, temperaturii, instalației de iluminat, sistemului audio, etc.)
Acest sistem inteligent fiind dotat cu o aplicație pentru smartphone, orice clădire sau locuință va putea fi controlată cu multă ușurință, iar propietarul doar prin simple atingeri a unui ecran tactil care va acționa diverse comenzi asupra sistemului, raspunsul fiind instant.
Luând în considerare toate aceste aspecte având un control total asupra oricărei locuințe, oferind liniștea de care ficare proprietar are tot dreptul să beneficieze.
Schema bloc generală a sistemului
Legendă arhitectură:
RaspberryPi – Placa de dezvoltare căreia îi sunt atașați senzorii și traductoarele, alături de alte sisteme.
S.I. – Serverul de internet al plăcii de dezvoltare (Apache)
S.E – Serverul de evenimente, înregistrare toate acțiunile care sunt realizate în sistem
S.V –Serverul video, pentru transmiterea în direct a semnalului video
S.T – Senzor temperatuă
S.M – Senzor mișcare
L.G – Led grădină
L.A – Led alarmă
WEBCAM – Camera video (web cam) pentru transmisia semnalului video
HTTP – protocolul de comunicare dintre router, RaspberryPi Pi și dispozitive
Firewall – Securizarea RaspberryPi-ului asupra posibilelor atacuri
Router – Dispozitiv fizic care va asigura conexiunea dintre RaspberryPi Pi și dispozitive adiționale
Arhitectura plăcii de dezvoltare RaspberryPi
Scurtă prezentare a plăcii de dezvoltare RaspberryPi
La începutul anului 2011 un micro calculator prevăzut cu cipuri și conectori I/O cu numele de Raspberry Pi a început să ia amploare prin mass-media atrăgând curiozitatea jurnaliștilor și tuturor persoanelor pasionate de tehnologie din întreaga lume.
Raspberry Pi e mic, un micro calculator dezvoltat de fundația ”The Raspberry Pi Foundation”, o fundație de caritate din Marea Britanie intenționând să ofere calculatoare la un preț redus și programe digitale gratuite studenților. Scopul lor final este promovarea educația informatică, crezând că acest micro calculator le va oferi acest lucru.
Placa de circuit (PCB) găzduiește conectări pentru intrări și ieșiri precum și PC-uri normale fac. În prezent fundația produce plăcile de circuit fără carcasă. Cele două versiuni sunt încă în teste, dar versiunea finală a plăcii este destinată unei ediții educaționale cu, carcasă, documentație și un sistem de operare predefinit.
Din punct de vedere al părții software (virtuale) sunt disponibilei 3 versiuni pentru sistemul de operare, toate aceste versiuni fiind o distribuție specifică de LINUX[20].
Specificații și performanțe
Mărimea plăcii de dezvoltare e de dimensiunea unui card de credit alimentat de Broadcom (BCM2835 – SoC).Acest SoC include un procesor de 32 de biți (ARM1176JZFS), la o frecvență de 700MHz, și un un procesor pentru partea grafică Videocore IV GPU. De asemenea memoria plăcii pentru cele 2 revizii e de 256MB și 512 MB, alimentată la o tensiune continuă de 5V. Consum: 2.5 W (modelul A), 3.5 W (modelul B) [20].
Placa de dezvoltare Raspberry Pi este prevăzută cu următoarele interfețe:
GPIO – General Purpose Input Output – sunt pinii pentru conectarea senzorilor și traductoarelor.
Slot card SD (GNU/Linux) – Suport pentru stocarea și rulare unei distribuții specifice plăcii a sistemului de operare LINUX.
RCA – Prevăzut cu o intrare RCA, conector audio video, cunoscut și sub numele de S-VIDEO
Jack (3.5mm) – Conector Jack (3.5mm) pentru redarea semnalului audio
HDMI – Interfață high-definition
LAN – prevăzut cu o mufă (mamă) pentru conectarea plăcii la rețeaua LAN
USB – Deține 2 porturi USB pentru conectarea diverselor dispozitive de intrare (tastatură, mouse) sau chiar altele precum: web cam-uri, imprimante, hard-uri externe.
Cele mai întâlnite limbaje de programare ale plăcii sunt: C, C++, C#, iar Python fiind cel mai folosit. Pentru realizarea controlului plăcii de dezvoltare și interacționarea cu senzorii și dispozitivele conectate e nevoie de realizarea unui script / cod pentru interacționarea care va avea acces la pinii GPIO ai plăcii de dezvoltarea (Fig. nr.8)
Fiecărui pin al plăcii de dezvoltare îi corespunde un nume și un număr care poate îndeplini anumite funcționalități. În figura nr.9 de mai jos se află reprezentarea pinilor cu numărul lor și funcția care o poate îndeplini.
Legendă:
3.3 VDC Power, 5.0 VDC Power – pini folosiți pentru alimentarea circuitului electronic (senzorilor, traductoarelor și alte componente electronice ale circuitului),
SDA0 (I2C) – pin folosit pentru transmisie de date, permite conexiune dintre alte dispozitive I2C prin cadrul celor două căi: de date (SDA) și una pentru ceas (SCL).
DNC – Pinul pentru pământare, abrevierea vine de la Do Not Connect (nu se va conecta decât pământarea circuitului)
GPIO – pin folosit pentru interacțiunea cu un senzor sau traductor, acest pin poate fi definit ca intrare (input) sau ieșire (output); citind sau realizând scrierea a datelor pe fiecare dintre pin GPIO (General Purpose Input Output).
MOSI–Master Output Slave Input (Pin-ul principal ca ieșire, cel secundar ca intrare).
SCLK – ieșire a pinului principal pentru ceas
Fig. nr.14 – Schema electrică a senzorilor și a led-urilor
Senzoru de mișcare
În prezent senzorii de mișcare sunt utilizați frecvent și pot fi montați de la ușile de la supermarket până la magazinul din benzinării. Senzorii de mișcare fac viața mai ușoară persoanelor care nu pot deschide o ușa de asemenea senzorii de mișcare asigură securitateacasei prin detectarea mișcării și aprinderea luminii de exemplu. Senzorul de mișcare este destinat utilizării în exterior, dar poate fi utilizat și în interior. Un senzor de mișcare electronic sau un detector care conține un senzor de mișcare, transformă mișcare în semnal electronic atunci când este detectată mișcarea. Acest lucru este posibil atunci când în câmpul vizual al senzorului intervine mișcare. Senzorii de mișcare electronici pot fi conectați la sistemele de alarma. Aceste alarme sunt utilizate pentru a alerta proprietarul că în interiorul sau exteriorul casei a fost detectata mișcare. În unele cazuri alarmele pe bază de senzori pot fi setate ca în mod automat să apeleze la o firma de securitate.
Senzorul de mișcare este instalat ca parte a circuitului de iluminat și va aprinde led-ul în momentul în care sesizează în câmpul său o mișcare a unui corp. De asemenea, se va stinge le d-ul după încetarea mișcării în câmp, într-un interval de timp stabilit de utilizator[22].
Senzoru de temperatură
Senzor din Fig.Nr.10 este utilizat pentru măsurarea temperaturii. El funcționează pe baza efectului Seebeck, care conduce la formarea unei diferențe de potențial electric pe baza unei diferențe de potențial termic. Senzorii sunt utili pentru că pot fi integrate în mașini automate și pot măsura o gamă largă de temperaturi, limitarea lor principală reprezentând-o precizia. Materialele care puse împreună manifestă efect Seebeck formează un termocuplu. Într-un fir metalic ale cărui capete se află la temperaturi diferite TA>TB apare o diferență de potențial electric UAB cauzată de faptul că electronii de conducție din capătul cu temperatura mai mare au o energie cinetică mai mare și vor difuza către capătul mai rece. În acest fel capătul cald se va încărca pozitiv, iar capătul rece al firului se va încărca negativ. De remercat că în cazul în care purtătorii mobili de sarcină sunt golurile, sarcini pozitive, atunci capătul cald se încarcă negativ, iar cel rece pozitiv. Din această cauză efectul termoelectric sau efectul Seebeck este folosit pentru determinarea tipului de purtători de sarcină liberi dintr-un semiconductor.
Tensiunea termoelectromotoare (t.t.e.m.) care apare UAB este direct proporțională cu diferența de temperatură dintre capetele firului:
UAB = VA – VB = S·( TA – TB ), unde S este coeficientul Seebeck, o proprietate a materialului din care este făcut firul[23].
Beneficiile aplicației HomeBMS
Comandă a circuitului de iluminat
Comutare pornire/oprire a sistemului de alarmă
Monitorizare video
Afișare temperatură
Vizualizarea evenimentelor realizate de sistem
Funcționarea aplicației HomeBMS se bazează pe îmbinarea mai multor tehnologii precum:
WebIOPI framework (GPIO Python Framework, interacționează cu pinii GPIO ai plăcii de dezvoltare)
Web.py Python Framework (un serviciu REST, care citește, actualiză sau șterge informațiile de pe un server folosind apeluri HTTP)
Apache (serverul de Web)
MJPG-Streamer
Sistemul de operare al plăcii – Linux (ediția Raspbian)
Prin conectarea senzorilor de temperatură, mișcare și dispozitivului de vizualizare (webcam) la placa de dezvoltare vom asigura interacționarea cu mediul în care va fi amplasat sistemul.
Alimentând placa Raspberry Pi va permite dispozitivelor periferice să comunice cu aplicația pentru telefonul mobil, astfel monitorizarea și controlul vor putea fi realizate din
cadrul aplicației.
Conectarea la placa de dezvoltare se va realiza printr-un terminal prin protocolul SSH astfel vom avea următoarea comandă ssh pi@192.168.10.89
pi – numele de utilizator al sistemului de operare Linux (ediția Raspbian)
192.168.10.89 – Adresa IP a Raspberry Pi-ului prin care poate fi accesat.
Modul de utilizare a aplicației HomeBMS
Pentru navigarea ușoară între paginile principale ale aplicației am folosit componenta ViewPager din android care ajută la navigarea dintre paginile principale. Pentru comunicarea între raspberrypi și aplicație avem în dreapta sus opțiunea “Setări” unde se va introduce adresa ip a sistemului.
Interfața grafică a aplicației este una dinamică, totodată fiind intuitivă și ușor de folosit. Aplicația dispune de un meniu format din patru opțiuni, după cum urmează.
Opțiunea „Lumini” din meniul aplicației, permite prin intermediul Switch-ului comutarea ledu-lui Pornit, respectiv Oprit.
Opțiunea „Securitate” din meniul aplicației, permite activarea și dezactivarea alarmei, iar webcam-ul va porni înregistrarea când senzorului de mișcare va sesiza vreo mișcare.
Opțiunea „Temperatura” din meniul aplicației permite afișarea temperaturii.
Opțiunea „Evenimente” din meniul aplicației afișeza toate evenimentele care s-au executat în sistem, având un mic jurnal. Datele sunt stoacate într-un fișier JSON, având structura următoare:
[{
"date": "2014-06-12 01:54",
"id": 1,
"title": "Initializarea Raspbery Pi- ului"
}]
„date”= data când s-a produs evenimentul
„id”=numărul unic al evenimentului
„title”=evenimetul care s-a produs
Concluzii
În lucrare sunt prezentate cele mai importante tehnologi necesare pentru implementarea șistemului și dezvoltarea unei aplicații bazat pe platforma Android. În special capitoul II prezintă pe scurt tehnologiile ce stau la baza proiectării aplicației Android. Acest capitol poste avea atât rolul de a familiariza cititorul cu tehnologiile utilizate și de a fi o sursă rapidă de documentație, prin exemplele prezentate.
Capitolul III prezintă realizarea efectivă a aplicației, pornind de la etapa de proiectare și continuând cu implementarea și utilizarea ei. Sunt descrise principalele avantaje oferite de aplicație și sistem, precum și modul în care acestea pot fi folosite.
Am ales platforma de dezvoltare Android pentru că dispune de o gamă largă de unelte pentru proiectarea implementarea și prezentarea aplicațiilor, fiind un mediu ideal de dezvoltare pentru aplicații complexe și cu cerințe înalte din punct de vedere al performanțelor.
Aplicația poate fi dezvoltată și extinsă în mai multe moduri:
adaptarea interfeței grafice a aplicației pentru alte dispozitive care au sistem de operare Android.
dezvoltarea aplicației pentru notificarea dispozitivelor.
Bibliografie
[1] Ed Burnette, „Hello, Android – Introducing Google’s Mobile Development Platform”, Ed. Pragmatic Programmers, 3rd Edition, 2010.
[2] http://www.java.com/en/download/faq/whatis_java.xml
[3] Java: de la 0 la expert, Ștefan Transă, Ștefan Andrei, Cristian Olaru. – Ed. A II-a rev – Iași: Polirom, 2007
[4] http://ro.wikipedia.org/wiki/Apache_(server)
[5] http://httpd.apache.org/
[6] http://json.org/
[7] https://code.google.com/p/google-gson/
[8] http://loopj.com/android-async-http/
[9] http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/
[10] https://code.google.com/p/webiopi/
[11] http://www.raspbian.org/
[12] http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/
[13] https://lh5.googleusercontent.com/-c-D0BHFnG8E/AAAAAAAAAAI/AAAAAAAAABM/nTgZPiXLkxg/photo.jpg
[13] http://www.clipartbest.com/cliparts/yTk/MdA/yTkMdAjAc.png
[13] http://www.clipartbest.com/cliparts/4i9/Kz5/4i9Kz5GiE.png
[13] http://juvin2012.com/wp-content/uploads/2014/05/www1.jpg
[13] http://www.ademcan.net/img/blog-120301-rpi.jpg
[14]http://martinjonestechnology.files.wordpress.com/2013/04/raspberry-pi-power-architecture1.png
[15]http://www.cnx-software.com/wp-content/uploads/2012/02/Raspberry_Pi_Multimedia_Software_Architecture1.jpg
[16] http://quantum-bits.org/wp-content/uploads/2013/02/raspberry-pi-schem.png
[17] http://upload.wikimedia.org/wikipedia/commons/4/45/Raspberry_Pi_-_Model_A.jpg
[18] http://iqjar.com/jar/wp-content/uploads/2013/01/p1header.png
[19] http://www.dingleberrypi.com/wp-content/uploads/2012/10/cropped-header.png
[20] http://www.extremetech.com/computing/124317-what-is-raspberry-pi-2
[21] http://ro.wikipedia.org/wiki/Python
[22] http://ro.wikipedia.org/wiki/Senzor_de_mi%C8%99care
[23] http://ro.wikipedia.org/wiki/Termocuplu
[24] http://andrei.clubcisco.ro/cursuri/f/f-sym/3so/cursuri/12_SO_Curs_13.pdf
[25] http://developer.android.com/guide/components/activities.html
[26] http://ro.wikipedia.org/wiki/Java_(limbaj_de_programare)#cite_note-10
[27] http://ctrl-d.ro/development/resurse-development/introducere-in-android/
Anexa 1
Implementare în Python (Serviciu REST)
#Biblioteciile
Implementarea în Python:
import web
import json
import webiopi
import time
import sys
import os
from webiopi.devices.sensor.onewiretemp import DS18B20
from webiopi.devices.sensor.vcnl4000 import VCNL4000
import threading
import datetime
import ast
# senzorul de mișcare
vcn = VCNL4000()
#senzorul de temperatură
temperatureSensor = DS18B20()
GPIO = webiopi.GPIO
#setarea folderului root
sys.path.append('/home/pi/piApp')
# log-uri
webiopi.setDebug()
# Mapare clase url
urls = (
'/lights/(.*?)/(0|1)','Lights',
'/lights/(.*?)','Lights',
'/temperature','Temperature',
'/security/(0|1)','Security',
'/security','Security',
'/events/add','Events',
'/events','Events'
)
# ințializarea aplicației care trebuie să aibă doi parametri
app = web.application(urls, globals())
#calea pentru fișierele:
SETTINGS_FILE_STORE_PATH = '/home/pi/piApp/settings.json'
EVENTS_FILE_STORE_PATH = '/home/pi/piApp/events.json'
#Nr pinilor de la rassberyPi a Led-ului lumină și alarmă
LIGHT_LED_PIN_NUMBER = 17
ALARM_LED_PIN_NUMBER = 23
#clasa lumini
class Lights:
#statusu led-ului
def GET(self, ledID):
web.header('Content-Type','application/json')
#returneză valoarea statusului
return json.dumps({"status" : GPIO.digitalRead(int(ledID)) }, ensure_ascii=False).encode('utf8')
#cu PUT comutăm ledu, având doi parametri
def PUT(self, ledID, command):
if ledID == LIGHT_LED_PIN_NUMBER and command == 0:
#adaugă la eveniment
addEvent("S-a oprit instalatia de iluminat")
elif ledID == LIGHT_LED_PIN_NUMBER and command == 1:
addEvent("S-a pornit instalatia de iluminat")
if ledID == LIGHT_LED_PIN_NUMBER or ALARM_LED_PIN_NUMBER:
#la pinu respectiv setează o sau 1
GPIO.setFunction(int(ledID), int(command))
class Temperature:
# citește și returnează valoarea senzorului de temperatură
def GET(self):
web.header('Content-Type','application/json')
return json.dumps({"temperature": float(temperatureSensor.getCelsius())}, ensure_ascii=False).encode('utf8')
class Events:
#Afișează evenimentele sistemului
def GET(self):
web.header('Content-Type','application/json')
jsonFile = open(EVENTS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return json.dumps(jsonData, ensure_ascii=False).encode('utf8')
#o funcție globală care returnează evenimentele
def retrieveEventsFromStore():
jsonFile = open(EVENTS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return jsonData
#scrie evenimentele într-un fisier jason
def writeEventsToStore(pythonJson):
with open(EVENTS_FILE_STORE_PATH, 'w') as jsonFile:
jsonFile.write(json.dumps(pythonJson))
#adăugare eveniment în jurnal
def addEvent(eventTitle):
events = retrieveEventsFromStore()
eventID = 0
if len(events) > 0:
for e in events:
if events[-1] == e:
eventID = e['id']
newEventID = int(eventID) + 1
#evenimentu care va fi adăugat are structura
eventToBeAdded = json.dumps({"date": datetime.datetime.now().strftime("%Y-%m-%d %H:%M"), "id": int(newEventID), "title": eventTitle})
currentEvents = events
#adaugă la coadă evenimentul
currentEvents.append(ast.literal_eval(eventToBeAdded))
#îl scrie pe disc
writeEventsToStore(currentEvents)
class Security:
#verifică statusul alarmei din settings
def GET(self):
web.header('Content-Type','application/json')
jsonFile = open(SETTINGS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return json.dumps(jsonData, ensure_ascii=False).encode('utf8')
#activează și dezactivează alarma
def PUT(self, command):
if int(command) == 1:
#alarmă activată
jsonDataToWrite = json.dumps({"alarmON": True })
with open(SETTINGS_FILE_STORE_PATH, 'w') as jsonFile:
jsonFile.write(jsonDataToWrite)
jsonFile.close()
addEvent("S-a pornit sistemul de alarma")
#alarmă dezactivată
elif int(command) == 0:
jsonDataToWrite = json.dumps({"alarmON": False })
with open(SETTINGS_FILE_STORE_PATH, 'w') as jsonFile:
jsonFile.write(jsonDataToWrite)
jsonFile.close()
addEvent("S-a oprit sistemul de alarma")
#sesizare mișcare
def isMotionDetected():
if vcn.getMillimeter() > 0:
return True
else:
return False
#citește valoarea din settings
def isAlarmON():
jsonFile = open(SETTINGS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return json.dumps(jsonData, ensure_ascii=False).encode('utf8')
# reapelare la un interval de 5 sec. pt reactualizare status
def shouldFireUpAlarm():
threading.Timer(5.0, shouldFireUpAlarm).start()
if isAlarmON() and isMotionDetected():
addEvent("Sistemul de alarma s-a pornit")
GPIO.setFunction(ALARM_LED_PIN_NUMBER, GPIO.OUT)
os.system("aplay alarm_sound.wav")
GPIO.setFunction(ALARM_LED_PIN_NUMBER, GPIO.IN)
time.sleep(0.1)
# prima apelare a funcției
shouldFireUpAlarm()
addEvent("Initializarea Raspbery Pi-ului")
#rulare aplicație
if __name__ == "__main__":
app.run()
}
Bibliografie
[1] Ed Burnette, „Hello, Android – Introducing Google’s Mobile Development Platform”, Ed. Pragmatic Programmers, 3rd Edition, 2010.
[2] http://www.java.com/en/download/faq/whatis_java.xml
[3] Java: de la 0 la expert, Ștefan Transă, Ștefan Andrei, Cristian Olaru. – Ed. A II-a rev – Iași: Polirom, 2007
[4] http://ro.wikipedia.org/wiki/Apache_(server)
[5] http://httpd.apache.org/
[6] http://json.org/
[7] https://code.google.com/p/google-gson/
[8] http://loopj.com/android-async-http/
[9] http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/
[10] https://code.google.com/p/webiopi/
[11] http://www.raspbian.org/
[12] http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/
[13] https://lh5.googleusercontent.com/-c-D0BHFnG8E/AAAAAAAAAAI/AAAAAAAAABM/nTgZPiXLkxg/photo.jpg
[13] http://www.clipartbest.com/cliparts/yTk/MdA/yTkMdAjAc.png
[13] http://www.clipartbest.com/cliparts/4i9/Kz5/4i9Kz5GiE.png
[13] http://juvin2012.com/wp-content/uploads/2014/05/www1.jpg
[13] http://www.ademcan.net/img/blog-120301-rpi.jpg
[14]http://martinjonestechnology.files.wordpress.com/2013/04/raspberry-pi-power-architecture1.png
[15]http://www.cnx-software.com/wp-content/uploads/2012/02/Raspberry_Pi_Multimedia_Software_Architecture1.jpg
[16] http://quantum-bits.org/wp-content/uploads/2013/02/raspberry-pi-schem.png
[17] http://upload.wikimedia.org/wikipedia/commons/4/45/Raspberry_Pi_-_Model_A.jpg
[18] http://iqjar.com/jar/wp-content/uploads/2013/01/p1header.png
[19] http://www.dingleberrypi.com/wp-content/uploads/2012/10/cropped-header.png
[20] http://www.extremetech.com/computing/124317-what-is-raspberry-pi-2
[21] http://ro.wikipedia.org/wiki/Python
[22] http://ro.wikipedia.org/wiki/Senzor_de_mi%C8%99care
[23] http://ro.wikipedia.org/wiki/Termocuplu
[24] http://andrei.clubcisco.ro/cursuri/f/f-sym/3so/cursuri/12_SO_Curs_13.pdf
[25] http://developer.android.com/guide/components/activities.html
[26] http://ro.wikipedia.org/wiki/Java_(limbaj_de_programare)#cite_note-10
[27] http://ctrl-d.ro/development/resurse-development/introducere-in-android/
Anexa 1
Implementare în Python (Serviciu REST)
#Biblioteciile
Implementarea în Python:
import web
import json
import webiopi
import time
import sys
import os
from webiopi.devices.sensor.onewiretemp import DS18B20
from webiopi.devices.sensor.vcnl4000 import VCNL4000
import threading
import datetime
import ast
# senzorul de mișcare
vcn = VCNL4000()
#senzorul de temperatură
temperatureSensor = DS18B20()
GPIO = webiopi.GPIO
#setarea folderului root
sys.path.append('/home/pi/piApp')
# log-uri
webiopi.setDebug()
# Mapare clase url
urls = (
'/lights/(.*?)/(0|1)','Lights',
'/lights/(.*?)','Lights',
'/temperature','Temperature',
'/security/(0|1)','Security',
'/security','Security',
'/events/add','Events',
'/events','Events'
)
# ințializarea aplicației care trebuie să aibă doi parametri
app = web.application(urls, globals())
#calea pentru fișierele:
SETTINGS_FILE_STORE_PATH = '/home/pi/piApp/settings.json'
EVENTS_FILE_STORE_PATH = '/home/pi/piApp/events.json'
#Nr pinilor de la rassberyPi a Led-ului lumină și alarmă
LIGHT_LED_PIN_NUMBER = 17
ALARM_LED_PIN_NUMBER = 23
#clasa lumini
class Lights:
#statusu led-ului
def GET(self, ledID):
web.header('Content-Type','application/json')
#returneză valoarea statusului
return json.dumps({"status" : GPIO.digitalRead(int(ledID)) }, ensure_ascii=False).encode('utf8')
#cu PUT comutăm ledu, având doi parametri
def PUT(self, ledID, command):
if ledID == LIGHT_LED_PIN_NUMBER and command == 0:
#adaugă la eveniment
addEvent("S-a oprit instalatia de iluminat")
elif ledID == LIGHT_LED_PIN_NUMBER and command == 1:
addEvent("S-a pornit instalatia de iluminat")
if ledID == LIGHT_LED_PIN_NUMBER or ALARM_LED_PIN_NUMBER:
#la pinu respectiv setează o sau 1
GPIO.setFunction(int(ledID), int(command))
class Temperature:
# citește și returnează valoarea senzorului de temperatură
def GET(self):
web.header('Content-Type','application/json')
return json.dumps({"temperature": float(temperatureSensor.getCelsius())}, ensure_ascii=False).encode('utf8')
class Events:
#Afișează evenimentele sistemului
def GET(self):
web.header('Content-Type','application/json')
jsonFile = open(EVENTS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return json.dumps(jsonData, ensure_ascii=False).encode('utf8')
#o funcție globală care returnează evenimentele
def retrieveEventsFromStore():
jsonFile = open(EVENTS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return jsonData
#scrie evenimentele într-un fisier jason
def writeEventsToStore(pythonJson):
with open(EVENTS_FILE_STORE_PATH, 'w') as jsonFile:
jsonFile.write(json.dumps(pythonJson))
#adăugare eveniment în jurnal
def addEvent(eventTitle):
events = retrieveEventsFromStore()
eventID = 0
if len(events) > 0:
for e in events:
if events[-1] == e:
eventID = e['id']
newEventID = int(eventID) + 1
#evenimentu care va fi adăugat are structura
eventToBeAdded = json.dumps({"date": datetime.datetime.now().strftime("%Y-%m-%d %H:%M"), "id": int(newEventID), "title": eventTitle})
currentEvents = events
#adaugă la coadă evenimentul
currentEvents.append(ast.literal_eval(eventToBeAdded))
#îl scrie pe disc
writeEventsToStore(currentEvents)
class Security:
#verifică statusul alarmei din settings
def GET(self):
web.header('Content-Type','application/json')
jsonFile = open(SETTINGS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return json.dumps(jsonData, ensure_ascii=False).encode('utf8')
#activează și dezactivează alarma
def PUT(self, command):
if int(command) == 1:
#alarmă activată
jsonDataToWrite = json.dumps({"alarmON": True })
with open(SETTINGS_FILE_STORE_PATH, 'w') as jsonFile:
jsonFile.write(jsonDataToWrite)
jsonFile.close()
addEvent("S-a pornit sistemul de alarma")
#alarmă dezactivată
elif int(command) == 0:
jsonDataToWrite = json.dumps({"alarmON": False })
with open(SETTINGS_FILE_STORE_PATH, 'w') as jsonFile:
jsonFile.write(jsonDataToWrite)
jsonFile.close()
addEvent("S-a oprit sistemul de alarma")
#sesizare mișcare
def isMotionDetected():
if vcn.getMillimeter() > 0:
return True
else:
return False
#citește valoarea din settings
def isAlarmON():
jsonFile = open(SETTINGS_FILE_STORE_PATH, 'r')
jsonData = json.load(jsonFile)
jsonFile.close()
return json.dumps(jsonData, ensure_ascii=False).encode('utf8')
# reapelare la un interval de 5 sec. pt reactualizare status
def shouldFireUpAlarm():
threading.Timer(5.0, shouldFireUpAlarm).start()
if isAlarmON() and isMotionDetected():
addEvent("Sistemul de alarma s-a pornit")
GPIO.setFunction(ALARM_LED_PIN_NUMBER, GPIO.OUT)
os.system("aplay alarm_sound.wav")
GPIO.setFunction(ALARM_LED_PIN_NUMBER, GPIO.IN)
time.sleep(0.1)
# prima apelare a funcției
shouldFireUpAlarm()
addEvent("Initializarea Raspbery Pi-ului")
#rulare aplicație
if __name__ == "__main__":
app.run()
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicatie Practica Pentru Comanda Remote a Unui Building Management System (ID: 136542)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
