Securitate Si Control la Distanta, Folosind Comunicatia Sms (remote Security)

Proiect Diploma

Securitate si control la distanta, folosind comunicatia SMS. (Remote Security).

CUPRINS

1. Introducere

1.1 Descrierea proiectului

1.2 Componentele Sistemului

1.3 Solutii Similare Existente

2. Specificatii tehnice

2.1 Comunicarea intre componente

2.2 Comunicarea prin SMS. Scurt istoric

2.3 Comunicarea folosind comenzi AT

2.4 Specificatii tehnice in cazul comunicarii prin SMS

2.5 Trimiterea mesajelor in modul text

2.6 Transmiterea mesajelor in modul PDU

2.7 Prezentarea pachetului de dezvoltare Nokia PC Suite Connectivity API

2.6 Aplicatia software ce realizeaza comunicarea dintre componente

3. Detalii de realizare

3.1 Baza de date SQL Server 2005

3.2 Aplicatia software.Principalele clase

3.3.Schema de functionare a sistemului.Programarea microcontrollerului

3.3.Programul pentru microcontroller

4. Concluzii

5. Bibliografie

ANEXA 1 – Programul aplicatie de pe calculatorul server. Principalele functii si clase.

ANEXA 2 – Programul pentru microcontroller. Principalele functii.

1. Introducere

1.1 Descrierea Proiectului

Proiectul presupune realizarea unui sistem de securitate si control la distanta prin intermediul unui telefon mobil.

Pentru utilizarea acestui sistem utilizatorul va avea nevoie de urmatoarele componente:

Un telefon mobil prin intermediul caruia va putea primi/transmite informatii de la/catre echipamentele pe care doreste sa le controleze de la distanta.

Un microcontroller(ATMega16) care va monitoriza echipamentele conectate la el.

Un calculator (server) care va fi partea de legatura dintre microcontroller si telefonul mobil care primeste/transmite comenzile.

Un telefon mobil suplimentar care va face legatura dintre calculator si telefonul mobil al utilizatorului.

1.2 Componentele sistemului

Securitate: Presupune securizarea unei incaperi prin montarea de senzori de miscare/prezenta, de fum/gaz si de temperatura. Microcontrollerul va fi conectat la acesti senzori si va putea informa utilizatorul despre problemele aparute. Informarea utilizatorului va fi facuta prin transmiterea unui mesaj text(SMS) catre telefonul mobil al acestuia. Microcontrollerul va transmite un semnal mai intai la un calculator(server) care va analiza informatia primita si in functie de continutul acesteia va initia comunicarea cu utilizatorul. Deasemnea cu ajutorul aplicatiei software instalate pe calculator utilizatorul, poate configura in prealabil modul si cazurile in care se va face aceasta informare.

Aplicatia software instalata pe calculatorul server permite introducerea unor numere de telefon suplimentare de urgenta(Ex: Politie, pompieri, salvare). Astfel pot fi anuntati simultan atat utilizatorul cat si aceste institutii de urgenta despre peri colul iminent.

Sistemul permite insa si declansarea unui mecanism automat de urgenta care sa ofere o protectie cat mai buna pana la sosirea echipajelor de interventie.

In momentul de fata sistemul contine 3 senzori care au urmatoarele functii:

Senzor de temperatura. Avertizeaza asupra depasirii unui anumit prag de temperatura. Permite pornirea/oprirea printr-o comanda de tip SMS au unui echipament responsabil de acest lucru.(ex: radiator de caldura.). Poate fi folosit si pentru un sitem de alarma in cazul incediilor.

Senzor de gaz/fum. Presupune declansarea unui sistem automat de avertizare si stingere a incendiului sau de avertizare asupra unor scurgeri de gaz metan intr-o incapere.Transmite mesaj de avertizare la un anumite numere de telefon.(ex: pompieri).

Senzor miscare/prezenta(pentru alarma). Pe baza acestui senzor se declanseaza automat o alarma. Se va transmite un mesaj de avertizare de tip SMS la unul din numerele de telefon stocate in baza de date a calculatorului.(Ex: politie, pompieri, etc). Deasemnea utilizatroul poate sa porneasca sau sa opreasca printr-un SMS sitemul de alarma.

Control de la distanta: Pe langa partea de securitate care declanseaza alarme si transmite informatii catre anumite persoane sau institutii, sitemul poate fi folosit si in sens invers, adica utilizatorul poate transmite comenzi catre microcontroller.

Pe baza acestor comezi prestabilite anterior microcotrollerul va actiona diverse echipamente conectate la el. De exemplu se poate controla pornirea/oprirea unui aparat de aer conditionat sau a unui radiator de caldura doar printr-o comanda data de pe telefonul mobil(SMS). Deasemnea daca utilizatorul nu doreste ca sistemul de urgenta sa porneasca automat poate sa declanseze el pornirea acestuia.

Un alt exemplu de utilizare poate fi cazul in care dorim sa activam un sistem de alarma intr-o cladire, dar numai dupa ce toti angajatii au plecat. In acest caz nu e nevoie ca persoana care se ocupa de partea de securitate a cladirii sa fie prezenta la fata locului pentru a activa sistemul. Aceasta persoana va fi informata printr-un SMS ca nu mai exista nimeni in cladire si astfel va putea activa alarma printr-o comanda SMS de pe telefonul mobil personal.

Pentru a fi sigur ca alarma este activata se va primi o notificare pe telefon imediat dupa ce acest lucru s-a produs.

Important este faptul ca sistemul este extensibil pentru orice tip de echipament hardware care poate fi conectat la un microcontroller.

Management al telefonului mobil: Pentru realizarea comunicarii dintre calculator si telefonul mobil al utilizatorului mai este nevoie de un telefon mobil auxiliar care va fi conectat la calculator prin portul serial, infrared sau bluetooth.

Aplicatia software instalata pe calculator pe langa faptul ca realizeaza un mangement al sistemului in general, contine si o componenta care permite un mangement particular pentru telefonul conectat la aceasta.

De exemplu utilizatorul poate transfera, de pe telefonul mobil pe calculator sau invers, diverse fisisere(audio, video, poze, sms). Aplicatia ofera informatii despre parametrii sistemului, si tine intr-un fisier(fisier log sau baza de date) toate notificarile pe care le-a primit de la telefonul mobil sau de la microcontroller.

Acest lucru este util in momentul in care apar erori de functionare si se doreste o diagnosticare rapida a problemei aparute.

Schema de conectare intre componente.

1.3 Solutii similare existente:

RemoTeASys. Este o aplicatie de securitate formata din urmatoarele componente:

Senzor pentru alarma.

Interfata telefonica hardware.

Aplicatie software.

Senzorul pentru alarma poate fi de oriece tip(miscare, temperatura,). El comunica direct cu aplicatia software.

Aplicatia software monitorizeaza senzorul pentru alarma si in cazul in care alarma este declansata apeleaza un numar de telefon din lista predefinita la inceput. Daca la numarul de telefon apelat suna ocupat atunci se trece la urmatorul numar de telefon din lista.

Comunicarea propriu-zisa se realizeaza prin intermediul unei Intefete telefonice hardware construita special pentru acest proiect.

Schema hardware a aplicatiei RemoTeASys:

Driver: Acesta comunica direct cu interfata telefonica. Este responsabil si de detectia si prelucrarea intreruperilor primite de la interfata telefonica.

Serviciul pentru alarma: Asteapta evenimente de alarma provenite de la senzorul hardware. Cand primeste acest eveniment activeaza mecanismul de securitate prin apelarea unui numar de telefon din lista.

GUI – Interfata grafica pentru aplicatie.

Configuration File – fisier de configurare.

Telephony Hardware – echipament special creat pentru aceasta comunicare.

Simulated Sensor – senzori simulati.

Interfata grafica a aplicatiei RemoTeASys:

Interfata software cotine urmatoarele:

Modificare, adugare sau setergere a numerelor de telefon din lista.

Pornirea/Oprirea serviciului de alarma.

Alegerea tipului de sunet pentru alarma.(fisier .waw)

Comparatie intre cele doua aplicatii(Avantaje/Dezavantaje):

Aplicatia RemoTeASys este o aplicatie de securitate. Ea nu poate controla echipamente hardware de la distanta, spre deosebire de RemoteSecurity prin care se poate face si control de la distanta.

In aplicatia RemoTeASys pentru transmiterea semnalului de alarma la un numar de telefon este nevoie de o interfata telefonica hardware special creata pentru aceasta comunicare. Acest lucru presupune costuri mai mari din cauza necesitati achizitionarii unui astfel de echipament. In cazul RemoteSecurity nu este nevoie de un hardware specializat care ar putea costa mult. Este nevoie de doua telefoane mobile care pot comunica prin protocolul de tip SMS.

RemoteSecurity are o interfata grafica mult mai complexa comparativ cu interfata grafica de la RemoTeASys . De exemplu pe langa editarea numerelor de telefon ofera si un manager de fisiere pentru telefonul mobil care este conectat la aplicatie. Contine deasemenea si informatii despre starea telefonului conectat.(conexiune activa/inactiva, irda, bluetooth, serial) si permite crearea de utilizatori pentru aplicatie care au anumite drepturi in cadrul aplicaitei.

Producator: Georgia Institute of Technology

Aadresa: http://users.ece.gatech.edu/~hamblen/489X/s04proj/remote_phone_notice/RemoTeASyst%20website/

SMS-it 3.6.3. Este un software care permite trimiterea de SMS- uri catre telefonul mobil folosind un calculator personal. Mesajul poate fi trimis folosind un modem, o conexiune internet sau printr-o conexiune directa cu telefonul mobil.

Acest software permite si transmiterea de poze, tonuri de apel, sau mesaje flash sau WAP.

Interfata grafica a aplicatiei:

Comparatie intre cele doua aplicatii:

SMS-it – este o aplicatie care permite doar comunicarea cu un telefon mobil. Ea nu contine si componente de securitate sau de control de la distanta a unor echipamente hardware. Din acest punct de vedere comparatia intre cele doua aplicatii se reduce la avantajele/dezavantajele oferite de conexiunea cu telefonul mobil.

SMS-it – permite transmiterea de SMS-uri insa ea nu contine un manager de fisiere, spre deosebire de RemoteSecurity care ofera un suport deplin pentru acest lucru.

In momentul de fata SMS-it are o interfata grafica cu mult mai multe optiuni comparativ cu RemoteSecurity. In viitor insa RemoteSecurity poate fi dezvoltat usor astfel incat sa contina si aceste optiuni.

Producator: MAW Consulting

Adresa: http://www.mawnet.com

CC-CAM alarm. Este un software de securitate bazat pe detectia miscarii. Scopul acestui software este de a identifica persoana care a intrat neautorizat intr-o anumita locatie. Aplicatia trimite poze de la fata locului in momentul in care sistemul de alarma este declansat. Aceste poze sunt receptionate de un calculator si pot fi stocate pe hard-disk- ul acestuia. Deasmenea se poate viziona in timp real prin intermediul unei camere web locatia monitorizata. Conexiunea cu calculatorul se face folosind internetul.

Interfata grafica a programului:

Comparatie intre cele doua aplicatii:

CC-CAM – este o aplicatie foarte complexa care ofera securitate la un pret relativ scazut.

Comparativ cu RemoteSecurity, aceasta aplicatie nu poate controla de la distanta alte echipamente hardware. Ea doar primeste informatii de la aceste echipamente.

O alta problema este conexiunea cu calculatorul personal care se realizeaza prin internet. Internetul are doua dezavantaje majore: conexiunea este foarte vulnerabila la atacuri din partea utilizatorilor, deci securitatea este compromisa.

Alta problema este stabilitatea conexiunii la internet. De multe ori conexiunea la internet poate fi inactiva pentru o anumita perioada fapt datorat furnizorului de servicii.

In cazul RemoteSecurity conexiunea se face prin reteaua de telefonie mobila. O retea de telfonie mobila este mult mai sigura si mai stabila decat o conexiune directa la internet. O posibilitate la aceasta aplicatie ar fi folosirea unei conexiuni internet printr-o retea de telefonie mobila. Astfel s-ar putea rezolva problemele prezentate mai sus. Insa conexiunile internet prin retea de telefonie mobila se fac la viteze destul de mici si costuri ridicate, iar aplicatia transmite un volum foarte mare de inente.

O alta problema este conexiunea cu calculatorul personal care se realizeaza prin internet. Internetul are doua dezavantaje majore: conexiunea este foarte vulnerabila la atacuri din partea utilizatorilor, deci securitatea este compromisa.

Alta problema este stabilitatea conexiunii la internet. De multe ori conexiunea la internet poate fi inactiva pentru o anumita perioada fapt datorat furnizorului de servicii.

In cazul RemoteSecurity conexiunea se face prin reteaua de telefonie mobila. O retea de telfonie mobila este mult mai sigura si mai stabila decat o conexiune directa la internet. O posibilitate la aceasta aplicatie ar fi folosirea unei conexiuni internet printr-o retea de telefonie mobila. Astfel s-ar putea rezolva problemele prezentate mai sus. Insa conexiunile internet prin retea de telefonie mobila se fac la viteze destul de mici si costuri ridicate, iar aplicatia transmite un volum foarte mare de informatii(poze, filme in timp real). Din aceasta cauza adoptarea aceste soultii nu este viabila.

Producator: CCDeveloppement

Adresa: http://www.ccdeveloppement.com/ENGLISH/index.html

RDM+ (Remote Desktop for Mobiles). Este un software care permite accesul si controlul de la distanta a unui calculator direct de pe telefonul mobil.

Permite trimiterea/receptionarea de email-uri, documente, poze si aproape orice este legat de un calculator personal.

O conditie pentru folosirea acestui soft este ca telefonul mobil sa fie de utima generatie(procesor performant, memorie mare) si sa suporte aplicatii Java.

Interfata garafica a programului:

Comparatie intre cele doua aplicatii:

Realizeaza controlul de la distanta a unui calculator pe baza telefonului mobil. Necesita telefoane mobile de ultima generatie ceea ce implica costuri ridicate.

Comparativ cu RemoteSecurity aplicatia RMC+ nu ofera componente de securitate.

Interfata grafica usor de folosit.

Producator: SHAPE Services
Adresa: http://www.shapeservices.com

2. Specificatii tehnice

2.1 Comunicarea intre componente

Comunicarea dintre calculator si telefonul mobil al utilizatorului folosind mesaje de tip SMS.

Microcontrollerul si echipamentele conectate la acesta.

Calculatorul care realizeaza legatura dintre componentele de mai sus.

Comunicarea dintre calculator si telefonul mobil se realizeaza prin SMS. Comunicarea se face cu ajutorul unui telefon mobil auxiliar. S-a optat pentru un telefon auxiliar din motive de costuri si de implementare.

Schema de comunicare intre componente:

Calculatorul comunica cu telefonul auxiliar prin portul serial. Se poate folosi insa si o comunicare prin infrared sau bluetooth.

Programul instalat pe calculator realizeaza aceasta comunicare folosind urmatoarele tehnologii:

Un pachet software de dezvoltare(SDK- Nokia PC Suite Connectivity API) oferit gratuit de producatorul de telefoane mobile Nokia.

Comenzi AT specifice modemului.

Pachetul de dezvoltare(Nokia PC Suite Connectivity API) nu este suficient deoarece el ofera posibilitatea transferului de fisiere dintre calculator si telefonul mobil. Deasemenea se pot efectua prin intermediul lui diverse setari asupra telefonului insa el nu ofera suport pentru lucrul cu SMS-uri.

Comenzile AT specifice modemului sunt cea mai simpla solutie de comunicare dintre telefon si calculator in cazul in care nu aveam un pachet special de dezvoltare oferit de producator. Comenzile AT sunt de fapt comenzi sub forma de siruri de caractere transmise pe portul serial catre telefonul mobil.

Comparativ cu un pachet de dezvoltare implementarea lor este putin mai dificila deoarece necesita neaparat o documentatie a telefonului mobil utilizat.

Exista un set de comenzi care sunt valabile in general pentru toate telefoanele mobile insa exista si multe alte comezi care sunt specifice doar unui anumit model de telefon.

2.2 Comunicarea prin SMS. Scurt istoric.

SMS(Short Message Service ) este un protocol de comunicatie care permite transmiterea de mesaje text (maxim 160 caractere ).

Acest protocol este folosit in telefonia mobila pentru realizarea comunicarii intre utilizatori.

De cele mai multe ori acest protocol este folosit insa si pentru interactiunea cu sisteme automate, care permit realizare unor actiuni fara implicarea activa a utilizatorului.

Indeea comunicarii prin SMS a aparut la inceputul anilor 80, cand diversi experti au incercat sa prezinte avantajele acestei tehnologii.

SMS-ul urma sa fie folosit pentru alertarea utilizatorului mobil asupra declansari unor evenimente. Insa un mare avantaj era folosirea aceste tehnologii pentru controlul echipamentelor de la distanta.

Primul SMS a fost trimis in 1992 prin reteaua de telefonie mobila Vodafone folosind un calculator personal. La inceput putina lumea a folosit aceasta tehnologie iar datele statistice arata ca in anul 1995 media era de 0.4 mesaje pe utilizator lunar. Insa in anul 2000 acest numar a ajuns la 35 mesaje pe luna trimise de un utilizator. Din acest an numarul de SMS-uri trimise a crescut foare mult si s-a ajuns la 500 de miliarede de mesaje trimise in anul 2006.

In momnetul da fata folosirea protocolului de comunicatie SMS este o solutie foarte buna pentru comunicarea cu echipamente automate la distanta, avantajul principal al acestuia fiind costul scazut.

In cazul RemoteSecurity comunicarea prin SMS este solutia cea mai buna din punct de vedere al raportului calitate-pret. Pentru a realiza comunicarea este nevoie de doar doua telefoane mobile capabile sa comunice cu acest protocol.

Proiectul a fost dezvoltat si testat folosind doua telefoane mobile marca Nokia insa aplicatia se poate extinde astfel incat sa foloseasca si alte tipuri de telefoane.

2.3 Comunicarea folosind comenzi AT

Comenzile AT sunt siruri de caractere care se trimit unui modem pe portul serial, in cazul nostru telefonul mobil. Exista comenzi AT care sunt generale pentru orice tip de telefon dar exista si comezi specifice unui anumit tip de telefoane.

Cele mai folosite comenzi AT in cazul telefoanelor Nokia sunt :

Control al apelarii:

ATA Comanda de raspuns

ATD Commanda de apel

ATH Comanda de inchidere

ATL Cresterea volumului difuzorului

ATM Control al difuzorului

ATO Trecere in modul On-Line

ATP Apelare prin impulsuri(pulse dial)

ATT Apelare prin ton (tone dial)

AT+CSTA Setarea tipului de adresa

AT+CRC Setare cod telefon

Control al cardului de date:

ATI Comanda de identificare

ATS Selectia registrului S

ATZ Reapelare

AT&F Activare setari din fabrica

AT&V Afisare configurare activa

AT& parametrilor in profil

AT&Y Slectie si setarea functiei de power.

AT+CLCK Comanda de blocare

AT+COLP Identificarea liniei conectate

AT+GCAP Cerere lista de performante

AT+GMI Cerere identificare producator

AT+GMM Cerere identificare model

AT+GMR Cerere identificare revizie

AT+GSN Cerere identificare numar serial

Comenzi de control al telefonului:

AT+CBC Controlul bateriei

AT+CGMI Cerere identificare producator

AT+CGMM Cerere identificare model

AT+CGMR Cerere identificare revizie.

AT+CGSN Cerere identificare numar serial

AT+CMEE Raport erroare telefon

AT+CPAS Status al activitati telefonului

AT+CPBF Cautare agenda telefon

AT+CPBR Citire agenda telefon

AT+CPBS Setarea memoriei telefonului

AT+CPBW Scriere agenda telefon

AT+CSCS Selectie set de caractere TE

AT+CSQ Calitatea semnalului

Computer Data Card Interface:

ATE Echo

ATQ Result Code Suppression

ATV Definire format de raspuns

ATX Selectie interval de raspuns

AT&C Definire DCD Usage

AT&D Definiere DTR Usage

AT&K Selectie “flow” control

AT&Q Definire modului de comunicare

AT& optiune DSR

AT+ICF DTE-DCE Character Framing

AT+IFC Control local al DTE-DCE

AT+IPR Fixarea ratei DTE

Serviciu:

AT+CLIP Identificarea liniei de apel

AT+CR Raport al serviciului de control

AT+DR Raport al compresiei de date

AT+ILRR Raport al ratei locale DTE-DCE

Parametrii de comunicare in retea:

ATB Optiune de comunicare standard

AT+CBST Selectie serviciu

AT+CEER Raport extins de eroare

AT+CRLP Protocol radio

AT+DS Compresie de date

Comenzi diverse:

A/ Reexecutie a liniei de comanda

AT? Ajutor

AT*C Pornire interpretor de SMS

AT*T Setare protocol SMS

AT*V Activarea modului V.25bis

AT*NOKIATEST Comanda pentru testare

AT+CESP Setarea protocolului SMS Block

Comenzi pentru SMS in modul text

AT+CSMS Selectie serviciu mesaje

AT+CPMS Modul de stocare al mesajelor

AT+CMGF Formatul mesajelor

AT+CSCA Adresa centrului de servicii

AT+CSMP Setarea parmetrilor in modul text

AT+CSDH Afisarea parametrilor in modul text

AT+CSCB Selectie tipului de mesaje Cell Broadcast

AT+CSAS Salvarea setarilor

AT+CRES Resetarea setarilor

AT+CNMI Indicare mesaj nou in “TE”

AT+CMGL Listarea mesajelor

AT+CMGR Citirea mesajelor

AT+CMGS Trimitere mesaj

AT+CMSS Trimitere mesaj salvat

AT+CMGW Scriere mesaj in memorie

AT+CMGD Stergere mesaj

Comenzi pentru SMS in modul PDU

AT+CMGL Listarea mesajelor

AT+CMGR Citirea mesajelor

AT+CMGS Trimitere mesaj

AT+CMGW Scriere mesaj in memorie

2.4 Specificatii tehnice in cazul comunicarii prin SMS

Pentru folosirea comunicarii prin SMS trebuie setat numarul centrului de mesaje (Short Message Centre – SMSC), in statia mobila (MS sau Short Message Service-Mobile Orginated SMS-MO). Pentru setarea acestui numar se foloseste comanda “at+csca ”:

at+csca = ”<SMSC-number>” ,

at+csca = "+61418706700"

2.5 Trimiterea mesajelor in modul text

SMS este un serviciu “store and forwarad”, cu alte cuvinte mesajele nu sunt trimise direct de la expeditor la destinatar. Intodeauna mesajele sunt trimise prin centru SMS (SMSC) si apoi receptionate de destinatar. Fiecare retea de telefonie mobila are propriul centru de mesaje care receptioneaza si retransmite mesajele.

Acest serviciu permite si confirmarea livrarii mesajului catre destinatar. Pentru a realiza acest lucru trebuie sa activam in telefonul mobil confirmarea primirii mesajului.

2.6 Trimiterea mesajelor in modul PDU

Formatul PDU trimite informatia in forma binara de 7 sau 8 biti.

Este avantajos sa trimitem in acest format cand avem date ce trebuie compresate, pentru a salva spatiu. Formatul PDU contine nu numai mesajul, dar si informatii despre expeditor si numarul centrului de mesaje al acestuia.

Ex:

Daca se trimite sirul de caractere “hellohello” un telefon primeste in modul PDU urmatorul sir de caractere:

Aceasta secventa de octeti este compusa din 3 parti:

Primul octet care indica lungimea informatiei pentru centru de mesaje (SMSC – ).

Informatia pentru centru de mesaje (SMSC).

Continutul SMS – ului.

Toti octetii de mai sus sunt in hexadecimal cu exceptia centrului de mesaje, numarul destinatarului si a timpului expedierii care sunt in decimal.

In formatul PDU numarul de telefon al destinatarului se obtine prin inversarea semioctetilor in felul urmator:

Numarul 72 38 88 09 00 F1" devine "27 83 88 90 00 1F".

Lungimea numarului de telefon este impara si din aceasta cauza s-a mai adaugat un F la sfarsit.

Timpul expedierii "99 03 29 15 16 59 08", contine urmatoarele informatii:

Primele sase caractere reprezinta data.

Urmatoarele sase caractere reprezinta timpul.

Ultimele doua caractere reprezinta timpul raportat la GMT.

Transmiterea unui mesaj in modul PDU:

Urmatorul exemplu arata cum se trimite un mesaj in formatul PDU folosind un telefon mobil Nokia:

AT+CMGF=0 //Seteaza modul PDU

AT+CSMS=0 //Verifica daca modemul suporta comenzi SMS

AT+CMGS=23,>0011000B916407281553F80000AA0AE8329BFD4697D9EC37 //Trimite mesajul, 23 octets, primul octet “00” nu conteaza el doar se adauga pentru a completa lungimea informatiei pentru SMSC.

2.7 Prezentarea pachetului de dezvoltare Nokia PC Suite Connectivity API

PC Suite Connectivity API 1.1 este un pachet de programe distribuit gratis de producatorul de telefoane mobile Nokia.

Acesta ofera o modalitate usoara de dezvoltare a programelor destinate lucrului cu telefoanele mobile marca Nokia. API-ul ofera interfete sofisticate pentru accesarea fisiserelor si directoarelor de pe telefonul mobil, si de asemenea permite instalarea de diverse aplicatii pe telefon.

Functii pentru initializare:

Functii pentru managementul telefonului:

Functii pentru lucrul cu fisisere:

Mecanismul de callback:

2.8 Aplicatia software ce realizeaza comunicarea dintre componente.

Caracteristici:

Trebuie sa ruleze tot timpul pe calculatorul server pentru ca sistemul de securitate sa fie activ.

Realizeaza comunicarea dintre microcontroller si telefonul mobil al utilizatorului.

Poate fi configurata de pe calculatorul server.

Contine toate setarile pentru intregul sistem.

Retine toate informatiile de configurare intr-o baza de date.

Poate realiza transferul de fisiere intre un telefon mobil conectat pe serial/irda/bluetooth si calculator.

Poate salva/edita mesajele SMS in baza de date locala sau direct pe telefonul mobil

Contine o lista cu toate actiunile specifice sitemului de securitate.(Monitorizare senzori, Acativare/Dezactivare echipamente conectate la microcontroller).Acestea sunt deasemenea salvate in baza de date.

Foloseste threaduri pentru conexiunea cu teleonul mobil pentru a nu se boloca interfata grafica.

Interfata garfica poate fi minimizata, maximizata si redimensionata.

Interfata grafica contine urmatoarele taburi : SmsManager, Microcontroller Manager, Phone File Manager.

Contine un meniu cu urmatoarele componete: System, Options, Help.

Aplicatia este realizata in mediul de dezvoltare Visual C# 2005.

Aplicatia foloseste ca baza de date Sql Server 2005.

Meniul aplicatiei:

Meniul aplicatiei grafice contine trei componente:

Sistem

Optiuni

Help

Sistem: Contine 2 subcategori: Activare Sistem si Configurare.

Activare Sistem:

Porneste sistemul de securitate si din acest moment nu se mai poate naviga in cadrul aplicatiei. Toate controalele vor fi dezactivate.

Configurare:

Deschide o noua fereastra pentru crearea/editare/strgerea de utilizatori pentu sitemul de securitate.

Fig1. Meniu->Sistem->Configurare

Pentru a crea un utilizator trebuie dat un nume pentru acesta (user name).

In momentul in care se apasa butonul Adauga se deschide o fereastra in care utilizatorul trebuie sa adauge un nume, numarul de telefon, si o parola.

Fig2 – Meniu->Sistem->Configurare->Adauga

Butonul Editeaza – deschide o fereastra identica cu cea de adugare insa in aceasta doar se editeaza utilizatorul selectat. Pentru a edita un utilizator este nevoie de introducerea parolei pentru autentificare.

Fig3 – Meniu->Sistem->Configurare->Editeaza

Butonul Sterge – sterge un utilizator din lista de utilizatori creati.

Optiuni – Contine optiuni legate de interfata grafica. Aplicatia poate fi minimzata in partea dreapta a barei de lucru.

Help – Contine informatii ajutatoare despre aplicatie si informati despre cel care a realizat aplicatia.

Tabul Setari Sms:

Interfata grafica:

Fig4-> Setari Sms

Se activeaza cand se incarca aplicatia. Deasemnea se poate activa cand se apasa butonul Setari Sms.

Contine o lista (ListView) pentru afisarea mesajelor stocate in baza de date locala sau pe telefonul mobil. Lista de mesaje contine urmatoarele itemuri:

Index – reprezinta indexul sms-ului in lista.

Subiect – reprezinta continutul sms-ului.

Data – reprezinta data la care s-a primit mesajul.

Stocare – reprezinta locul in care este stocat mesajul.(baza de date locala sau memoria telefonului).

Butonul Refresh

Reinitializeaza conexiunea cu baza de date si telefonul mobil pentru a obtine mesajele salvate.

Butonul Afiseaza

Deschide o noua fereastra pentru vizualizarea detaliata a mesajului(SMS).

Fig5. Setari Sms->Afiseaza

Butonul Adauga/Editeaza

Deschide o noua fereastra pentru crearea/editarea unui nou mesaj ce poate fi salvat in baza de date locala sau pe telefonul mobil. Aceasta noua fereastra contine si doua butoane care confirma sau anuleaza salvarea mesajului.

Fig6. Setari Sms ->Adauga/Editeaza

Butonul Delete

Deschide o noua fereastra pentru a confirma stergerea mesajului selectat.

Fig7. Setari Sms->Sterge

Butonul Trimite

Deschide o noua fereastra din care se poate trimite un mesaj la un anumit numar de telefon dat de utilizator. In aceasta fereastra se poate edita doar numarul de telefon al destinatarului dar nu si continutul mesajului selectat. Numarul de telefon trebuie sa contina si prefixul international insa fara caracterul “+” in fata, deoarece acesta este adaugat atomat la numarul de telefon.

Fig8. Setari Sms->Trimite

Tabul Setari Microcontroller

Interfata grafica

Fig9. RemoteSecurity->Setari Microcontroller

Contine urmatoare componente:

O lista de actiuni (listview) specifice microcotrollerului. Aceasta lista contine numele actiunii si data la care a fost creata.

Un control text (richTextBox) in care este afisata descrierea actiunii, pentru a oferi utilizatorului o scurta descriere a acesteia.

Un control (richTextBox) pentru mesaje de avertizare(Warnings). Aceste mesaje pot aparea in cazul in care utilizatorul nu a configurat corect actiunea si din aceasta cauza ea poate sa nu functioneze corect.

Doua “radio” butoane care permit activarea/dezactivarea actiunii.

Un buton “checkBox” pentru activarea/dezactivarea unei programari intre anumite intervale de timp a actiunii. Daca aceasta optiune este activata actiunea selectata va fi activa doar in intervalul de timp specificata mai jos.

Doua controale de tipul “Date&Time” pentru setarea intervalului de timp.

Un buton pe salvarea modificarilor actiunii.. In cazul in care nu s-au facut modificari sau modificarile sunt identice cu cele din baza de date butonul este inactiv. El devine activ atunci cand modificarile difera de cele salvate in baza de date.

Un buton pentru optiuni avansate. Acest buton va deschide o noua fereastra pentru configurari mai detaliate.

Butonul Advance Settings.- Deschide o noua fereastra cu setari avansate:

Fig10. Microcontroller Manager->AdvanceSettings

Fereastra contine urmatoarele componente:

Un control comb-box cu toti utilizatorii creati.

O lista cu useri activi pentru actiunea curenta.(Utilizatori Activi)

Butonul Adauga adauga un utilizator in lista de useri activi.

Butonul Sterge sterge un utilizator din lista de useri activi.

O lista ce contine toate comenzile specifice actiunii(Comenzi disponibile).

Check-boxul Mesaj de Notificare indica daca userul are dreptul de a primi mesaje de avertizare din partea sistemului de securitate.

Check-boxul Mesaj pentru Control indica daca userul poate trimite comenzi catre sistemul de securitate.

Check-boxul Confirmare Mesaj indica daca userul va primi un mesaj de confirmare pentru executia comenzii precedente.

Check-boxul Control uutomat al sistemului activeaza controlul automat al sistemului. In acest caz userii nu mai au acces la sistemul de securitate pentru actiunea curenta. Ei vor primi cel mult un mesaj de avertizare din partea sistemului de securitate.

Primele trei check-boxuri reprezinta setari pentru utilizator iar ultimul check-box este o setare pentru actiunea curenta.

Tabul Administrare Telefon

Interfata grafica

Fig11. RemoteSecurity->Administrare Telefon

Fereastra contine urmatoarele componente:

O lista (listView) pentru directoarele si fisierele de pe hard-disck.

O lista (listView) pentru directoarele si fisierele de pe telefonul mobil conectat pe portul serial.

Butonul Refresh care reinitializeaza conexiunea cu telefonul mobil.

Butonul Copiaza copiaza un fisiser pe telefon sau calculator.

Butonul Muta muta un fisier de pe telefon pe calculator si invers.

Butonul Sterge sterge un fisier de pe telefon sau calculator.

Doua controale de tip editBox care contin calea curenta in director.

Aceasta componenta este de fapt un “browser” de directoare si fisiere foarte utila in special pentru telefon deoarece programul “windows explorer” nu permite vizualizarea fisierelor telefonului mobil.

Cele doua liste folosite pentru afisarea directoarelor si fisierelor contin urmatoarele itemuri:

Nume – Numele fisierului sau directorului

Marime – marimea fisierului

Tip – tipul poate fi: director sau fisier

3 Detalii de realizare

3.1 Baza de date SQL Server 2005

Pentru salvarea datelor s-a folosit o baza de date creata in SQL-Server 2005.

Baza de date se numeste RemoteSecurity si contine urmatoarele tabele:

UsersTable

Aceasta tabela are urmatoarele coloane:

Index – contine indexul unei linii din tabela. Aceasta este incrementat automat la adaugarea unei noi linii in tabela.

UserName – Contine numele utilizatorului

Password – Contine parola utilizatorului

Phone Number – Contine nuamrul de telefon al utilizatorului.

DateCreated – Contine data la care a fost creat utilizatorul.

Enable – Indica daca utilizatorul este activa sau nu in cadrul aplicatiei software.

SmsInfoTable

Aceasta tabela are urmatoarele coloane:

Index – contine indexul unei linii din tabela. Aceasta este incrementat automat la adaugarea unei noi linii in tabela.

Subject – Contine subiectul mesajului.

Phone Number – Contine nuamrul de telefon al utilizatorului.

DateTime – Contine data la care a fost primit mesajul.

Storage – Contine locul in care se afla salvat mesajul (telefon sau baza de date locala).

CommandsTable

Aceasta tabela are urmatoarele coloane:

Index – contine indexul unei linii din tabela. Aceasta este incrementat automat la adaugarea unei noi linii in tabela.

CommandName contine comezile pentru sistemul de securitate.

Action Index – Contine indexul actiunii corespunzatoare comenzii. O comanda nu poate fi atasata mai multor actiuni.

ActionsTable

Aceasta tabela are urmatoarele coloane:

Index – contine indexul unei linii din tabela. Aceasta este incrementat automat la adaugarea unei noi linii in tabela.

ActionName – Contine numele actiunii.

Description – Contine o scurta descriere a actiunii.

Enable – Indica daca actiunea este activa sau nu.

Schedule – Indica daca avem o programare intre anumite intervale de tipm pentru actiunea in cauza.

StartDate – Reprezinta data de inceput a intervalului de timp in care este activa actiunea.

EndDate – Reprezinta data de sfarsit a intervalului de timp in care este activa actiunea

AutomaticControl – Indica daca actiunea este monitorizata si tratata automat.

ActionToUserMapTable

Este o tablea care mapeaza actiunile cu utilizatorii aflati in lista de utilizatori activi.

Aceasta tabela are urmatoarele coloane:

ActionIndex – Contine indexul actiunii salvate in baza de date.

UserIndex – Contine indexul utilizatorului salvat in baza de date.

MessageNotification – Indica daca utilizatorul va fi anuntat printr-un mesaj SMS daca s-a declansat alarma pentru actiunea corespunzatoare.

MessageControl – Indica daca utilizatoru poate controla de la distanta prin mesaj SMS echipamentele conectate la microcontroller.

MessageConfirmation – Indica daca utilizatorul va primi un mesaj de confirmare a executarii comenzii precedente.

3.2 Aplicatia software. Principalele clase

Aplicatia contine urmatoarele clase scrise in limbajul de programare C#

RemoteSecurity

CATComandsMgr

CConnectivityMgr

CDatabaseMgr

ConnAPI

RemoteSecurityDataSet

CActionInfo

CSmsInfo

EditSms

DeleteSms

SendSms

ViewSms

Program

RemoteSecurity

Aceasta clasa este implementarea interfetei grafice principale. Cotine cele trei view-uri, meniul si cele butoanele corespunzatoare view-urilor.

Aici sunt tratate toate evenimentele legate de interfata cu utilizatorul.Contine functii ce trateaza apasarea unui buton sau modificarea datelor de catre utilizator in unul din controalele continute.

Mesajele de eroare sunt memorate tot in aceasta clasa.

CATCommandsMgr

Este o clasa ce realizeaza lucrul cu comenzile de tip AT trimise pe portul serial catre telefonul mobil.

Principalele functii sunt:

cmdPing() – trimite un mesaj scurt catre telefon.Scopul ei este de a testa conexiunea cu telefonul

cmdWriteSmsToMemory(String strMessage, String strPhoneNumber) – salveaza un mesaj in memoria telefonului mobil.

cmdSendSms(String strMessage, String strPhoneNumber)- trimite un mesaj la un anumit numar de telefon

cmdDeleteSms(int nIndex) – sterge un mesaj de pe telefonul mobil dandu-se indexul acestuia.

cmdReadSms(SMS_STORAGE smsType, ref List<CSmsInfo> smsInfo) –citeste toate mesajele de pe telefon.

processResponse() – interpreteaza raspunsul primit de la telefon dupa ce s-a executat o comanda

CConectivityMgr:

Este folosita la transferul de fisiere dintre telefon si calculator. Clasa foloseste API-ul PC Suite Connectivity API distribuita gratuit de producatorul Nokia.

Principalele functii sunt:

initConnection() – initializeaza PC Suite Connectivity API

release() – dealoca PC Suite Connectivity API

listPhones() – listeaza telefoanele conectate in cazul in care sunt mai multe

loadFolder ()– incarca directoarele de pe telefon

getPhoneFiles() – incaraca fisierele de pe telefon

transferFile() – Muta/Copiaza un fisier intre telefon si calculator.

deleteItem() – Sterge un fisier sau director de pe telefonul mobil

CDatabaseMgr

Este folosita la conexiunea cu baza de date. Obtine toate informatiile referitoare la baza de date SQL. Poate crea/sterge/edita informatii din tablele bazei de date.

Baza de date contine urmatoarele tabele:

SmsInfo_tbl – se retin informatiile despre SMS-uri

ActionInfo_tbl – se retin informatiile despre actiunile specifice microcontrollerului

Principalele functii sunt:

init() – realizeaza initializarea variabilelor ce fac conexiunea cu baza de date.

getSmsInfoList() – obtine toate informatiile din tabela SmsInfo_tbl.

addSms() – adauga un sms in baza de date.

deleteSms() – sterge un sms din baza de date.

updateSms() – updateaza un sms.

getActionsInfoList() – obtine toate informatiile din tabela ActionInfo_tbl.

updateAction() – updateaza o actiune

ConAPI

Este pachetul de programe PC Suite Connectivity API oferita gratuit de producatorul de de telefoane mobile Nokia.

RemoteSecurityDataSet

Este clasa care contine toate informatiile despre modul in care se face conexiunea cu baza de date. Contine clase generate automat pentru tablele din baza de date.

CActionInfo

In aceasta clasa se incaraca toate informatille despre o actiune salvata in baza de date. Contine urmatoarele variabile:

int m_nMemoryIndex – indexul din baza de date.

String m_strActionName – numele actiunii.

String m_strActionDescription – descrierea actiunii.

bool m_bIsEnable – flag care indica daca actiunea este activa sau nu

bool m_bSchedule – flag care indica daca actiunea este activa intr-un anumit interval de timp.

DateTime m_StartDate – data de la care o sa fie activa actiunea.

DateTime m_EndDate –data la care actiunea o sa devina inactiva.

CSmsInfo

In aceasta clasa se incaraca toate informatiile despre un SMS salvat in baza de date sau in memoria telefonului mobil. Contine urmatoarele variabile:

String m_strMessage – mesajul.

DateTime m_DateTime – data si timpul cand a fost primit mesajul.

String m_strPhoneNumber – numarul de telefon al expediotrului.

int m_nMemoryIndex – indexul din baza de date sau telefonul mobil.

STORAGE_TYPE m_nStorage – locul in care se afla mesajul(memoria telefonului sau baza de date locala).

String[] m_strInfo – vector de siruri de caractere auxiliar, folosit doar la conectarea cu telefonul mobil.

EditSms

Este clasa ce implementeaza grafic fereastra Editeaza Sms pentru editarea unui SMS. Contine informatii despre SMS-ul curent ce trebuie editat.

DeleteSms

Este clasa ce implementeaza grafic fereastra de confirmare pentru stergerea unui SMS.

SendSms

Este clasa ce implementeaza grafic fereastra Trimite Sms pentru trimiterea unui SMS

la un anumit numar de telefon.

ViewSms

Este clasa ce implementeaza grafic fereastra Vizualizare Sms pentru vizualizarea detaliata a unui SMS.

Program

Este clasa pentru rularea programului principal.

3.3 Schema de functionare a sitemului de securitate. Programarea microcontrollerului

Schema de functionarea a sistemului de securiate format din microcontroller ATMega16 si a tuturor echipamentelor conectate(senzori, motoare) este simulata cu ajutorul programului Proteus.

Microcontrollerul are urmatoarele elemente conectate:

Senzor de miscare

Senzor de fum/gaz

Senzor de temperatura

Trei motoare alimentate la tensiuni diferite(220V, 110V, 24V).

Practic in locul motoarelor se poate conecta orice tip de echipament care suporta tensiunile respective.

De exemplu am putea conecta urmatoarele echipamente:

Aparat de aer conditionat.

Radiator de caldura.

Calculator portabil.

Scopul celor trei motoare este de a simula orice tip de echipament conectabil la sursa de tensiune corespunzatoare. Sitemul embeded format din microcontroller si restul de echipamente conectate la el are rolul de a trimite/primi informatii la calculatorul server in cazul in care se depaseste un prag stabilit anterior.

Exemplu: In caz de incendiu microcontrollerul preia informatia de la senzor, conform careia s-a depasit un anumit prag si trimite o informare catre calculatorul server.

Calculatorul server in fuctie de setarile facute in prealabil de utilizator poate decide sa activeze un sistem automat de alarma sau doar sa trimita o simpla notificare(SMS) la diverse numere de telefon.

Practic sistemul de protectie in cazul unei alarme poate fi activat in doua feluri:

Automat – pornit de calculatoru server imediat ce s-a declansat alarma.

Manual – necesita o comanda explicita din partea utilizatorului.

Toate monitorizarile microcontrollerului se gasesc pe calculatorul server sub numele de Actiuni. Aceste actiuni pot fi configurate din aplicatia care ruleaza pe calculatorul server.

Tot pentru simulare pe langa programul Proteus s-a mai folosit un program care simuleaza un port serial virtual.

Schema electrica a sistemului de securitate

Fig12. Schema electronica

Microcontrollerul ATMega16

Fig13. Microcontrollerul ATMEGA16

Caracteristici:

Microcontroller pe 8 biti, arhitectura avansata RISC.

131 instructiuni majoritatea executate intr-un singur clock.

32 x 8 biti registrii de lucru.

16 KBytes memorie flash pentru stocarea programului.

512 bytes EEPROM.

1 KByte internal SRAM.

2 timere pe 8 biti si un timer pe 16 biti.

Interfata seriala

Interfata seriala SPI

32 intrari I/O(input / output).

Viteza: 0-16 Mhz\

Consum: la 1Mhz – 3V.

Contine urmatorii pini:

Reset – reseteaza microcontrollerul. Alimentarea se face la 5V iar la 0V se reseteaza.

RXD- pin portul D. Se primesc date asincron.

TXD – pin portul D. Transmite date asincron.

PA – portul A. Este folosit pentru conexiuni de intrare-iesire(I/O). Se poate conecta un convertor analog – digital.

PB – portul B. Este folosit pentru conexiuni de intrare-iesire(I/O).

PC – portul C. Este folosit pentru conexiuni de intrare-iesire(I/O).

PD – portul D. Este folosit pentru conexiuni de intrare-iesire si pentru intreruperi.

XTAL1 – intrare pentru clockul intern

XTAL2 – iesire pentru inversarea amplificarii oscilatorului

AREF- pin analog pentru conversia analog/digitala.

AVCC – tensiune de alimentare pentru portul A si pinul de conversie analog/digitala.

Condesatorii C1, C2 oscilatoru de quartz X si rezistenta R2

C1, C2, X formeaza un oscilator care dau frecventa microcontrollerului.

Rezistenta R2 este doar pentru protectie pentru ca sa nu aveam scurtcircuit.

MAX 232

Converteste din semnale TTL in semnale pentru interfata seriala ERS-232.

TTL: 0÷5V. (0 respectiv 1 logic).

ERS-232: -12÷12V. (0 respectiv 1 logic).

Max 232 inverseaza semnalul deci avem nevoie de doua inversoare pentru a reface semnalul.

Trei Relee(5V)

Se conecteaza la portul C.

Scopul lor este de a porni/opri motoarele care simuleaza un consumator.

Trei Moatoare

Scopul lor este de a simula un consumator.

Motorul poate fi alimentat la o sursa de tensiune care poate fi setata de utilizator.

S-au pus trei motoare pentru trei tensiuni de alimenatre standard 220V, 110V si 24V.

Trei apmlificatoare neinversoare cu amplificare 1

Scopul lor este de a amplifica curentul pentru relee.

Senzorul de temperatura

Fig14. Senzor temperatura

Masoara temperaturi intre -55ºC si +125ºC.

Temperatura este citita ca o valoare pe 9 biti.

Datele sunt citite prin intermediul a 3 fire(CLK, DQ, RST).

Descrierea pinilor:

Cand dorim sa citim date de la senzor folosind pinul DQ, clock-ul trebuie sa fie la valoarea logica unu. Un ciclu clock presupune o margine descendenta si apoi una ascendenta.

Pentru a scrie date la senzor folosind pinul DQ, clockul trebuie sa fie la valoarea logica zero.

Deasemenea daca pinul RST are valoarea logica unu comunicatia este terminata.

Senzorul de gaz metan

Fig15.Senzor gaz metan

Senzorul de gaz este format dintr-un potentiometru RV1 si o rezistenta RL pe care se masoara tensiunea. Modificarea rezistentei potentiometrului RV1 indica nivelul de gaz metan in incapere.

Reszistenta RV1 se calculeaza cu urmatoarea formula:

RV1= [ (Vc-VRL)* RL ] / VRL

Caracteristica rezistenta-concentratie gaz:

Microcontrollerul va face conversie analog-digitala deoarece el va primi valoarea tensiunii masurate pe rezistenta RL.

Senzorul de prezenta

Acesta este simulat printr-un buton ON/OFF.

3.4 Programul pentru microcontroller

Programarea s-a facut in mediul de dezvoltare AVR Studio 4.32. Programul este scris in limbajul C pentru aceasta folosindu-se compilatorul GCC care este inclus in mediul de dezvoltare WinAVR.

Programul contine urmatorele functii:

Uart_init() – Initializeaza comunicatia seriala asincrona cu rata de transfer BAUDRATE, flosind 8 biti de date, 1 bit de stop, si fara paritate.

Uart_putc() – Scrie la portul serial caracterul dat ca parametru

Uart_puts() – Scrie la portul serial sirul de caractere

Signal – Este apleata cand se primeste un caracter pe portul serial

Main – Contine programul principal.

Pentru comunicarea seriala cu calculatorul server s-a folosit interfata seriala USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter).

Tabel pentru calcularea ratei de transfer.

Initializarea USART:

USART trebuie initializat inainte ca orice comunicare sa aiba loc. Acest proces de initializare presupune setarea ratei de transfer, a formatului si activarea primiri sau receptionarii de date in functie de situatie.

Codul de intializare scris in limbajul C este:

void USART_Init( unsigned int baud )

{

/* Scriem in registru ce rata de transfer vrem */

UBRRH = (unsigned char)(baud>>8);

UBRRL = (unsigned char)baud;

// 1000 0110

// Accesam UCSRC. Setam modul asincron, fara paritate,

// cu un bit de stop, si 8 biti de date

UCSRC = 0x86;

// 1001 1000

// Activam intreruperea cand s-a primit un caracter si

// activam receptionarea/transmiterea seriala,

UCSRB = 0x98; // 1001 1000

Sei() // activam intreruperile globale

}

Comunicare asincrona……

Porturile de intrare iesire(I/O)

Porturile sunt bidirectionale adica pot fi folosite atat pentru intrare cat si pentru iesire.

Fiecare port are 3 registrii: DDxn, PORTxn si PINxn.

Bitul DDxn in registrul DDRx selecteaza directia pinului. Daca DDxn este scris cu valoare logica 1 Pxn este configurat ca pin de iesire. Daca DDxn este scris cu valoarea logica 0 Pxn este configurat ca pin de intrare.

Daca PORTxn este scris cu valoarea logica 1 cand pinul este configurat ca pin de intrare se transmite 1 logic. Ca sa se transmita valoarea 0 logic trebuie ca PORTxn sa fie scris cu valoarea 0 sau portul sa fie configurat ca port de iesire.

Daca PORTxn este scris cu valoarea logica 1 cand pinul este configurat ca pin de iesire, pinul va avea valoarea logica 1. Daca PORTxn este scris cu valoarea logica 0 cand pinul este configurat ca pin de iesire, pinul va avea valoarea logica 0.

Tabel cu configurarea pinilor

Urmatorul cod scris in C arata cum putem seta pinii 0 si 1 cu valoarea logica 1, pini 2 si 3 cu valoara logica 0 si pinii de la 4 la 7 ca pini de intrare pentru portul B.

unsigned char i;

/* Setam directia pentru pini */

PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);

DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);

/* Inseram nop-uri pentru sincronizare */

_NOP();

/* citim valoarea pinilor */

i = PINB;

4. Concluzii

Comparativ cu alte sisteme de securitate si control Proiectul Securitate si control la distanta folosind comunicatai SMS numit pe scurt RemoteSecurity are cateva avantaje:

Poate fi extins foarte usor pentru orice tipuri de echipamente conectate la microcontroller. In acest sens aplicatia de pe calculatorul server care controleaza tot sistemul, a fost proiectata astfel incat sa permita in timp, adaugarea de orice fel de componente hardware.

Contine componente de securitate pentru trimiterea mesajelor catre microcontroller. Autentificarea se face comparand numarul de telefon al expeditorului, si parola de la sfarsitul comenzii SMS, cu datele retinute in baza de date. Deci nu se pot trimite comenzi care sa compromita sistemul, decat cu acordul utilizatorului.

Are un raport calitate/pret foarte bun. Necesita putine componente hardware iar pretul relativ scazut al acestora face ca sistemul sa poata fi achizitionat de utilizatorii simplii si nu doar de firme mari.

Din punct de vedere al marketingului proiectul are ca tinta cumparatorul simplu(home user).

Este usor de implementat. Este nevoie doar de un microcontroller, plus senzorii si echipamentele conectate la acesta, iar pentru comunicarea cu telefonul mobil al utilizatorului trebuie folosit un telefon mobil auxiliar.

Aplicatia de pe calculatorul server, contine o lista de utilizatori predefinita pe baza careia se face autentificarea, si un fisier – log in care se retin toate comenzile trimise in timp. Acest lucru este util, la depanarea sistemului in caz ca apar erori de functionare.

Permite transferul de fisiere cu telefonul mobil.

Permite transmiterea de sms-uri catre un anumit numar de telefon, fara a activa intreg sistemul de securitate. Aceasta componenta este independenta de restul sistemului.

Interfata grafica a aplicatiei este simpla si usor de folosit.

Extinderea proiectului in timp:

La microcontroller se mai pot adauga si alti senzori, in functie de ce doreste utilizatorul.

Imbunatatiri se pot aduce la comunicarea dintre telefonul mobil auxiliar si calculator. In momentul de fata conexiunea cu acesta nu este foarte fiabila.

In viitor este posibil ca acest telefon sa fie inlocuit, si sa se prefere o conexiune internet sau o conexiune speciala, oferita de serviciul de telefonie mobila.

Aplicatia ce ruleaza pe calculatorul server mai poate fi imbunatatita si extinsa, pentru noi echipamente hardware ce au diverse configurari particulare.

Microcontrollerul poate fi schimbat cu unul mai performant si memorie mai mare in cazul in care programul devine mai complex. Este nevoie de memorie mai multa deoarece programarea lui s-a facut in limbajul C folosind compilatorul GCC.

5. Bibliografie

1. Comunicarea SMS:

http://www.activexperts.com

2. Programarea microcontrollerului folosind programul AVR Studio 4.35

http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725

Atmega16.pdf

3. Programarea aplicatiei software in Visual C# 2005

http://msdn2.microsoft.com/en-us/default.aspx

4. Pachetul de programe Nokia pc suite connectivity API

http://forum.nokia.com/

http://discussion.forum.nokia.com/forum/forumdisplay.php?f=14&order=desc

5. Senzorii conectati la microcontroller

http://www.rsromania.com/cgi-bin/bv/rswww/home.do?cacheID=roie&returningUser=N

6. Schema electronica proiectata in programul Proteus

http://www.labcenter.co.uk/index.html?/download/prodemo_dlform.htm?dl&/prodemo.e xe&Proteus%20Demonstration

ANEXA1

using System;

using System.Collections.Generic;

using System.Text;

using System.IO.Ports;

namespace Atlantis

{

//==============================================================

// class: CATCommandsMgr

// Implementeaza comunicarea prin comenzi AT

// Este derivata din CSerialCommands

//===============================================================

public class CATCommandsMgr : CSerialCommands

{

public enum SMS_STORAGE

{

SMS_READ_UNREAD,

SMS_SENT,

SMS_UNSENT,

SMS_ALL

};

//Exception string

protected const String NULL_SERIAL_PORT = "Null Serial port!";

protected const String RESPONSE_TIME_EXPIRED = "To much time waiting for response";

protected const String SERIAL_PORT_NOT_OPEN = "Serial port is not open!";

protected const String INVALID_COMMAND = "Invalid command:";

protected const String SMS_NOT_FOUND = "Message not found in the phone!";

//Commands string

protected const String MSG_OK = "OK";

protected const String MSG_ERROR = "ERROR";

protected const String MSG_INPUT = ">";

//sms read and unread count

protected const int NO_READ_UNREAD_SMS = 10;

//time in seconds

protected const double RESPONSE_TIME = 10.0f;

//============================================================

// Constructor

// Init with an serial port object

//============================================================

public CATCommandsMgr(SerialPort serialPort)

{

m_SerialPort = serialPort;

}

//============================================================

// cmdPing

// ping the device

//============================================================

public override bool cmdPing()

{

m_SerialPort.Write("AT\r");

return processResponse();

}

//============================================================

// cmdWriteSmsToMemory

// Store sms to mobile phone memory

//============================================================

public void cmdWriteSmsToMemory(String strMessage, String strPhoneNumber)

{

String[] strCommands = new String[4]; //text mode

//build command string

strCommands[0] = "AT+CMGF=1\r"; //put the phone in text mode

strCommands[1] = "AT+CMGW=\"" + strPhoneNumber + "\"" + "\r";

strCommands[2] = strMessage + "\r"; //message

strCommands[3] = "\x001a" + "\r";

for (int i = 0; i < strCommands.Length; i++)

{

m_SerialPort.Write(strCommands[i]);

if (!processResponse())

throw new CATCommandsException(INVALID_COMMAND + strCommands[i]);

}

}

//============================================================

// cmdSendSms

// default validity for the message is 1 day

// Send sms to mobile phone

//============================================================

public void cmdSendSms(String strMessage, String strPhoneNumber)

{

String[] strCommands;

strCommands = new String[4];

if (m_SerialPort == null)

throw new CATCommandsException(NULL_SERIAL_PORT);

if (!m_SerialPort.IsOpen)

throw new CATCommandsException(SERIAL_PORT_NOT_OPEN);

//build command string

strCommands[0] = "AT+CMGF=1\r"; //put the phone in text mode

strCommands[1] = "AT+CSMP=17,167,0,16\r"; //set modem parameters

strCommands[2] = "AT+CMGS=\"" + strPhoneNumber + "\"\r"; //set the phone number

strCommands[3] = strMessage + "\x001a" + "\r"; //set the message text

//send the sms

try

{

for (int i = 0; i < strCommands.Length; i++)

{

m_SerialPort.Write(strCommands[i]);

if (!processResponse())

throw new CATCommandsException(INVALID_COMMAND + strCommands[i]);

}

}

catch (CATCommandsException ex)

{

throw ex;

}

catch (InvalidOperationException ex)

{

throw ex;

}

catch (ArgumentNullException ex)

{

throw ex;

}

catch (TimeoutException ex)

{

throw ex;

}

catch (Exception ex)

{

throw ex;

}

}

//============================================================

// cmdDeleteSms

// delete sms from the phone

//============================================================

public void cmdDeleteSms(int nIndex)

{

//delete message

String strCommand = "AT+CMGD=" + nIndex + "\r";

m_SerialPort.Write(strCommand);

if (!processResponse())

{

throw new CATCommandsException(SMS_NOT_FOUND);

}

}

//============================================================

// cmdReadSms

// read sms from the phone

// nType –

//============================================================

public void cmdReadSms(SMS_STORAGE smsType, ref List<CSmsInfo> smsInfo)

{

//get all Received unread message and Received read message

int nStart = 0;

int nEnd = 0;

String strCommand;

switch (smsType)

{

case SMS_STORAGE.SMS_READ_UNREAD:

nStart = 0;

nEnd = 10;

break;

case SMS_STORAGE.SMS_SENT:

nStart = 10;

nEnd = 20;

break;

case SMS_STORAGE.SMS_UNSENT:

nStart = 20;

nEnd = 30;

break;

case SMS_STORAGE.SMS_ALL:

nStart = 0;

nEnd = 30;

break;

default:

nStart = 0;

nEnd = 30;

break;

}

try

{

//put the phone in text mode

strCommand = "AT+CMGF=1\r";

m_SerialPort.Write(strCommand);

if (!processResponse())

throw new CATCommandsException(INVALID_COMMAND + strCommand);

//command string use for message reading

strCommand = "AT+CMGR=";

smsInfo = new List<CSmsInfo>();

for (int i = nStart; i < nEnd; i++)

{

//add index + 1 becasue interval is [1,NO_READ_UNREAD_SMS]

String strTemp = strCommand + (i + 1) + "\r";

m_SerialPort.Write(strTemp);

if (processResponse())

{

//read response in m_strResponse and save in lssMessage

smsInfo.Add(new CSmsInfo(m_strResponse, i+1));

}

else

{

//Get an error. No more message to read so we break.

// break;

continue;

}

}

}

catch (InvalidOperationException ex)

{

throw ex;

}

catch (ArgumentNullException ex)

{

throw ex;

}

catch (TimeoutException ex)

{

throw ex;

}

catch (CATCommandsException ex)

{

throw ex;

}

catch (Exception ex)

{

throw ex;

}

}

//============================================================

// processResponse

// process device response in m_strResponse member.

// should be call after sending a command to device.

//============================================================

public override bool processResponse()

{

DateTime dtTimeout = DateTime.Now.AddSeconds(RESPONSE_TIME);

//string strBuffer = "";

m_strResponse = "";

try

{

do

{

m_strResponse += m_SerialPort.ReadExisting();

//verify response

if (m_strResponse.Contains(MSG_OK))

return true;

if (m_strResponse.Contains(MSG_INPUT))

return true;

//error message

if (m_strResponse.Contains(MSG_ERROR))

return false;

//to much time for response

if (DateTime.Now > dtTimeout)

return true;

}

while (true);

}

catch (InvalidOperationException ex)

{

throw ex;

}

catch (ArgumentNullException ex)

{

throw ex;

}

catch (Exception ex)

{

throw ex;

}

}

}

//==============================================================

// class: CATCommandsException

// handle CATCommandsMgr exceptions

//===============================================================

class CATCommandsException : Exception

{

protected const string m_strCmdError = "AT command error!";

public CATCommandsException()

: base(m_strCmdError)

{

}

public CATCommandsException(string message)

: base(message)

{

}

public CATCommandsException(string message, Exception inner)

: base(message, inner)

{

}

}

public class CMessage

{

public enum STORAGE_TYPE

{

LOCAL_STORAGE = 0,

PHONE_STORAGE,

ALL

};

protected int m_nMemoryIndex;

public String m_strMessage;

protected STORAGE_TYPE m_nStorage;

public CMessage()

{

m_strMessage = "";

m_nMemoryIndex = -1;

}

public CMessage(int nIndex, String strMessage, STORAGE_TYPE storage)

{

this.m_nMemoryIndex = nIndex;

this.m_strMessage = strMessage;

this.m_nStorage = storage;

}

public CMessage(int nIndex, String strMessage)

{

this.m_nMemoryIndex = nIndex;

this.m_strMessage = strMessage;

this.m_nStorage = STORAGE_TYPE.LOCAL_STORAGE;

}

public int getMemoryIndex()

{

return m_nMemoryIndex;

}

public STORAGE_TYPE getMemoryStorage()

{

return m_nStorage;

}

};

public class CCommandMessage : CMessage

{

public int m_nActionIndex;

public CCommandMessage()

:base()

{

m_nActionIndex = 0;

}

public CCommandMessage(int nIndex, String strMessage, int nActionIndex)

:base(nIndex, strMessage)

{

m_nActionIndex = nActionIndex;

}

public CCommandMessage(CCommandMessage cmdMessage)

{

this.m_nActionIndex = cmdMessage.m_nActionIndex;

this.m_nMemoryIndex = cmdMessage.m_nMemoryIndex;

this.m_nStorage = cmdMessage.m_nStorage;

this.m_strMessage = cmdMessage.m_strMessage;

}

};

//========================================================================

// class: CSmsInfo

// Contains all information about an SMS.(Date, Phone Number, Message)

// Is used for local and phone SMS

//========================================================================

public class CSmsInfo : CMessage

{

//index which help on getting the data

protected const int PHONE_NUMBER_INDEX = 3;

protected const int PHONE_DATETIME_INDEX = 5;

protected const int PHONE_MESSAGE_INDEX = 6;

public DateTime m_DateTime;

public String m_strPhoneNumber = "";

//string which contains all split info

private String[] m_strInfo;

//====================================================================

// CSmsInfo()

// Constructor. Initialize class members based on an string variable

//====================================================================

public CSmsInfo(String strSms, int nMemoryIndex)

{

m_nMemoryIndex = nMemoryIndex;

m_nStorage = STORAGE_TYPE.PHONE_STORAGE;

//split using '\"' character

m_strInfo = strSms.Split(new char[] { '\"' });

m_strPhoneNumber = m_strInfo[PHONE_NUMBER_INDEX];

//getting date and time

String[] strTemp = m_strInfo[PHONE_DATETIME_INDEX].Split(new char[] { ',', '/', '+', ':' });

if (strTemp.Length > 5)

{

int nYear = 2000 + Convert.ToInt32(strTemp[0]);

int nMounth = Convert.ToInt32(strTemp[1]);

int nDay = Convert.ToInt32(strTemp[2]);

int nHour = Convert.ToInt32(strTemp[3]);

int nMinute = Convert.ToInt32(strTemp[4]);

int nSecond = Convert.ToInt32(strTemp[5]);

m_DateTime = new DateTime(nYear, nMounth, nDay, nHour, nMinute, nSecond);

}

//getting message

strTemp = m_strInfo[PHONE_MESSAGE_INDEX].Split(new char[] { '\n' });

m_strMessage = strTemp[1].Remove(strTemp[1].Length – 1);

}

public CSmsInfo(DateTime dateTime, String strMessage, CSmsInfo.STORAGE_TYPE type)

:base()

{

m_DateTime = dateTime;

m_strMessage = strMessage;

m_nStorage = type;

}

public CSmsInfo(int nIndex, String strMessage, String strPhone, DateTime date, STORAGE_TYPE storage)

:base(nIndex, strMessage, storage)

{

m_strPhoneNumber = strPhone;

m_DateTime = date;

}

public CSmsInfo(CSmsInfo smsInfo)

{

this.m_strMessage = smsInfo.m_strMessage;

this.m_strPhoneNumber = smsInfo.m_strPhoneNumber;

this.m_nStorage = smsInfo.m_nStorage;

this.m_nMemoryIndex = smsInfo.m_nMemoryIndex;

this.m_DateTime = smsInfo.m_DateTime;

this.m_strInfo = smsInfo.m_strInfo;

}

};

}

using System;

using System.Collections.Generic;

using System.Text;

using Atlantis.RemoteSecurityDataSetTableAdapters;

using System.Data;

namespace Atlantis

{

public class CDatabaseMgr

{

//connection string

String m_ConnectionString = "Connect Timeout=600;Integrated Security=SSPI;" +

"Persist Security Info=False;Initial Catalog=RemoteSecurity;" +

"Packet Size=4096;Data Source=" +

System.Environment.MachineName.Trim();

//Sms info table

protected SmsInfo_tblTableAdapter m_SmsInfoTable;

//Actions table

protected Actions_tblTableAdapter m_ActionsTable;

//User table

protected UsersTableTableAdapter m_UsersTable;

//ActionToUserMap

protected ActionToUserMapTableTableAdapter m_ActionToUserTable;

//

protected CommandsTableTableAdapter m_CommandsTable;

// protected ActionToCommandsMapTableTableAdapter m_ActionToCommands;

public CDatabaseMgr()

{

}

//=======================================================================================

// getSmsTablConnectionState()

// get connection status

//========================================================================================

public ConnectionState getSmsTablConnectionState()

{

return m_SmsInfoTable.Connection.State;

}

//=======================================================================================

// getActionTableConnectionState()

// get connection status

//========================================================================================

public ConnectionState getActionTableConnectionState()

{

return m_ActionsTable.Connection.State;

}

//=======================================================================================

// getUserTableConnectionState()

// get connection status

//========================================================================================

public ConnectionState getUserTableConnectionState()

{

return m_UsersTable.Connection.State;

}

//=======================================================================================

// init

// init tables

//========================================================================================

public void init()

{

//init Sms info table

m_SmsInfoTable = new SmsInfo_tblTableAdapter();

m_SmsInfoTable.Connection.ConnectionString = m_ConnectionString;

//init Actions table

m_ActionsTable = new Actions_tblTableAdapter();

m_ActionsTable.Connection.ConnectionString = m_ConnectionString;

//init Users table

m_UsersTable = new UsersTableTableAdapter();

m_UsersTable.Connection.ConnectionString = m_ConnectionString;

m_CommandsTable = new CommandsTableTableAdapter();

m_CommandsTable.Connection.ConnectionString = m_ConnectionString;

m_ActionToUserTable = new ActionToUserMapTableTableAdapter();

m_ActionToUserTable.Connection.ConnectionString = m_ConnectionString;

}

SmsInfo_tblTableAdapter getSmsInfoTable()

{

return m_SmsInfoTable;

}

//=======================================================================================

// getSmsTable

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable getSmsData()

{

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// addSms

// add sms in to database table

//========================================================================================

public void getSmsInfoList(ref List<CSmsInfo> smsInfoList)

{

int nIndex = 0;

String strMessage = null;

String strPhone = null;

DateTime dateTime = DateTime.Now;

CSmsInfo.STORAGE_TYPE storage = CSmsInfo.STORAGE_TYPE.LOCAL_STORAGE;

RemoteSecurityDataSet.SmsInfo_tblDataTable dataTable = m_SmsInfoTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if(row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strMessage = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

strPhone = (String)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

dateTime = (DateTime)row[col];

//storage is always local

col = dataTable.Columns[4];

if (row[col] != null)

{

storage = CSmsInfo.STORAGE_TYPE.LOCAL_STORAGE;

}

//add data

smsInfoList.Add(new CSmsInfo(nIndex, strMessage, strPhone, dateTime, storage));

}

}

//=======================================================================================

// addSms

// add sms in to database table

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable addSms(CSmsInfo smsInfo)

{

//insert

m_SmsInfoTable.Insert(smsInfo.m_strMessage, smsInfo.m_strPhoneNumber,

smsInfo.m_DateTime, smsInfo.getMemoryStorage().ToString());

//get new table

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// deleteSms

// delte sms from database table

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable deleteSms(CSmsInfo smsInfo)

{

//delete

m_SmsInfoTable.Delete(smsInfo.getMemoryIndex(), smsInfo.m_strMessage, smsInfo.m_strPhoneNumber,

smsInfo.m_DateTime, smsInfo.getMemoryStorage().ToString());

//get new table

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// updateSms

// update sms from database table

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable updateSms(CSmsInfo smsInfo)

{

m_SmsInfoTable.UpdateSms(smsInfo.m_strMessage, smsInfo.m_strPhoneNumber,

smsInfo.m_DateTime, smsInfo.getMemoryStorage().ToString(), smsInfo.getMemoryIndex());

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// getActionsTable

//========================================================================================

public RemoteSecurityDataSet.Actions_tblDataTable getActionsData()

{

return m_ActionsTable.GetData();

}

//=======================================================================================

// getActionsInfoList

//

//========================================================================================

public void getActionsInfoList(ref List<CActionInfo> actionInfoList)

{

int nIndex = 0;

String strAction = null;

String strDescription = null;

DateTime startDate = DateTime.Now;

DateTime endDate = DateTime.Now;

bool bSchedule = false;

bool bEnable = false;

bool bAutomatic = false;

RemoteSecurityDataSet.Actions_tblDataTable dataTable = m_ActionsTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strAction = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

strDescription = (String)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

bEnable = (bool)row[col];

col = dataTable.Columns[4];

if (row[col] != null)

bSchedule = (bool)row[col];

col = dataTable.Columns[5];

if (row[col] != null)

startDate = (DateTime)row[col];

col = dataTable.Columns[6];

if (row[col] != null)

endDate = (DateTime)row[col];

col = dataTable.Columns[7];

if (row[col] != null)

bAutomatic = (bool)row[col];

//add data

actionInfoList.Add(new CActionInfo(nIndex, strAction, strDescription, bEnable, bSchedule,

startDate, endDate, bAutomatic));

}

}

//=======================================================================================

// updateSms

// update Action from database table

//========================================================================================

public RemoteSecurityDataSet.Actions_tblDataTable updateAction(CActionInfo actionInfo)

{

m_ActionsTable.UpdateAction(actionInfo.m_strActionName, actionInfo.m_strActionDescription,

actionInfo.m_bIsEnable, actionInfo.m_bSchedule, actionInfo.m_StartDate,

actionInfo.m_EndDate,actionInfo.m_bAutomaticControl, actionInfo.getMemoryIndex());

return m_ActionsTable.GetData();

}

//=======================================================================================

// getUsersData

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable getUsersData()

{

return m_UsersTable.GetData();

}

//=======================================================================================

// addUser

// adauga un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable addUser(CUser user)

{

//insert

m_UsersTable.Insert(user.m_strUserName, user.m_strPassword,

user.m_strPhoneNumber, user.m_DateCreated, user.m_bEnable);

//get new table

return m_UsersTable.GetData();

}

//=======================================================================================

// addUser

// sterge un user din baza de date

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable deleteUser(CUser user)

{

//insert

m_UsersTable.DeleteUser(user.m_nIndex);

//get new table

return m_UsersTable.GetData();

}

//=======================================================================================

// addUser

// updateaza un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable updateUser(CUser user)

{

m_UsersTable.UpdateUser(user.m_strUserName, user.m_strPassword,

user.m_strPhoneNumber, user.m_DateCreated, user.m_bEnable, user.m_nIndex);

//get new table

return m_UsersTable.GetData();

}

//=======================================================================================

// getActionsInfoList

//

//========================================================================================

public void getUsersInfoList(ref List<CUser> usersList)

{

int nIndex = 0;

String strUserName = null;

String strPassword = null;

String strPhoneNumber = null;

DateTime dateCreated = DateTime.Now;

bool bEnable = false;

RemoteSecurityDataSet.UsersTableDataTable dataTable = m_UsersTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strUserName = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

strPassword = (String)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

strPhoneNumber = (String)row[col];

col = dataTable.Columns[4];

if (row[col] != null)

dateCreated = (DateTime)row[col];

col = dataTable.Columns[5];

if (row[col] != null)

bEnable = (bool)row[col];

//add data

usersList.Add(new CUser(nIndex, strUserName, strPassword, strPhoneNumber, dateCreated,

bEnable) );

}

}

//=======================================================================================

// addActionToUser

// adauga un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.ActionToUserMapTableDataTable addActionToUser(CAdvanceUserSettings userSettings)

{

//insert

m_ActionToUserTable.Insert(userSettings.m_nActionIndex, userSettings.m_nUserIndex, userSettings.m_bNotification, userSettings.m_bControl, userSettings.m_bConfirmation);

return m_ActionToUserTable.GetData();

}

//=======================================================================================

// addUser

// sterge un user din baza de date

//========================================================================================

public RemoteSecurityDataSet.ActionToUserMapTableDataTable deleteActionToUser(CAdvanceUserSettings userSettings)

{

//delete

m_ActionToUserTable.DeleteActionToUser(userSettings.m_nUserIndex, userSettings.m_nActionIndex);

return m_ActionToUserTable.GetData();

}

//=======================================================================================

// addUser

// updateaza un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.ActionToUserMapTableDataTable updateActionToUser(CAdvanceUserSettings userSettings)

{

m_ActionToUserTable.UpdateActionToUser(userSettings.m_nActionIndex, userSettings.m_nUserIndex,

userSettings.m_bNotification, userSettings.m_bControl, userSettings.m_bConfirmation);

//get new table

return m_ActionToUserTable.GetData();

}

//=======================================================================================

// getActionsInfoList

//

//========================================================================================

public void getActionToUserInfoList(ref List<CAdvanceUserSettings> userSettingsList)

{

int nActionIndex = 0;

int nUserIndex = 0;

bool bNotification = false;

bool bControl = false;

bool bConfirmation = false;

RemoteSecurityDataSet.ActionToUserMapTableDataTable dataTable = m_ActionToUserTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nActionIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

nUserIndex = (int)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

bNotification = (bool)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

bControl = (bool)row[col];

col = dataTable.Columns[4];

if (row[col] != null)

bConfirmation = (bool)row[col];

//add data

userSettingsList.Add(new CAdvanceUserSettings(nActionIndex, nUserIndex, bNotification, bControl, bConfirmation) );

}

}

//=======================================================================================

// getCommandsInfoList

//

//========================================================================================

public void getCommandsInfoList(ref List<CCommandMessage> commandsList)

{

int nIndex = 0;

String strMessage = null;

int nActionIndex = 0;

RemoteSecurityDataSet.CommandsTableDataTable dataTable = m_CommandsTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strMessage = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

nActionIndex = (int)row[col];

commandsList.Add(new CCommandMessage(nIndex, strMessage, nActionIndex));

}

}

}

}

Anexa2

///////////////////////////////////////////////////////////////

//

//

// Datele sun transmise pe portul serial

// in mod asincron, cu 8 biti de date si 1 bit de stop la

// rata de transfer de 2400 biti/sec.

//

//

///////////////////////////////////////////////////////////////

#include <avr/io.h>

#include <avr/interrupt.h>

#include <string.h>

// Rata de transfer a datelor pe portul serial

#define BAUDRATE 2400

// Frecventa ceasului microcontrollerului

//#define FOSC 7372800

#define FOSC 4000000

//valorile pentru UBRRH si UBRRL

#define UBRRH_VALUE ((((FOSC>>4)/BAUDRATE)-1)>>8)

#define UBRRL_VALUE ((((FOSC>>4)/BAUDRATE)-1)&0xFF)

// Aci retinem comanda, de maxim 30 de caractere

char Comanda[30];

// Pozitia in Comanda unde trebuie inserat caracterul primit pe serial

unsigned char Pos;

/*

enum CMD_ENCODING

{

INVALID = 0,

RELEU1_ON,

RELEU1_OFF,

RELEU2_ON,

RELEU2_OFF

};

*/

#define RELEU1_ON 0

#define RELEU1_OFF 1

/////////////////////////////////////////////////////////////

//

// FUNCTION: Initializeaza comunicatia seriala asincrona cu

// rata de transfer BAUDRATE, 8 biti de date, 1 bit de

// stop, si fara paritate.

//

/////////////////////////////////////////////////////////////

void uart_init()

{

// Scriem in registru ce rata de transfer vrem

UBRRH = UBRRH_VALUE;

UBRRL = UBRRL_VALUE;

// 1000 0110

// Accesam UCSRC. Setam modul asincron, fara paritate,

// cu un bit de stop, si 8 biti de date

UCSRC = 0x86;

// 1001 1000

// Activam intreruperea cand s-a primit un caracter si

// activam receptionarea/transmiterea seriala,

UCSRB = 0x98; // 1001 1000

// Receiver enabled, Transmitter enabled

// RX Complete interrupt enabled

// Activam intreruperile globale

sei();

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Scrie la portul serial caracterul dat

//

/////////////////////////////////////////////////////////////

void uart_putc(char data)

{

while (!(UCSRA & 0x20)); // Asteapta pana cand s-a transmins ultimul caracter

// Transmitem noul caracter

UDR = data;

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Scrie la portul serial stringul dat, impreuna cu

// caracterul null de la sfarsit.

//

/////////////////////////////////////////////////////////////

void uart_puts(char *data)

{

do

{

uart_putc( *data );//Trimitem caracterul

data++;//Trecem la urmatorul caracter

}while( *data );// Atata timp cat nu am ajuns la sfarsitul stringului

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Scrie la portul serial stringul dat, dar fara caracterul

// null, iar in loc de caracterul nul scrie 0xD ( Carriage Return).

// Este ca si cum ar scrie o linie din string!!

//

/////////////////////////////////////////////////////////////

void uart_putl(char *data)

{

while( *data )// Atata timp cat nu am ajuns la sfarsitul stringului

{

uart_putc( *data );//Trimitem caracterul

data++;//Trecem la urmatorul caracter

}

// Punem si CR

uart_putc( 0xD );

// si Line Feed

uart_putc( 0xA );

}

/////////////////////////////////////////////////////////////

//

// SIGNAL: Este apelat cand se primeste un caracter pe

// portul serial.

//

/////////////////////////////////////////////////////////////

SIGNAL(SIG_UART_RECV)

{

//Caracterul primit se gaseste in UDR

// Punem caracterul inapi, ca sa facem echo ( sa vedem ce tastam in hyperterminal)

/*uart_putc(UDR);

if( UDR != 0xD )// Daca caracterul nu este un sfarsit de linie,

{ // completam acest caracter la comanda

Comanda[Pos] = tolower(UDR); // Facem caracterm mic

Pos++;

}*/

// else

{

Comanda[Pos] = tolower(UDR);

// Am primit sfarsitul de linie, deci am primit o comanda intreaga

// Completam sfarsitul comenzii

//Comanda[Pos] = 0;

Pos = 0;

// tratam comanda data

if( !strcmp(Comanda, "releu1 on" ) ) // Stringurile astea cred ca ar

{ // trebuie definite ca const, pentru ca

PORTC = PORTC|1; // asa mananca din Ram

uart_putl("Releul 1 a fost cuplat.");

return;

}

if( !strcmp(Comanda, "releu1 off" ) )

{

PORTC = PORTC&0xFE;

uart_putl("Releul 1 a fost decuplat.");

return;

}

if( !strcmp(Comanda, "releu2 on" ) )

{

PORTC = PORTC|2;

uart_putl("Releul 2 a fost cuplat.");

return;

}

if( !strcmp(Comanda, "releu2 off" ) )

{

PORTC = PORTC&0xFD;

uart_putl("Releul 2 a fost decuplat.");

return;

}

if( !strcmp(Comanda, "releu3 on" ) )

{

PORTC = PORTC|4;

uart_putl("Releul 3 a fost cuplat.");

return;

}

if( !strcmp(Comanda, "releu3 off" ) )

{

PORTC = PORTC&0xFB;

uart_putl("Releul 3 a fost decuplat.");

return;

}

if( Comanda[0] == RELEU1_ON ) // Stringurile astea cred ca ar

{ // trebuie definite ca const, pentru ca

PORTC = PORTC|1; // asa mananca din Ram

uart_putl("Releul 1 a fost cuplat.");

return;

}

if( Comanda[0] == RELEU1_OFF )

{

PORTC = PORTC&0xFE;

uart_putl("Releul 1 a fost decuplat.");

//uart_putc(98);

return;

}

// uart_putl(Comanda);

uart_putl("Comanda necunoscuta");

}

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Programul principal.

//

/////////////////////////////////////////////////////////////

int main(void)

{

Pos = 0;

// Facem tot portul C ca fiind de iesire

DDRC = 0xFF;

// Setam toti pinii pe zero logic

PORTC = 0;

// Initializam portul serial, si pornim intreruperea de primire

// a caracterelor pe port

uart_init();

while(1)

{

}

}

5. Bibliografie

1. Comunicarea SMS:

http://www.activexperts.com

2. Programarea microcontrollerului folosind programul AVR Studio 4.35

http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725

Atmega16.pdf

3. Programarea aplicatiei software in Visual C# 2005

http://msdn2.microsoft.com/en-us/default.aspx

4. Pachetul de programe Nokia pc suite connectivity API

http://forum.nokia.com/

http://discussion.forum.nokia.com/forum/forumdisplay.php?f=14&order=desc

5. Senzorii conectati la microcontroller

http://www.rsromania.com/cgi-bin/bv/rswww/home.do?cacheID=roie&returningUser=N

6. Schema electronica proiectata in programul Proteus

http://www.labcenter.co.uk/index.html?/download/prodemo_dlform.htm?dl&/prodemo.e xe&Proteus%20Demonstration

ANEXA1

using System;

using System.Collections.Generic;

using System.Text;

using System.IO.Ports;

namespace Atlantis

{

//==============================================================

// class: CATCommandsMgr

// Implementeaza comunicarea prin comenzi AT

// Este derivata din CSerialCommands

//===============================================================

public class CATCommandsMgr : CSerialCommands

{

public enum SMS_STORAGE

{

SMS_READ_UNREAD,

SMS_SENT,

SMS_UNSENT,

SMS_ALL

};

//Exception string

protected const String NULL_SERIAL_PORT = "Null Serial port!";

protected const String RESPONSE_TIME_EXPIRED = "To much time waiting for response";

protected const String SERIAL_PORT_NOT_OPEN = "Serial port is not open!";

protected const String INVALID_COMMAND = "Invalid command:";

protected const String SMS_NOT_FOUND = "Message not found in the phone!";

//Commands string

protected const String MSG_OK = "OK";

protected const String MSG_ERROR = "ERROR";

protected const String MSG_INPUT = ">";

//sms read and unread count

protected const int NO_READ_UNREAD_SMS = 10;

//time in seconds

protected const double RESPONSE_TIME = 10.0f;

//============================================================

// Constructor

// Init with an serial port object

//============================================================

public CATCommandsMgr(SerialPort serialPort)

{

m_SerialPort = serialPort;

}

//============================================================

// cmdPing

// ping the device

//============================================================

public override bool cmdPing()

{

m_SerialPort.Write("AT\r");

return processResponse();

}

//============================================================

// cmdWriteSmsToMemory

// Store sms to mobile phone memory

//============================================================

public void cmdWriteSmsToMemory(String strMessage, String strPhoneNumber)

{

String[] strCommands = new String[4]; //text mode

//build command string

strCommands[0] = "AT+CMGF=1\r"; //put the phone in text mode

strCommands[1] = "AT+CMGW=\"" + strPhoneNumber + "\"" + "\r";

strCommands[2] = strMessage + "\r"; //message

strCommands[3] = "\x001a" + "\r";

for (int i = 0; i < strCommands.Length; i++)

{

m_SerialPort.Write(strCommands[i]);

if (!processResponse())

throw new CATCommandsException(INVALID_COMMAND + strCommands[i]);

}

}

//============================================================

// cmdSendSms

// default validity for the message is 1 day

// Send sms to mobile phone

//============================================================

public void cmdSendSms(String strMessage, String strPhoneNumber)

{

String[] strCommands;

strCommands = new String[4];

if (m_SerialPort == null)

throw new CATCommandsException(NULL_SERIAL_PORT);

if (!m_SerialPort.IsOpen)

throw new CATCommandsException(SERIAL_PORT_NOT_OPEN);

//build command string

strCommands[0] = "AT+CMGF=1\r"; //put the phone in text mode

strCommands[1] = "AT+CSMP=17,167,0,16\r"; //set modem parameters

strCommands[2] = "AT+CMGS=\"" + strPhoneNumber + "\"\r"; //set the phone number

strCommands[3] = strMessage + "\x001a" + "\r"; //set the message text

//send the sms

try

{

for (int i = 0; i < strCommands.Length; i++)

{

m_SerialPort.Write(strCommands[i]);

if (!processResponse())

throw new CATCommandsException(INVALID_COMMAND + strCommands[i]);

}

}

catch (CATCommandsException ex)

{

throw ex;

}

catch (InvalidOperationException ex)

{

throw ex;

}

catch (ArgumentNullException ex)

{

throw ex;

}

catch (TimeoutException ex)

{

throw ex;

}

catch (Exception ex)

{

throw ex;

}

}

//============================================================

// cmdDeleteSms

// delete sms from the phone

//============================================================

public void cmdDeleteSms(int nIndex)

{

//delete message

String strCommand = "AT+CMGD=" + nIndex + "\r";

m_SerialPort.Write(strCommand);

if (!processResponse())

{

throw new CATCommandsException(SMS_NOT_FOUND);

}

}

//============================================================

// cmdReadSms

// read sms from the phone

// nType –

//============================================================

public void cmdReadSms(SMS_STORAGE smsType, ref List<CSmsInfo> smsInfo)

{

//get all Received unread message and Received read message

int nStart = 0;

int nEnd = 0;

String strCommand;

switch (smsType)

{

case SMS_STORAGE.SMS_READ_UNREAD:

nStart = 0;

nEnd = 10;

break;

case SMS_STORAGE.SMS_SENT:

nStart = 10;

nEnd = 20;

break;

case SMS_STORAGE.SMS_UNSENT:

nStart = 20;

nEnd = 30;

break;

case SMS_STORAGE.SMS_ALL:

nStart = 0;

nEnd = 30;

break;

default:

nStart = 0;

nEnd = 30;

break;

}

try

{

//put the phone in text mode

strCommand = "AT+CMGF=1\r";

m_SerialPort.Write(strCommand);

if (!processResponse())

throw new CATCommandsException(INVALID_COMMAND + strCommand);

//command string use for message reading

strCommand = "AT+CMGR=";

smsInfo = new List<CSmsInfo>();

for (int i = nStart; i < nEnd; i++)

{

//add index + 1 becasue interval is [1,NO_READ_UNREAD_SMS]

String strTemp = strCommand + (i + 1) + "\r";

m_SerialPort.Write(strTemp);

if (processResponse())

{

//read response in m_strResponse and save in lssMessage

smsInfo.Add(new CSmsInfo(m_strResponse, i+1));

}

else

{

//Get an error. No more message to read so we break.

// break;

continue;

}

}

}

catch (InvalidOperationException ex)

{

throw ex;

}

catch (ArgumentNullException ex)

{

throw ex;

}

catch (TimeoutException ex)

{

throw ex;

}

catch (CATCommandsException ex)

{

throw ex;

}

catch (Exception ex)

{

throw ex;

}

}

//============================================================

// processResponse

// process device response in m_strResponse member.

// should be call after sending a command to device.

//============================================================

public override bool processResponse()

{

DateTime dtTimeout = DateTime.Now.AddSeconds(RESPONSE_TIME);

//string strBuffer = "";

m_strResponse = "";

try

{

do

{

m_strResponse += m_SerialPort.ReadExisting();

//verify response

if (m_strResponse.Contains(MSG_OK))

return true;

if (m_strResponse.Contains(MSG_INPUT))

return true;

//error message

if (m_strResponse.Contains(MSG_ERROR))

return false;

//to much time for response

if (DateTime.Now > dtTimeout)

return true;

}

while (true);

}

catch (InvalidOperationException ex)

{

throw ex;

}

catch (ArgumentNullException ex)

{

throw ex;

}

catch (Exception ex)

{

throw ex;

}

}

}

//==============================================================

// class: CATCommandsException

// handle CATCommandsMgr exceptions

//===============================================================

class CATCommandsException : Exception

{

protected const string m_strCmdError = "AT command error!";

public CATCommandsException()

: base(m_strCmdError)

{

}

public CATCommandsException(string message)

: base(message)

{

}

public CATCommandsException(string message, Exception inner)

: base(message, inner)

{

}

}

public class CMessage

{

public enum STORAGE_TYPE

{

LOCAL_STORAGE = 0,

PHONE_STORAGE,

ALL

};

protected int m_nMemoryIndex;

public String m_strMessage;

protected STORAGE_TYPE m_nStorage;

public CMessage()

{

m_strMessage = "";

m_nMemoryIndex = -1;

}

public CMessage(int nIndex, String strMessage, STORAGE_TYPE storage)

{

this.m_nMemoryIndex = nIndex;

this.m_strMessage = strMessage;

this.m_nStorage = storage;

}

public CMessage(int nIndex, String strMessage)

{

this.m_nMemoryIndex = nIndex;

this.m_strMessage = strMessage;

this.m_nStorage = STORAGE_TYPE.LOCAL_STORAGE;

}

public int getMemoryIndex()

{

return m_nMemoryIndex;

}

public STORAGE_TYPE getMemoryStorage()

{

return m_nStorage;

}

};

public class CCommandMessage : CMessage

{

public int m_nActionIndex;

public CCommandMessage()

:base()

{

m_nActionIndex = 0;

}

public CCommandMessage(int nIndex, String strMessage, int nActionIndex)

:base(nIndex, strMessage)

{

m_nActionIndex = nActionIndex;

}

public CCommandMessage(CCommandMessage cmdMessage)

{

this.m_nActionIndex = cmdMessage.m_nActionIndex;

this.m_nMemoryIndex = cmdMessage.m_nMemoryIndex;

this.m_nStorage = cmdMessage.m_nStorage;

this.m_strMessage = cmdMessage.m_strMessage;

}

};

//========================================================================

// class: CSmsInfo

// Contains all information about an SMS.(Date, Phone Number, Message)

// Is used for local and phone SMS

//========================================================================

public class CSmsInfo : CMessage

{

//index which help on getting the data

protected const int PHONE_NUMBER_INDEX = 3;

protected const int PHONE_DATETIME_INDEX = 5;

protected const int PHONE_MESSAGE_INDEX = 6;

public DateTime m_DateTime;

public String m_strPhoneNumber = "";

//string which contains all split info

private String[] m_strInfo;

//====================================================================

// CSmsInfo()

// Constructor. Initialize class members based on an string variable

//====================================================================

public CSmsInfo(String strSms, int nMemoryIndex)

{

m_nMemoryIndex = nMemoryIndex;

m_nStorage = STORAGE_TYPE.PHONE_STORAGE;

//split using '\"' character

m_strInfo = strSms.Split(new char[] { '\"' });

m_strPhoneNumber = m_strInfo[PHONE_NUMBER_INDEX];

//getting date and time

String[] strTemp = m_strInfo[PHONE_DATETIME_INDEX].Split(new char[] { ',', '/', '+', ':' });

if (strTemp.Length > 5)

{

int nYear = 2000 + Convert.ToInt32(strTemp[0]);

int nMounth = Convert.ToInt32(strTemp[1]);

int nDay = Convert.ToInt32(strTemp[2]);

int nHour = Convert.ToInt32(strTemp[3]);

int nMinute = Convert.ToInt32(strTemp[4]);

int nSecond = Convert.ToInt32(strTemp[5]);

m_DateTime = new DateTime(nYear, nMounth, nDay, nHour, nMinute, nSecond);

}

//getting message

strTemp = m_strInfo[PHONE_MESSAGE_INDEX].Split(new char[] { '\n' });

m_strMessage = strTemp[1].Remove(strTemp[1].Length – 1);

}

public CSmsInfo(DateTime dateTime, String strMessage, CSmsInfo.STORAGE_TYPE type)

:base()

{

m_DateTime = dateTime;

m_strMessage = strMessage;

m_nStorage = type;

}

public CSmsInfo(int nIndex, String strMessage, String strPhone, DateTime date, STORAGE_TYPE storage)

:base(nIndex, strMessage, storage)

{

m_strPhoneNumber = strPhone;

m_DateTime = date;

}

public CSmsInfo(CSmsInfo smsInfo)

{

this.m_strMessage = smsInfo.m_strMessage;

this.m_strPhoneNumber = smsInfo.m_strPhoneNumber;

this.m_nStorage = smsInfo.m_nStorage;

this.m_nMemoryIndex = smsInfo.m_nMemoryIndex;

this.m_DateTime = smsInfo.m_DateTime;

this.m_strInfo = smsInfo.m_strInfo;

}

};

}

using System;

using System.Collections.Generic;

using System.Text;

using Atlantis.RemoteSecurityDataSetTableAdapters;

using System.Data;

namespace Atlantis

{

public class CDatabaseMgr

{

//connection string

String m_ConnectionString = "Connect Timeout=600;Integrated Security=SSPI;" +

"Persist Security Info=False;Initial Catalog=RemoteSecurity;" +

"Packet Size=4096;Data Source=" +

System.Environment.MachineName.Trim();

//Sms info table

protected SmsInfo_tblTableAdapter m_SmsInfoTable;

//Actions table

protected Actions_tblTableAdapter m_ActionsTable;

//User table

protected UsersTableTableAdapter m_UsersTable;

//ActionToUserMap

protected ActionToUserMapTableTableAdapter m_ActionToUserTable;

//

protected CommandsTableTableAdapter m_CommandsTable;

// protected ActionToCommandsMapTableTableAdapter m_ActionToCommands;

public CDatabaseMgr()

{

}

//=======================================================================================

// getSmsTablConnectionState()

// get connection status

//========================================================================================

public ConnectionState getSmsTablConnectionState()

{

return m_SmsInfoTable.Connection.State;

}

//=======================================================================================

// getActionTableConnectionState()

// get connection status

//========================================================================================

public ConnectionState getActionTableConnectionState()

{

return m_ActionsTable.Connection.State;

}

//=======================================================================================

// getUserTableConnectionState()

// get connection status

//========================================================================================

public ConnectionState getUserTableConnectionState()

{

return m_UsersTable.Connection.State;

}

//=======================================================================================

// init

// init tables

//========================================================================================

public void init()

{

//init Sms info table

m_SmsInfoTable = new SmsInfo_tblTableAdapter();

m_SmsInfoTable.Connection.ConnectionString = m_ConnectionString;

//init Actions table

m_ActionsTable = new Actions_tblTableAdapter();

m_ActionsTable.Connection.ConnectionString = m_ConnectionString;

//init Users table

m_UsersTable = new UsersTableTableAdapter();

m_UsersTable.Connection.ConnectionString = m_ConnectionString;

m_CommandsTable = new CommandsTableTableAdapter();

m_CommandsTable.Connection.ConnectionString = m_ConnectionString;

m_ActionToUserTable = new ActionToUserMapTableTableAdapter();

m_ActionToUserTable.Connection.ConnectionString = m_ConnectionString;

}

SmsInfo_tblTableAdapter getSmsInfoTable()

{

return m_SmsInfoTable;

}

//=======================================================================================

// getSmsTable

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable getSmsData()

{

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// addSms

// add sms in to database table

//========================================================================================

public void getSmsInfoList(ref List<CSmsInfo> smsInfoList)

{

int nIndex = 0;

String strMessage = null;

String strPhone = null;

DateTime dateTime = DateTime.Now;

CSmsInfo.STORAGE_TYPE storage = CSmsInfo.STORAGE_TYPE.LOCAL_STORAGE;

RemoteSecurityDataSet.SmsInfo_tblDataTable dataTable = m_SmsInfoTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if(row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strMessage = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

strPhone = (String)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

dateTime = (DateTime)row[col];

//storage is always local

col = dataTable.Columns[4];

if (row[col] != null)

{

storage = CSmsInfo.STORAGE_TYPE.LOCAL_STORAGE;

}

//add data

smsInfoList.Add(new CSmsInfo(nIndex, strMessage, strPhone, dateTime, storage));

}

}

//=======================================================================================

// addSms

// add sms in to database table

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable addSms(CSmsInfo smsInfo)

{

//insert

m_SmsInfoTable.Insert(smsInfo.m_strMessage, smsInfo.m_strPhoneNumber,

smsInfo.m_DateTime, smsInfo.getMemoryStorage().ToString());

//get new table

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// deleteSms

// delte sms from database table

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable deleteSms(CSmsInfo smsInfo)

{

//delete

m_SmsInfoTable.Delete(smsInfo.getMemoryIndex(), smsInfo.m_strMessage, smsInfo.m_strPhoneNumber,

smsInfo.m_DateTime, smsInfo.getMemoryStorage().ToString());

//get new table

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// updateSms

// update sms from database table

//========================================================================================

public RemoteSecurityDataSet.SmsInfo_tblDataTable updateSms(CSmsInfo smsInfo)

{

m_SmsInfoTable.UpdateSms(smsInfo.m_strMessage, smsInfo.m_strPhoneNumber,

smsInfo.m_DateTime, smsInfo.getMemoryStorage().ToString(), smsInfo.getMemoryIndex());

return m_SmsInfoTable.GetData();

}

//=======================================================================================

// getActionsTable

//========================================================================================

public RemoteSecurityDataSet.Actions_tblDataTable getActionsData()

{

return m_ActionsTable.GetData();

}

//=======================================================================================

// getActionsInfoList

//

//========================================================================================

public void getActionsInfoList(ref List<CActionInfo> actionInfoList)

{

int nIndex = 0;

String strAction = null;

String strDescription = null;

DateTime startDate = DateTime.Now;

DateTime endDate = DateTime.Now;

bool bSchedule = false;

bool bEnable = false;

bool bAutomatic = false;

RemoteSecurityDataSet.Actions_tblDataTable dataTable = m_ActionsTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strAction = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

strDescription = (String)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

bEnable = (bool)row[col];

col = dataTable.Columns[4];

if (row[col] != null)

bSchedule = (bool)row[col];

col = dataTable.Columns[5];

if (row[col] != null)

startDate = (DateTime)row[col];

col = dataTable.Columns[6];

if (row[col] != null)

endDate = (DateTime)row[col];

col = dataTable.Columns[7];

if (row[col] != null)

bAutomatic = (bool)row[col];

//add data

actionInfoList.Add(new CActionInfo(nIndex, strAction, strDescription, bEnable, bSchedule,

startDate, endDate, bAutomatic));

}

}

//=======================================================================================

// updateSms

// update Action from database table

//========================================================================================

public RemoteSecurityDataSet.Actions_tblDataTable updateAction(CActionInfo actionInfo)

{

m_ActionsTable.UpdateAction(actionInfo.m_strActionName, actionInfo.m_strActionDescription,

actionInfo.m_bIsEnable, actionInfo.m_bSchedule, actionInfo.m_StartDate,

actionInfo.m_EndDate,actionInfo.m_bAutomaticControl, actionInfo.getMemoryIndex());

return m_ActionsTable.GetData();

}

//=======================================================================================

// getUsersData

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable getUsersData()

{

return m_UsersTable.GetData();

}

//=======================================================================================

// addUser

// adauga un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable addUser(CUser user)

{

//insert

m_UsersTable.Insert(user.m_strUserName, user.m_strPassword,

user.m_strPhoneNumber, user.m_DateCreated, user.m_bEnable);

//get new table

return m_UsersTable.GetData();

}

//=======================================================================================

// addUser

// sterge un user din baza de date

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable deleteUser(CUser user)

{

//insert

m_UsersTable.DeleteUser(user.m_nIndex);

//get new table

return m_UsersTable.GetData();

}

//=======================================================================================

// addUser

// updateaza un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.UsersTableDataTable updateUser(CUser user)

{

m_UsersTable.UpdateUser(user.m_strUserName, user.m_strPassword,

user.m_strPhoneNumber, user.m_DateCreated, user.m_bEnable, user.m_nIndex);

//get new table

return m_UsersTable.GetData();

}

//=======================================================================================

// getActionsInfoList

//

//========================================================================================

public void getUsersInfoList(ref List<CUser> usersList)

{

int nIndex = 0;

String strUserName = null;

String strPassword = null;

String strPhoneNumber = null;

DateTime dateCreated = DateTime.Now;

bool bEnable = false;

RemoteSecurityDataSet.UsersTableDataTable dataTable = m_UsersTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strUserName = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

strPassword = (String)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

strPhoneNumber = (String)row[col];

col = dataTable.Columns[4];

if (row[col] != null)

dateCreated = (DateTime)row[col];

col = dataTable.Columns[5];

if (row[col] != null)

bEnable = (bool)row[col];

//add data

usersList.Add(new CUser(nIndex, strUserName, strPassword, strPhoneNumber, dateCreated,

bEnable) );

}

}

//=======================================================================================

// addActionToUser

// adauga un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.ActionToUserMapTableDataTable addActionToUser(CAdvanceUserSettings userSettings)

{

//insert

m_ActionToUserTable.Insert(userSettings.m_nActionIndex, userSettings.m_nUserIndex, userSettings.m_bNotification, userSettings.m_bControl, userSettings.m_bConfirmation);

return m_ActionToUserTable.GetData();

}

//=======================================================================================

// addUser

// sterge un user din baza de date

//========================================================================================

public RemoteSecurityDataSet.ActionToUserMapTableDataTable deleteActionToUser(CAdvanceUserSettings userSettings)

{

//delete

m_ActionToUserTable.DeleteActionToUser(userSettings.m_nUserIndex, userSettings.m_nActionIndex);

return m_ActionToUserTable.GetData();

}

//=======================================================================================

// addUser

// updateaza un user in baza de date

//========================================================================================

public RemoteSecurityDataSet.ActionToUserMapTableDataTable updateActionToUser(CAdvanceUserSettings userSettings)

{

m_ActionToUserTable.UpdateActionToUser(userSettings.m_nActionIndex, userSettings.m_nUserIndex,

userSettings.m_bNotification, userSettings.m_bControl, userSettings.m_bConfirmation);

//get new table

return m_ActionToUserTable.GetData();

}

//=======================================================================================

// getActionsInfoList

//

//========================================================================================

public void getActionToUserInfoList(ref List<CAdvanceUserSettings> userSettingsList)

{

int nActionIndex = 0;

int nUserIndex = 0;

bool bNotification = false;

bool bControl = false;

bool bConfirmation = false;

RemoteSecurityDataSet.ActionToUserMapTableDataTable dataTable = m_ActionToUserTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nActionIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

nUserIndex = (int)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

bNotification = (bool)row[col];

col = dataTable.Columns[3];

if (row[col] != null)

bControl = (bool)row[col];

col = dataTable.Columns[4];

if (row[col] != null)

bConfirmation = (bool)row[col];

//add data

userSettingsList.Add(new CAdvanceUserSettings(nActionIndex, nUserIndex, bNotification, bControl, bConfirmation) );

}

}

//=======================================================================================

// getCommandsInfoList

//

//========================================================================================

public void getCommandsInfoList(ref List<CCommandMessage> commandsList)

{

int nIndex = 0;

String strMessage = null;

int nActionIndex = 0;

RemoteSecurityDataSet.CommandsTableDataTable dataTable = m_CommandsTable.GetData();

foreach (DataRow row in dataTable.Rows)

{

//get database info

DataColumn col = dataTable.Columns[0];

if (row[col] != null)

nIndex = (int)row[col];

col = dataTable.Columns[1];

if (row[col] != null)

strMessage = (String)row[col];

col = dataTable.Columns[2];

if (row[col] != null)

nActionIndex = (int)row[col];

commandsList.Add(new CCommandMessage(nIndex, strMessage, nActionIndex));

}

}

}

}

Anexa2

///////////////////////////////////////////////////////////////

//

//

// Datele sun transmise pe portul serial

// in mod asincron, cu 8 biti de date si 1 bit de stop la

// rata de transfer de 2400 biti/sec.

//

//

///////////////////////////////////////////////////////////////

#include <avr/io.h>

#include <avr/interrupt.h>

#include <string.h>

// Rata de transfer a datelor pe portul serial

#define BAUDRATE 2400

// Frecventa ceasului microcontrollerului

//#define FOSC 7372800

#define FOSC 4000000

//valorile pentru UBRRH si UBRRL

#define UBRRH_VALUE ((((FOSC>>4)/BAUDRATE)-1)>>8)

#define UBRRL_VALUE ((((FOSC>>4)/BAUDRATE)-1)&0xFF)

// Aci retinem comanda, de maxim 30 de caractere

char Comanda[30];

// Pozitia in Comanda unde trebuie inserat caracterul primit pe serial

unsigned char Pos;

/*

enum CMD_ENCODING

{

INVALID = 0,

RELEU1_ON,

RELEU1_OFF,

RELEU2_ON,

RELEU2_OFF

};

*/

#define RELEU1_ON 0

#define RELEU1_OFF 1

/////////////////////////////////////////////////////////////

//

// FUNCTION: Initializeaza comunicatia seriala asincrona cu

// rata de transfer BAUDRATE, 8 biti de date, 1 bit de

// stop, si fara paritate.

//

/////////////////////////////////////////////////////////////

void uart_init()

{

// Scriem in registru ce rata de transfer vrem

UBRRH = UBRRH_VALUE;

UBRRL = UBRRL_VALUE;

// 1000 0110

// Accesam UCSRC. Setam modul asincron, fara paritate,

// cu un bit de stop, si 8 biti de date

UCSRC = 0x86;

// 1001 1000

// Activam intreruperea cand s-a primit un caracter si

// activam receptionarea/transmiterea seriala,

UCSRB = 0x98; // 1001 1000

// Receiver enabled, Transmitter enabled

// RX Complete interrupt enabled

// Activam intreruperile globale

sei();

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Scrie la portul serial caracterul dat

//

/////////////////////////////////////////////////////////////

void uart_putc(char data)

{

while (!(UCSRA & 0x20)); // Asteapta pana cand s-a transmins ultimul caracter

// Transmitem noul caracter

UDR = data;

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Scrie la portul serial stringul dat, impreuna cu

// caracterul null de la sfarsit.

//

/////////////////////////////////////////////////////////////

void uart_puts(char *data)

{

do

{

uart_putc( *data );//Trimitem caracterul

data++;//Trecem la urmatorul caracter

}while( *data );// Atata timp cat nu am ajuns la sfarsitul stringului

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Scrie la portul serial stringul dat, dar fara caracterul

// null, iar in loc de caracterul nul scrie 0xD ( Carriage Return).

// Este ca si cum ar scrie o linie din string!!

//

/////////////////////////////////////////////////////////////

void uart_putl(char *data)

{

while( *data )// Atata timp cat nu am ajuns la sfarsitul stringului

{

uart_putc( *data );//Trimitem caracterul

data++;//Trecem la urmatorul caracter

}

// Punem si CR

uart_putc( 0xD );

// si Line Feed

uart_putc( 0xA );

}

/////////////////////////////////////////////////////////////

//

// SIGNAL: Este apelat cand se primeste un caracter pe

// portul serial.

//

/////////////////////////////////////////////////////////////

SIGNAL(SIG_UART_RECV)

{

//Caracterul primit se gaseste in UDR

// Punem caracterul inapi, ca sa facem echo ( sa vedem ce tastam in hyperterminal)

/*uart_putc(UDR);

if( UDR != 0xD )// Daca caracterul nu este un sfarsit de linie,

{ // completam acest caracter la comanda

Comanda[Pos] = tolower(UDR); // Facem caracterm mic

Pos++;

}*/

// else

{

Comanda[Pos] = tolower(UDR);

// Am primit sfarsitul de linie, deci am primit o comanda intreaga

// Completam sfarsitul comenzii

//Comanda[Pos] = 0;

Pos = 0;

// tratam comanda data

if( !strcmp(Comanda, "releu1 on" ) ) // Stringurile astea cred ca ar

{ // trebuie definite ca const, pentru ca

PORTC = PORTC|1; // asa mananca din Ram

uart_putl("Releul 1 a fost cuplat.");

return;

}

if( !strcmp(Comanda, "releu1 off" ) )

{

PORTC = PORTC&0xFE;

uart_putl("Releul 1 a fost decuplat.");

return;

}

if( !strcmp(Comanda, "releu2 on" ) )

{

PORTC = PORTC|2;

uart_putl("Releul 2 a fost cuplat.");

return;

}

if( !strcmp(Comanda, "releu2 off" ) )

{

PORTC = PORTC&0xFD;

uart_putl("Releul 2 a fost decuplat.");

return;

}

if( !strcmp(Comanda, "releu3 on" ) )

{

PORTC = PORTC|4;

uart_putl("Releul 3 a fost cuplat.");

return;

}

if( !strcmp(Comanda, "releu3 off" ) )

{

PORTC = PORTC&0xFB;

uart_putl("Releul 3 a fost decuplat.");

return;

}

if( Comanda[0] == RELEU1_ON ) // Stringurile astea cred ca ar

{ // trebuie definite ca const, pentru ca

PORTC = PORTC|1; // asa mananca din Ram

uart_putl("Releul 1 a fost cuplat.");

return;

}

if( Comanda[0] == RELEU1_OFF )

{

PORTC = PORTC&0xFE;

uart_putl("Releul 1 a fost decuplat.");

//uart_putc(98);

return;

}

// uart_putl(Comanda);

uart_putl("Comanda necunoscuta");

}

}

/////////////////////////////////////////////////////////////

//

// FUNCTION: Programul principal.

//

/////////////////////////////////////////////////////////////

int main(void)

{

Pos = 0;

// Facem tot portul C ca fiind de iesire

DDRC = 0xFF;

// Setam toti pinii pe zero logic

PORTC = 0;

// Initializam portul serial, si pornim intreruperea de primire

// a caracterelor pe port

uart_init();

while(1)

{

}

}

Similar Posts