Aplicatie Practica Pentru Comanda Remote a Unui Sistem Building Management System

Cuprins

CAPITOLUL I. Introducere

CAPITOLUL II. Tehnologiile utilizate

II.1 Platforma 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 Placa de dezvoltare RaspberryPi

III.3 Programarea dispozitivului RaspberryPi

III.4 Elemente hardware utilizate în cadrul sistemului HomeBMS

III.5 Funcționalitățile sistemului HomeBMS

III.6 Implementarea și modul de utilizare a sistemului HomeBMS

CAPITOLUL IV. Concluzii

Bibliografie

Anexa 1

Introducere

Internetul, această rețea mondială de rețele de calculatoare, provoacă modelele de funcționare a societății actuale, comerțul (commerce) devenind „e-commerce”, învățarea (learning), devenind e-Learning, chiar și guvernul communică cu cetățenii prin e-Government. Lansat în anul 1964 în cadrul proiectului ARPANET de către agenția americană ARPA (Advanced Research Procject Agency), Internetul cunoaște azi aproape 3 miliarde de utilizatori. Mai mult decât numărul de utilizatori, în 2012 Internetul connecta 8.7 miliarde de dispozitive. Aceaste dispozitive reprezintă nu doar calculatoare personale, ci o largă gamă de systeme capabile să schimbe informații prin Internet, dând naștere la ceea ce numim azi „Internet of Things”.

Figura 1. Previziune privind numărul de dispozitive și utilizatori connectați la Internet (sursa : http://www.cisco.com/web/about/ac79/docs/innov/IoT_IBSG_0411FINAL.pdf)

Dispozitivele ce se conectează la Internet pot fi de o varietate largă, pornind de la dispozitive ce permit achiziționarea datelor într-un sistem (e.g. senzori de temperatură), la dispozitive de acționare (e.g. motoare, relee) și unități de prelucrare, decizie și commandă (e.g. calculatoare, procesoare, softuri). Un domeniu particular de utilizare a acestui ansamblu de dispozitive pentru automatizarea proceselor (e.g. menținerea unei temperaturi constante) în locuințe îl reprezintă domotica. În lucrarea de față ne vom concentra atenția către un sistem ce permite monitorizarea unei locuințe de la distanță, având următoarele beneficii:

sistem de alarmă (cu înregistrare video)

afișează temperatura

jurnal despre evenimente în (logs)

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, 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 prezint un sistem și 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 ce î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.

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ță.

Obiectul principal al prezentei lucrări este realizarea unui sistem inteligent care permite monitorizarea unei locuințe de la distanță și controlul unor funcții definite în prealabil pentru sistem, prin intermediul unui telefon portabil inteligent. Pentru a realiza obiectivul propus, în cadrul acestei lucrări propun sistemul HomeBMS (Building Management System).

Sistemul HomeBMS prezintă doi senzori pentru partea de achiziție a semnalelor (senzor de temperatură și senzor de mișacare) și un dispozitiv care poate fi acționat de la distanță (pentru exemplul de față am utilizat un LED). Interpretarea datelor achiziționate, precum și acționarea dispozitivului de la distanță se realizează utilizând o aplicație dezvoltată pentru telefoanele portabile folosind sistemul de operare Android.

În continuare prezint dezvoltarea sistemului HomeBMS, precum și a aplicației 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 telefonulsenzorilor,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:

Figura 4. Arhitectura sistemului Android [24]

Un nucleu Linux și o colecție 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ă 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ă

Figura 5. Librăriile de bază din sistemul Android [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]

Figura 6. 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 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 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 optimizat pentru setul de instrucțiuni al arhitecturii ARMv6, pe care se bazează microcalculatorul RaspberryPi. Acesta derivă din sistemul de operare Debian 7 “Wheezy”. Numele “Raspian” reprezintă un joc de cuvinte dintre Raspberry și Debian. Acest system de operare oferă 35000 de pachete software precompilate și ușor de instalat, optimizate pentru a rula pe hardware-ul ARM11 al RaspberryPi. Pachetul de bază Raspbian conține un mediu de lucru LXDE, managerul de ferestre Openbox, browser-ul web Midori, instrumente de dezvoltare software (IDLE, Scratch, etc.) și exemple de coduri sursă pentru funcții multimedia. Sistemul de operare Raspbian este un system de tim”hard-float”, adică acesta operează în virgulă mobilă prin emulare hardware. Astfel, nu se oferă suport pentru folosirea blocului de procesare vectorială în virgulă mobilă. 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. 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 porni RaspberryPi[11].

Sistemul de fișiere este standard pentru un sistem derivat din Linux. Acesta este de tip

ierarhic, împărțit în directoare, dintre care reamintim printre cele mai importante:

• /bin – în care se instalează programele de utilizator

• /boot – în care se află fișierele necesare la pornire

• /dev – conŃine fișiere speciale care reprezintă dispozitivele sistemului

• /etc – aici se regăsesc fișierele de configurare a sistemului

• /etc/init.d – conŃine scripturile pentru pornirea serviciilor

• /home – directorul utilizatorului

• /home/pi – directorul utilizatorului pi (root)

• /lib – driverele și modulele kernel

• /proc – un director virtual care conŃine informaŃii legate de procesele care rulează și

de sistemul de operare

• /sys – un director special pentru Raspberry Pi care conŃine driverele pentru

dispozitivele hardware

• /usr – conŃine programe și date utilizabile de către toŃi utilizatorii

• /usr/src – sursele sistemului Linux

• /var – fișiere pentru procesare (similar unui buffer) și loguri de sistem

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 RaspberryPi 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 HomeBMS

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, înregistrarează 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

Placa de dezvoltare RaspberryPi

Apariția microcalculatorului RaspberryPi în anul 2012 a adus domeniul încorporat la un nou nivel. Acesta oferă un mediu facil pentru învățarea programării și dezvoltarea de proiecte hardware la un preț redus. Dimensiunile acestuia sunt comparative cu cele ale unui card bancar (85.60 mm x 53.98 mm) și a fost creat de către fundația ”The Raspberry Pi Foundation”, cu intenția de a promova învățarea programării în școli. Succesul compercial a acestuia a venit pe fondul unui preț redus de vânzare raportat la performanțele oferite comparativ cu alte modele existente pe piață (pcDuino de la LinkSprite, APC de la VIA, Cubieboard de la CubieTech, etc.).

RaspberryPi este compus dintru SoC fabricat de Broadcom, model BCM2823, care include un procesor de timp ARM1176JZF-S, funcționând la 700 Mhz (printr-o setare din firmware, acesta este capabil să funcționeze la 1GHz), un GPU VideoCore IV și 512 MB de memorie RAM. Acesta nu conține un hard disk sau o unitate SSD, folosind în schimb un card de memorie flash SD pentru boot-are și stocare pe termen lung. În prezent există pe piață două module: modulul A, care conține un singur port de USB și nu are conectivitate Ethernet și modelul B, care vine dotat cu două porturi USB și conectivitate Ethernet. Modelul A este conceput pentru dezvoltarea aplicațiilor cu limitare de curent electric (quadcopter, robot, etc.) care nu necesită comunicare prin Ethernet, alimentată la o tensiune continuă de 5V. Consum: 2.5 W (modelul A), 3.5 W (modelul B).

Arhitectura sistemului RaspberryPi

Figura 11 reprezintă o trecere în revistă a conexiunilor interne din RaspberryPi modelul B. Această prezintă diagrama bloc a microcalculatorului. Blocul I/O include interfața GPIO, interfața DSI pentru conectarea unui monitor extern cu interfață compatibilă (pentru care încă nu au fost dezvoltate driver-e compatibile), interfața CSI pentru conectarea unei camere de filmat/fotografiat și interfețele S-Video și HDMI pentru conectarea unor dispozitive de afișare externe (figura 12).

GPIO (General Purpose Input/Output) este un pin de pe un cip a cărui comportament (de intrare sau de ieșire) poate fi controlat prin programare de către utilizator la rulare. Acest pin nu are un scop special definit și de obicei este nefolosit. Ideea din spatele GPIO este de a da posibilitatea unui designer de sisteme integrate de a crea circuite digitatle folosind o serie de astfel de pini și câteva linii de control disponibile pe cip în determinentul creării de circuite digitale dedicate adiționale. Pini GPIO sunt folosite în cipuri ( circuite integrate, SoC, FPGA, etc.), cipuri multifuncționale (codec-uri audio, manageri de putere, cartele video, etc.), sisteme pentru aplicații integrate (RaspberryPi, Arduino, etc.) în care sunt folosiți pentru a citi valori de la senzori de mediu (infraroșu, temepratură, orientare, accelerare, etc.), pentru a controla motoare în curent continuu, ecrane LCD sau LED-uri, etc.

Interfețele microcalculatorului RaspberryPi

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.

Programarea dispozitivului RaspberryPi

Având în vedere multitudinea de informații colectate de un astfel de sistem pentru a putea fi gestionate corespunzător, se creează algoritmi în diverse limbaje de programare care vor îndeplini funcțiile prestabilite pentru sistemului.

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 (Fig. nr.15) ai plăcii de dezvoltarea.

Programarea RaspberryPi-ului pentru a lucra cu device-urile ce pot fi conectate: (senzori, motoare, led-uri, etc) de preferabil se poate realizează în Python deoarece sunt numeroase librării și o gamă largă de dispozitive și componenente ce pot fi conectate. Pentru a îndeplini funcțiile propuse ale sistemului HomeBMS am realizat un scrip în Python (Anexa1). 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.14 se află reprezentarea pinilor cu numărul lor și funcția care o poate îndeplini.

Toți pinii GPIO pot fi reconfigurați pentru a asigura funcții alternative, SPI, PWM, I²C și altele. Doar pinii GPIO 14 și 15 pot fi asignați pentru funcția alternativă de UART, având posibilitatea de a-i reasigna către funcția GPIO pentru a asigura un număr de 17 pini GPIO. Fiecare funcție este detaliată în fișa tehnică a cipului BCM2835. Ficare pin GPIO este capabil de schimbări ale semnalului în nivelul maxim/minim și de executarea întreruperilor. Histerezisul pe intrare al pinilor GPIO poate fi de tip pornit/oprit, rata de cădere poate fi rapidă sau limitată iar curentul de sursă și cel absorbit fie configurat de la 2mA până la 16mA. Aceste proprietăți se aplică tuturor celor 26 de pini ai blocului P1.

Pe plăcuța RaspberryPi există 26 de pini grupați în același bloc numit P1. Dintre aceștia, 8 sunt pini GPIO, restul fiind folosiți pentru alte protocoale de comunicații (I²C, SPI, UART) și pentru alimentare la 3.3V, 5V și respectiv masa circuitului GND (0V). Nivelul de tensiune disponibil pe pinii GPIO este de 3.3V, aceștia fiind intoleranți la 5V.

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

Elemente hardware utilizate în cadrul sistemului HomeBMS

RaspberryPi este partea fizică a sistemului HomeBMS, iar softwar-ul este partea logică care comandă RaspberryPi-ul prin intermediul unor programe (aplicații, sisteme de operare, divere). RaspberryPi este ansamblu elementelor fizice și tehnice cu ajutorul cărora datele se pot culege, verifica, prelucra, memora, transmite afișa și stocate. Placa de dezvoltare este componenta principală în interiorul carcasei. Este o plcacă de mărimea unui card bancar de forma dreptunghiulară, având circuite integrate care leagă celelate părți ale minicalculatorului: microporcesor, memeorie RAM, Sdcard, precum și dispozitivele periferice conectate prin porturi sau sloturi de extindere.

Sistemul HomeBMS prezintă doi senzori pentru partea de achiziție a semnalelor (senzor de temperatură și senzor de mișacare) și un dispozitiv care poate fi acționat de la distanță (pentru exemplul de față am utilizat un LED).

Figura 16. Schema electrică a senzorilor și a LED-urilor

Senzorul de proximitate BV4241

Î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ă securitatea casei 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. Senzorul de mișcare electronic este conectat la sistemul de alarmă. Acestă alarmă este utilizată pentru a alerta proprietarul că în interiorul sau exteriorul casei a fost detectată 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 led-ul după încetarea mișcării în câmp, într-un interval de timp stabilit de utilizator.

Funcționalități

Deține un senzor infra-roșu

Acuratețe de 16 biți

Curentul de operare între 10mA și 200mA

Potrivit pentru întreruperea iluminatului înconjurător

Distanța de operare până Specificații în 200mm

Tensiunea de funcționare 3.3 V – 5 V

Interfața I2C de la 1.7V la 5V

Dimensiuni: 26 x 16 mm

Senzorul de temperatură rezistent la apă DS18B20

Senzorul de temperatură digital DS18B20 oferă măsurători de la 9-biți până la 12-biți în Celsius și deține o funcție de alarmă cu partea superioară non volatilă și cea inferioară cu puncte de declanșare.

DS18B20 comunică printr-un fir, prin definiție necesită doar o singură linie de date (și pământare) pentru comunicarea cu microprocesorul central. Intervalul de funcționare se află între -55°C și +125°C și are o acuratețe de ±0.5°C pe o scară de -10°C până la +85°C.

Adițional, DS18B20 se poate alimenta de la linia de date fiind ca și ”parazit” eliminând nevoia unei surse de alimentare externe.

Fiecare DS18B20 are un cod unic de 64 de biți, care permite conectarea mai multor senzori DS18B20 pe un singur fir. Prin faptul acesta folosind un singur microprocesor pentru a controla o largă arie de senzori DS18B20. Aplicațiile pot beneficia de această facilitate incluzând controale HVAC pentru monitorizarea temperaturii în interiorul clădirilor sau mașinilor, și procesul de monitorizare și control al sistemelor.

Specificații

Necesită un singur fir pentru conectare

Pentru comunicare folosește Pin Port Pin

Deține un cod serial de 64 de biți unic

Stocat într-o placă încorporată ROM

Posibilitatea utilizări într-un număr mare

Folosirea în cadrul aplicațiilor pentru sesizarea temperaturii

Nu necesită alte componente

Se poate alimenta de la linia de date; sursa de tensiune

Tensiunea de operare este între 3.0V și 5.5V

Măsoară temperaturi între -55°C și +125°C (-67°F și +257°F)

Acuratețe de ±0.5°C între -10°C și +85°C

De la 9 la 12 biți

Convertește temperatura într-un cuvânt digital de 12 biți

Timpul de răspuns 750ms

Funcționalitățile sistemului HomeBMS

Unul din avantajele utilizării acestui sistem îl constituie afișarea în timpul real a parametrilor ce caracterizează funcționarea întregii HomeBMS. Acest sistem reduce timpul efectiv de supraveghere în cazul în care suprafața construită a casei este foarte mare, sau fiind o clădire alcătuită din mai multe etaje.

Comandă a circuitului de iluminat

Comutare pornire/oprire a sistemului de alarmă

Monitorizare și înregistrare 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 (Secure Shell), 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.

Implementarea și modul de utilizare a sistemului 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 LED-ului Pornit, respectiv Oprit.

În pagina “LUMINI” avem un buton on/off pentru corpul de iluminat care poate fi acționat de la distanță (pentru exemplul de față am utilizat un LED). Pentru a obține statusul LED-ului se va apela GET la serviciu REST, unde vom avea pentru true să fie PORNIT, iar pentru false vom avea OPRIT.

Request type: GET – http://[RaspberryPi-IP]/lights/[INT]

return {”status”: true } / {”status”: false }

Pentru pornirea LED-ului vom aveam:

Request type: PUT – http://[RaspberryPI-IP]/lights/[LED-ID]/1

return:

200 OK

orice alt răspuns va fi o eroare pe server / API; se va afișa un mesaj de alertă care să încerce din nou

Pentru oprirea LED-ului vom aveam:

Request type: PUT – http://[RaspberryPi-IP]/lights/[LED-ID]/0

return:

200 OK

orice alt răspuns va fi o eroare pe server / API; se va afișa un mesaj de alertă care să încerce din nou

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.

În pagina “SECURITATE” avem un buton on/off pentru alarmă ce poate fi activată la plecare, sau dezactivată la sosire având și un webview cu stream-ul de la webcam pentru înregistrare video atunci când senzorul sezisează vreo mișcare.

Pentru status alarmă:

Request type: GET – http://[RaspberryPi-IP]/security/

return: { "alarmON": true }

orice alt răspuns va fi o eroare pe server / API; se va afișa un mesaj de alertă care să încerce din nou

Pentru pornire alarmă:

Request type: PUT – http://[RaspberryPi-IP]/security/1

return:

200 OK

orice alt răspuns va fi o eroare pe server / API; se poate afișa un mesaj de alertă care să încerce din nou

Pentru oprire alarmă:

Request type: PUT – http://[RaspberryPi-IP]/security/0

return:

200 OK

orice alt răspuns va fi o eroare pe server / API; se poate afișa un mesaj de alertă care să încerce din nou

Webcam stream [web view]

URL-ul sursă:  http://192.168.10.89:8080

Opțiunea „Temperatura” din meniul aplicației permite afișarea temperaturii.

Request type:

GET- http://[RaspberryPi-IP]/temperature

return {”temperature”: float }

ex: return {”temperature”: 20.5 }

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

În meniul aplicației HomeBMS în dreapta sus avem un buton numit “Setări” acolo se va scrie adresa raspberry Pi-ului, iar apoi se va da “Save”. Pe baza url-ului introdus la “Setări” se va construii toate request-urile.

Concluzii

În această lucrare prezint sistemul HomeBMS, propus pentru monitorizarea unei locuințe și acționarea unui dispozitiv de la distanță. Monitorizarea și controlul sunt accesibile prin intermediul unei aplicații Android.

În capitoul II prezentăm pe scurt tehnologiile care stau la baza proiectării unei aplicații Android. Acest capitol poate 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 descrie realizarea efectivă a aplicației, pornind de la etapa de proiectare și continuând cu etapele de implementare și utilizare. 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.

Sistemul poate fi dezvoltat și extinsă în mai multe direcții:

adaptarea interfeței grafice a aplicației pentru alte dispozitive care au sistem de operare Android;

dezvoltarea aplicației pentru notificarea dispozitivelor;

integrarea de senzori și motoare ce pot fi acționate de la distanță (acționarea porților și încuietorilor);

automatizarea deciziilor sistemului (e.g. deschiderea porților garajului la apropierea autovehiculului).

Sistemul HomeBMS se înscrie în cadrul aplicațiilor ce utilizează conceptul de „Internet of Things”, mai exact din familia aplicațiilor de tip domotic. Aceste aplicații permit automatizarea funcțiilor ce țin de locuință, urmărind creșterea securității (sisteme de alarmă), eficientizarea resurselor (sisteme de control a încălzirii locuinței) și în final confortul utilizatorului.

Bibliografie

[1] Ed Burnette, „Hello, Android – Introducing Google’s Mobile Development Platform”, Ed. Pragmatic Programmers, 3rd Edition, 2010 Consultat la: 20.05.2014

[2] http://www.java.com/en/download/faq/whatis_java.xml Consultat la: 01.06.2014

[3] Java: de la 0 la expert, Ștefan Transă, Ștefan Andrei, Cristian Olaru. – Ed. A II-a rev – Iași: Polirom, 2007 Consultat la: 05.06.2014

[4] http://ro.wikipedia.org/wiki/Apache_(server) Consultat la: 30.05.2014

[5] http://httpd.apache.org/ Consultat la: 30.05.2014

[6] http://json.org/ Consultat la: 12.06.2014

[7] https://code.google.com/p/google-gson/ Consultat la: 11.06.2014

[8] http://loopj.com/android-async-http/ Consultat la: 10.05.2014

[9]http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/ Consultat la: 02.05.2014

[10] https://code.google.com/p/webiopi/ Consultat la: 10.05.2014

[11] http://www.raspbian.org/ Consultat la: 12.06.2014

[12]http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/ Consultat la: 08.06.2014

[13]https://lh5.googleusercontent.com/-c-D0BHFnG8E/AAAAAAAAAAI/AAAAAAAAABM/nTgZPiXLkxg/photo.jpg Consultat la: 17.06.2014

[13]http://www.clipartbest.com/cliparts/yTk/MdA/yTkMdAjAc.png Consultat la: 19.06.2014

[13] http://www.clipartbest.com/cliparts/4i9/Kz5/4i9Kz5GiE.png Consultat la: 19.06.2014

[13] http://juvin2012.com/wp-content/uploads/2014/05/www1.jpg Consultat la: 19.06.2014

[13] http://www.ademcan.net/img/blog-120301-rpi.jpg Consultat la: 19.06.2014

[14] http://5af5e3de5795a966dd90-e9792bbf34570cde028937f7b1897875.r53.cf3.rackcdn.com/uploads/images/pi_model_a&b.jpg Consultat la: 28.05.2014

[15]http://www.cnx-software.com/wp- content/uploads/2012/02/Raspberry_Pi_Multimedia_Software_Architecture1.jpg Consultat la: 01.06.2014

[16]http://quantum-bits.org/wp-content/uploads/2013/02/raspberry-pi-schem.png Consultat la: 01.06.2014

[17]http://upload.wikimedia.org/wikipedia/commons/4/45/Raspberry_Pi_-_Model_A.jpg Consultat la: 01.06.2014

[18] http://iqjar.com/jar/wp-content/uploads/2013/01/p1header.png Consultat la: 04.06.2014

[19]http://www.dingleberrypi.com/wp-content/uploads/2012/10/cropped-header.png Consultat la: 30.05.2014

[20]http://www.extremetech.com/computing/124317-what-is-raspberry-pi-2 Consultat la: 05.05.2014

[21] http://ro.wikipedia.org/wiki/Python Consultat la: 07.05.2014

[22] http://ro.wikipedia.org/wiki/Senzor_de_mi%C8%99care Consultat la: 10.05.2014

[23] http://www.maximintegrated.com/en/images/appnotes/203/203Fig02.gif : 10.05.2014

[24] http://andrei.clubcisco.ro/cursuri/f/f-sym/3so/cursuri/12_SO_Curs_13.pdf Consultat la: 15.05.2014

[25] http://developer.android.com/guide/components/activities.html Consultat la: 01.05.2014

[26]http://ro.wikipedia.org/wiki/Java_(limbaj_de_programare)#cite_note-10 Consultat la: 05.05.2014

[27]http://ctrl-d.ro/development/resurse-development/introducere-in-android/ Consultat la: 05.05.2014

[28] http://www.wvshare.com/img/pinout/DS18B20_l.jpg 10.05.2014

[29] http://www.byvac.com/bv3/image/cache/data/other/bv4241/bv4241_top-500×500.gif

[30] http://en.wikipedia.org/wiki/Raspberry_Pi#mediaviewer/File:RaspberryPi.jpg

[31] http://cdn-reichelt.de/bilder/web/xxl_ws/A300/RASPBERRY_PI_A_01.png

[32] http://5af5e3de5795a966dd90-e9792bbf34570cde028937f7b1897875.r53.cf3.rackcdn.com/uploads/images/pi_model_a&b.jpg

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 Consultat la: 20.05.2014

[2] http://www.java.com/en/download/faq/whatis_java.xml Consultat la: 01.06.2014

[3] Java: de la 0 la expert, Ștefan Transă, Ștefan Andrei, Cristian Olaru. – Ed. A II-a rev – Iași: Polirom, 2007 Consultat la: 05.06.2014

[4] http://ro.wikipedia.org/wiki/Apache_(server) Consultat la: 30.05.2014

[5] http://httpd.apache.org/ Consultat la: 30.05.2014

[6] http://json.org/ Consultat la: 12.06.2014

[7] https://code.google.com/p/google-gson/ Consultat la: 11.06.2014

[8] http://loopj.com/android-async-http/ Consultat la: 10.05.2014

[9]http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/ Consultat la: 02.05.2014

[10] https://code.google.com/p/webiopi/ Consultat la: 10.05.2014

[11] http://www.raspbian.org/ Consultat la: 12.06.2014

[12]http://www.themagpi.com/issue/issue-9/article/webiopi-raspberry-pi-rest-framework/ Consultat la: 08.06.2014

[13]https://lh5.googleusercontent.com/-c-D0BHFnG8E/AAAAAAAAAAI/AAAAAAAAABM/nTgZPiXLkxg/photo.jpg Consultat la: 17.06.2014

[13]http://www.clipartbest.com/cliparts/yTk/MdA/yTkMdAjAc.png Consultat la: 19.06.2014

[13] http://www.clipartbest.com/cliparts/4i9/Kz5/4i9Kz5GiE.png Consultat la: 19.06.2014

[13] http://juvin2012.com/wp-content/uploads/2014/05/www1.jpg Consultat la: 19.06.2014

[13] http://www.ademcan.net/img/blog-120301-rpi.jpg Consultat la: 19.06.2014

[14] http://5af5e3de5795a966dd90-e9792bbf34570cde028937f7b1897875.r53.cf3.rackcdn.com/uploads/images/pi_model_a&b.jpg Consultat la: 28.05.2014

[15]http://www.cnx-software.com/wp- content/uploads/2012/02/Raspberry_Pi_Multimedia_Software_Architecture1.jpg Consultat la: 01.06.2014

[16]http://quantum-bits.org/wp-content/uploads/2013/02/raspberry-pi-schem.png Consultat la: 01.06.2014

[17]http://upload.wikimedia.org/wikipedia/commons/4/45/Raspberry_Pi_-_Model_A.jpg Consultat la: 01.06.2014

[18] http://iqjar.com/jar/wp-content/uploads/2013/01/p1header.png Consultat la: 04.06.2014

[19]http://www.dingleberrypi.com/wp-content/uploads/2012/10/cropped-header.png Consultat la: 30.05.2014

[20]http://www.extremetech.com/computing/124317-what-is-raspberry-pi-2 Consultat la: 05.05.2014

[21] http://ro.wikipedia.org/wiki/Python Consultat la: 07.05.2014

[22] http://ro.wikipedia.org/wiki/Senzor_de_mi%C8%99care Consultat la: 10.05.2014

[23] http://www.maximintegrated.com/en/images/appnotes/203/203Fig02.gif : 10.05.2014

[24] http://andrei.clubcisco.ro/cursuri/f/f-sym/3so/cursuri/12_SO_Curs_13.pdf Consultat la: 15.05.2014

[25] http://developer.android.com/guide/components/activities.html Consultat la: 01.05.2014

[26]http://ro.wikipedia.org/wiki/Java_(limbaj_de_programare)#cite_note-10 Consultat la: 05.05.2014

[27]http://ctrl-d.ro/development/resurse-development/introducere-in-android/ Consultat la: 05.05.2014

[28] http://www.wvshare.com/img/pinout/DS18B20_l.jpg 10.05.2014

[29] http://www.byvac.com/bv3/image/cache/data/other/bv4241/bv4241_top-500×500.gif

[30] http://en.wikipedia.org/wiki/Raspberry_Pi#mediaviewer/File:RaspberryPi.jpg

[31] http://cdn-reichelt.de/bilder/web/xxl_ws/A300/RASPBERRY_PI_A_01.png

[32] http://5af5e3de5795a966dd90-e9792bbf34570cde028937f7b1897875.r53.cf3.rackcdn.com/uploads/images/pi_model_a&b.jpg

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()

}

Similar Posts