Localizarea Unui Autovehicul Si Transmiterea Pozitiei Catre Utilizator Prin Gsm sau In Timp Real Prin Gprs Si Internet

Introducere

Evoluția Internet-ului și a tehnologiilor legate de acesta creează posibilități de noi produse pentru diverse segmente ale pieței. Telefoanele mobile și PDA-urile sunt unele dintre ultimele dispozitive care au acces la Internet. În curând vor exista foarte multe echipamente ce vor avea acces la această rețea, astfel încât PC-urile vor reprezenta doar o mică fracțiune numărul acestora.

Proiectul constă în localizarea unui autovehicul si transmiterea acestor date (pozitia: latitudine, longitudine) catre utilizator folosind tehnologia GSM prin SMS, sau in timp real prin GPRS si Internet (fig. 1). Datorită soluțiilor alese, costurile sunt reduse iar aria de acoperire este foarte largă.

Utilizatorul poate selecta modul de operare dorit.

Pozitia, cat si alte date (ora, viteza, unghi, data curentă) sunt împachetate si trimise fie prin GSM-SMS care un utilizator aflat in mișcare, fie microcontrolerul stabileste o legatură la Internet prin GPRS (apeleaza ISP-ul (Internet Service Provider) si face negocierea parametrilor conexiunii), si trimite pachetele UDP ce conțin datele pentru localizare, spre un Server de pe Internet, (care trebuie să aiba adresă IP externă), unde datele sunt stocate într-o bază de date.

Ecipamentul mobil, situat în autovehicul, este alcătuit din:

microcontroler (PIC16F876): interpretează și încapsulează datele primite de la GPS;

modul receptor GPS (Garmin GPS-12): furnizează informații despre poziția la care se situează, viteza și unghiul de deplasare etc…;

telefon mobil (Sony-Ericsson T68i): prin el se realizează legătura cu rețeaua GSM și Internet (prin modemul GPRS incorporat);

Figura 1. Schema generala a proiectului

Componenta principală a echipamentului mobil este microcontrolerul, PIC16F876, care, în mare are rolul de a obține datele de la GPS, si de a le trimite către utilizator in cele doua moduri de funcționare (Figura 1):

Localizare prin SMS: datele sunt impachetate si trimise prin reteaua GSM;

Localizare in timp real: microcontrolerul realizeaza conectarea la Internet, prin GPRS, folosind modemul al telefonului;

Figura 2. Funcțiile echipamentului mobil

Pentru modul SMS, dispozitivul așteaptă un apel de la utilizator, iar după ce a fost apelat, memorează numărul apelantului și formulează un mesaj SMS ce conține datele de la GPS.

Pentru modul de lucru în timp real, dispozitivul se conectează la Internet și trimite informațiile către Server, încapsulate în pachete UDP.

Cap. 1 Microcontroler

Microcontrolerul este principala componentă a acestei aplicații. Acesta se ocupă de conectarea la Intenet, recepționarea datelor de la GPS și împachetarea acestora pentru a le trimite către utilizator prin SMS, sau prin GPRS-Internet în pachete UDP/IP.

Funcțiile implementate în microcontroler sunt:

Comunică serial cu modulul receptor GPS;

Stabilește o comunicație serială cu modemul telefonului mobil;

formează un buffer cu datele NMEA recepționate de la GPS;

formează pachete PDU, din datele din buffer, le trimite către telefon pentru a fi trimise prin SMS. La această etapă sunt implementate încă două rutine: de codare a mesajului pe 7 biți și de transformare din hexa ASCII;

inițializează modemul telefonului, folosind comenzi AT, pentru a trimite datele prin SMS și pentru a se putea realiza conectarea la Internet și trimiterea datelor în timp real prin GPRS-Internet;

stabilește o conexiune prin dial-up la Internet, prin protocolul PPP, cu etapele aferente (negocieri pentru parametrii LCP și IP);

încapsulează datele în pachete UDP-IP-PPP pentru a putea fi trimise prin Internet către Server. În acest scop sunt implementate rutine pentru calculul sumelor de control pentru protocoalele UDP, IP și PPP;

comunică cu o serie de dispozitive periferice: memorie FLASH externă, tastatură și afișaj LCD;

Figura 3. Funcțiile microcontrolerului

Având în vedere că microcontrolerul trebuie să îndeplinească aceste funcții se pune problema alegerii unui microcontroler care să aibă resursele necesare pentru ca această aplicație să poată să fie implementată.

O trăsătură ce furnizează cea mai mare flexibilitate pentru aplicație de acest gen este o memorie program de tip FLASH. Aceasta oferă posibilitatea de a se realiza actualizări și îmbunătățiri ale software-ului chiar prin conexiunea la Internet.

Când este ales un microcontroler cu memorie FLASH este important de a alege unul care ar putea să faciliteze operația de reprogramare de la distanță, fără a adăuga alte circuite externe.

În tabelul 1 sunt prezentate caracteristicile microcontrolerelor produse de Microchip, din familia PIC16F87x.

Tabelul 1. Familia de microcontrolere PIC16F876

Acestea au o serie de caracteristici care ușurează posibilitatea de implementare fizică. Câteva dintre acestea sunt: port serial USART, protocol I2C, convertor analog-digital, comparator, PWM și trimer-e.

Dintre microcontrolerele din tabel a fost ales PIC16F876 datorită următoarelor caracteristici:

memorie FLASH de 8Kb;

memorie RAM de 368 octeți;

memorie EEEPROM de 256 octeți;

Utilizarea memoriei EEEPROM în combinație cu memoria FLASH, permite flexibilitate la stocarea datelor. Memoria EEEPROM este mai rezistentă la rescrieri decât FLASH, fiind potrivită pentru datele care sunt reactualizate des.

O altă trăsătură importantă, a acestui microcontroler, este posibilitatea de utilizare programului bootloader. Acesta permite controlul asupra operațiilor de ștergere și scriere a programului. deasemenea prezită un avantaj pentru etapa de proiectare și dezvoltare a programului din microcontroler, datorită ușurinței cu care se realizează scrierea unei noi versiuni de software, fără a fi nevoie de circute adiționale (cum ar fi un programator extern).

Deoarece microcontrolerul nu are decât un port serial USART, comunicația seriala cu modulul GPS este realizat printr-un pin de intrare/ieșire căruia i s-a atribuit o rutină de bit-bang.

Deasemenea PIC16F876 dispune de 22 de pini de intrare/ieșire ce sunt folosiți pentru comunicația periferifericele și pentru LED-urile indicatoare.

Cele 5 convertoare A/D pe 10 biți pot fi folosite pentru o serie de senzori. Pe lângă informațiile despre poziția modului putând fi implementate și transmiterea unor parametrii sau alarme.

Frecvența de 20MHz la care lucrează acest microcontroler este de ajuns pentru cerințele sistemului.

Cap. 2 GPS (Global Positioning System)

2.1. Generalitati despre GPS

2.1.1. Determinarea poziției

Există o intreagă rețea de sateliți GPS situați pe orbite in jurul Pamantului, fiecare dintre aceștia transmițând un semnal de timp precis. Sateliții iși cunosc pozitia cu acuratețe. În principiu, localizarea prin GPS este realizată de către receptor prin recepția semnalelor și calcularea poziției unde ar trebui să se situeze sateliții. Întârzierile semnalului recepționat, îi permite modulului receptor sa-și calculeze pozitia proprie prin triangulatie. GPS lucrează in banda de 1,5GHz.

2.1.2. Precizia unui modul GPS

Toate unitățile GPS pentru uz civil de la majoritatea producătorilor, sunt proiectate să aibă o precizie de 15 metri.

Sateliții GPS sunt controlați de proprietarii acestora, și anume Departamentul Apararii al S.U.A.. Aceasta agenție are prerogativa de a slabi acuratețea semnalului GPS valabil pentru utilizatori non-militari, în scopuri de apărare naționala. Acest lucru este realizat prin SA (Selective Availability). In mod normal SA este activat.

Acest sistem produce o degradare a preciziei pană la +/- 100 metri. În prezent acuratețea modulelor receptoare GPS poate varia între 15 și 100 de metri, depinzând de nivelul de degradare a preciziei impus de U.S. DOD (U.S. Department Of Defense).

SA introduce o eroare a poziției ce se modifică într-un interval de timp. Când modulul GPS se comporta într-un mod neobișnuit, cu fluctuații de poziție și viteza, înseamna ca SA este activat.

2.2. Garmin GPS-12

Modulul receptor GPS utilizat în acest proiect este Garmin GPS-12 (fig. 4). Acesta are urmatoarele specificații:

precizia: 100 metri când sistemul SA este activat, 15 metri fara SA și 5 metri când se folosesc semnale de corecție DGPS. Deasemnea, modulul are implementat o metodă de mediere, pentru a-i îmbunătăți performanțele când sistemul SA este activat, până la 15metri;

Protocoale suportate de GPS: NMEA 0180, 0182, 0183 ver. 1.5, 0183 ver 2.0; RTCM-104 utilizat pentru semnale DGPS; protocol specific producatorului: Garmin. Deasemenea este posibilă selectarea unor combinații a semnalelor de intrare/ieșire între acestea: NMEA/NMEA, RTCM/NMEA, GRMN/GRMN, and RTCM/NONE;

Semnale și mesaje de alarmă;

Figura 4. Garmin GPS-12

Toate receptoarele GPS produse de Garmin conțin o interfață pentru comunicație seriala cu calculatorul, prin semnale compatibile RS-232. Aceasta poate fi folosită pentru a face o copie a pozițiilor și traseelor parcurse, în calculator și pentru a oferi posibilitatea de afișare a poziției pe ecranul calculatorului în timp real.

Aceasta interfața îndeplinește cerințele standardului NMEA. Viteza de comunicație poate fi reglată în funcție de necesitățile uneia dintre interfețe, dar de obicei este setată automat când se selectează un anumit mod de operare.

Partea fizică este alcătuită din doua semnale: intrare, ieșire și masa. Nu sunt folosite semnale speciale (xon/xoff) pentru stabilirea legăturii. Modulul nu recunoaște aceste semnale și este posibil ca acestea să interfereze cu șirurile de date binare schimbare în comunicație.

O schemă pentru cablul folosit între GPS și microcontroller este prezentată în fig. 5.

Figura 5. Pinii de date ai modulului Garmin GPS-12

2.2.1. Protocoale suportate de GPS-12

Există patru moduri de comunicație seriala cu un dispozitiv extern a acestui receptor:

modul NMEA;

modul Garmin;

modul DGPS;

modul text;

1. Modul NMEA

Institutul NMEA (National Marine Electronics Association) a elaborat o specificație ce definește interfața între diverse echipamente maritime. Standardul permite dispozitivelor electronice utilizate în domeniul maritim, să trimită informații către computere sau alte echipamente maritime. Comunicația receptoarelor GPS este definită în această specificație. Majoritatea aplicațiilor de pe calculator ce furnizează informații despre poziția în timp real, folosesc și așteaptă date în format NMEA. Aceste pachete NMEA includ date PVT (poziție, viteză, timp) complete, fiind prelucrate de modulul receptor GPS.

Principiul folosit de acest protocol este de a trimite o linie de date numită frază, care este în totalitate independentă de celelalte fraze. Pentru fiecare categorie de echipamente există o serie de fraze standard și deasemenea există posibilitatea pentru fiecare companie de a defini fraze proprii.

Toate din frazele standard au un prefix specific dispozitivului care folosește acel tip de fraza. Pentru receptoarele GPS acest prefix este: „GP”. Acesta este urmat de o secvență de trei litere care definește conținutul frazei.

În plus NMEA permite producătorilor de echipamente ce folosesc acest standard să-și definească frazele proprii pentru scopurile pe care le doresc. Toate frazele specifice firmei încep cu litera „P” (Proprietary), și sunt urmate de o literă ce indică producătorul ce a implementat acea fraza. Pentru Garmin această literă este „G”.

Standardul NMEA 0183

Organizația NMEA este o asociație non-profit a producătorilor, distribuitorilor, instituțiilor educaționale și alții ce desfașoara activități în legătură cu perifericele electronice maritime. Standardul NMEA 0183 definește o interfața electrică și un protocol de comunicație de date între instrumetele maritime.

În acest standard dispozitivele implicate în comunicație implica o interfața serială asincronă cu următorii parametri:

viteza: 4800 baud;

8 biți de date (bitul 7 este intotdeauna 0);

biți de stop: unul sau mai mulți;

fara paritate;

fara handshake;

NMEA 0183 permite unui dispozitiv să trimită date către mai multe dispozitive într-un circuit. Este recomandat cablu a între diverse echipamente maritime. Standardul permite dispozitivelor electronice utilizate în domeniul maritim, să trimită informații către computere sau alte echipamente maritime. Comunicația receptoarelor GPS este definită în această specificație. Majoritatea aplicațiilor de pe calculator ce furnizează informații despre poziția în timp real, folosesc și așteaptă date în format NMEA. Aceste pachete NMEA includ date PVT (poziție, viteză, timp) complete, fiind prelucrate de modulul receptor GPS.

Principiul folosit de acest protocol este de a trimite o linie de date numită frază, care este în totalitate independentă de celelalte fraze. Pentru fiecare categorie de echipamente există o serie de fraze standard și deasemenea există posibilitatea pentru fiecare companie de a defini fraze proprii.

Toate din frazele standard au un prefix specific dispozitivului care folosește acel tip de fraza. Pentru receptoarele GPS acest prefix este: „GP”. Acesta este urmat de o secvență de trei litere care definește conținutul frazei.

În plus NMEA permite producătorilor de echipamente ce folosesc acest standard să-și definească frazele proprii pentru scopurile pe care le doresc. Toate frazele specifice firmei încep cu litera „P” (Proprietary), și sunt urmate de o literă ce indică producătorul ce a implementat acea fraza. Pentru Garmin această literă este „G”.

Standardul NMEA 0183

Organizația NMEA este o asociație non-profit a producătorilor, distribuitorilor, instituțiilor educaționale și alții ce desfașoara activități în legătură cu perifericele electronice maritime. Standardul NMEA 0183 definește o interfața electrică și un protocol de comunicație de date între instrumetele maritime.

În acest standard dispozitivele implicate în comunicație implica o interfața serială asincronă cu următorii parametri:

viteza: 4800 baud;

8 biți de date (bitul 7 este intotdeauna 0);

biți de stop: unul sau mai mulți;

fara paritate;

fara handshake;

NMEA 0183 permite unui dispozitiv să trimită date către mai multe dispozitive într-un circuit. Este recomandat cablu STP (Shielded Twisted Pair), cu ecranul pus la masă numai pe partea celui care trimite date. Standardul nu impune folosirea unui anumit tip de conector.

Sintaxa generală a unei fraze NMEA

Toate datele transmise sunt puse în forma acestor fraze. Sunt permise numai caracterele ASCII plus CR (Carriage Return) și LF (Line Feed) .

Fiecare frază începe cu „$”, conține maxim 80 de caractere și se termină cu <CR><LF>. După „$” urmează două caractere indicând dispozitivul și producătorul, apoi trei caractere ce indică tipul frazei iar apoi câmpuri de date separate prin virgule. Datele sunt în format ASCII și se pot extinde pe mai multe fraze la anumite instanțe specializate, dar în general sunt cuprinse într-o singură frază de lungime variabilă.

Dacă un câmp de date dintr-o frază este omis, virgulele sunt transmise în continuare, fara spații între ele.

Fraza se încheie cu „*” după care urmează suma de control pe 8 biți, care este realizată facând sau-exclusiv între toate caracterele cuprinse între „$” și „*”.

Exemplu: două grupuri de fraze NMEA trimise de Garmin GPS-12:

$GPRMC,123441,A,4400.000,N,02518.750,E,000.0,360.0,210305,004.1,E*7E

$GPRMB,A,,,,,,,,,,,,V*71

$GPGGA,123441,4400.000,N,02518.750,E,1,10,2.0,2368.9,M,36.4,M,,*7B

$GPGSA,A,3,01,03,,11,14,15,18,19,20,22,28,,1.6,2.0,3.0*3E

$GPGSV,3,1,11,01,36,163,45,03,43,184,47,09,02,037,00,11,35,296,45*75

$GPGSV,3,2,11,14,53,101,48,15,24,097,42,18,07,056,37,19,67,222,50*7A

$GPGSV,3,3,11,20,07,242,36,22,36,054,45,28,07,322,35,,,,*40

$PGRME,15.0,M,22.5,M,15.0,M*1B

$GPGLL,4400.000,N,02518.750,E,123442,A*24

$PGRMZ,7772,f,3*2E

$PGRMM,WGS 84*06

$GPBOD,,T,,M,,*47

$GPRTE,1,1,c,0*07

$GPRMC,123443,A,4400.000,N,02518.750,E,000.0,360.0,210305,004.1,E*7C

$GPRMB,A,,,,,,,,,,,,V*71

$GPGGA,123443,4400.000,N,02518.750,E,1,10,2.0,2368.9,M,36.4,M,,*79

$GPGSA,A,3,01,03,,11,14,15,18,19,20,22,28,,1.6,2.0,3.0*3E

$GPGSV,3,1,11,01,36,163,45,03,43,184,46,09,02,037,00,11,35,296,45*74

$GPGSV,3,2,11,14,53,101,48,15,24,097,42,18,07,056,36,19,67,222,50*7B

$GPGSV,3,3,11,20,07,242,36,22,36,054,45,28,07,322,36,,,,*43

$PGRME,15.0,M,22.5,M,15.0,M*1B

$GPGLL,4400.000,N,02518.750,E,123444,A*22

$PGRMZ,7772,f,3*2E

$PGRMM,WGS 84*06

$GPBOD,,T,,M,,*47

$GPRTE,1,1,c,0*07 …

Aceste grupuri de fraze sunt trimise la intervale de două secunde.

Frazele trimise de Garmin GPS-12 conțin următoarele informații:

GPRMC – date minime recomandate;

GPRMB – datele minime recomandate când se urmează un traseu;

GPGGA – datele esențiale eșantionate de GPS;

GPGSA – date generale despre recepția semnalului de la sateliți;

GPGSV – date detaliate despre sateliții cu care comunică receptorul;

PGRME – eroarea estimată;

GPGLL – latitudine/ longitudine;

PGRMZ – altitudinea;

PGRMM – tipul hărții;

GPBOD – direcția de deplasare către destinație;

GPRTE – date despre traseu;

Exemple:

Interpretarea datelor din fraza $GPGGA:

$GPGGA,123441,4400.000,N,02518.750,E,1,10,2.0,2368.9,M,36.4,M,,*7B

GGA – Global Positioning System Fix Data;

123441 – ora la care au fost eșantionate datele: 12:34:41;

4400.000,N – latitudine: 44 grade 00,000’ N;

02518.750,E – longitudine: 25 grade 18,750’ E;

1 – tipul eșantionării: date GPS;

(0 = invalid, 1 = date GPS, 2 = date DGPS)

10 – numărul de sateliți care sunt urmăriți;

2.0 – deviația orizontală a poziției;

2368.9,M – altitudinea față de nivelul mării exprimată în metri;

36.4,M – înălțimea nivelului mediu al mării față de elipsoidul WGS84;

(câmp gol) – timpul scurs de la ultima actualizare a DGPS-ului;

(câmp gol) – numărul de indentificare al stației DGPS;

*7B – suma de control. Întotdeauna începe cu „*”;

interpretarea datelor din fraza $GPRMC:

NMEA are propria versiune de date PVT (Poziție, Viteză, Timp) esențiale. Aceasta este numită RMC (The Recommended Minimum).

$GPRMC,123441,A,4400.000,N,02518.750,E,000.0,360.0,210305,004.1,E*7E

RMC – Recommended Minimum sentence C;

123441 – ora la care au fost eșantionate datele: 12:34:41;

A – starea: Activ;

4400.000,N – latitudine: 44 grade 00,000’ N;

02518.750,E – longitudine: 25 grade 18,750’ E;

000.0 – viteza la sol, în noduri;.

360.0 – unghiul de deplasare, în grade;

210305 – data: 21 Martie 2005;

004.1,E – variația câmpului magnetic, folosită pentru busolă;

*7E – suma de control;

Fiecare tip de dată își are propria interpretare, după cum este definită în standardul NMEA.

Dezavantaje NMEA

Alte fraze pot repeta o parte din aceleași informații, dar să pună la dispoziție și alte date noi. Principiul este să urmărim doar fraza de care suntem interesați și pur și simplu să ignorăm alte fraze care nu prezintă interes. Fiecare receptor trimite aceste date, standardizate prin NMEA, fiind de așteptat ca o mare parte din aceste informații să fie ignorate.

În acest standard nu este definită posibilitatea de a trimite o comandă către unitatea GPS. Cel mult se pot trimite pozițiile unor puncte de reper, pentru a fi încărcate și reactualizate în receptor. Deasemenea, nu se poate obține retransmiterea unei fraze.

Unele unități Garmin pot fi setate să funcționeze la rate de transfer mai mari decât 4800baud, cum ar fi 9600 baud (afirmație valabilă și pentru GPS-12), dar aceasta este recomandată numai dacă au fost făcute probe la 4800 baud, și aparatul a funcționat corespunzator.

Date de intrare NMEA

Multe dintre unitațile Garmin acceptă și semnale de intrare. Acestea sunt folosite pentru a actualiza sau a adauga un punct de reper sau date despre traseu.

În modul NMEA nu se folosește un schimb de date pentru inițierea comunicației (handshaking), astfel ca se pot trimite date în formatul corect și unitatea le va accepta și va adauga sau modifica informația din memorie la care s-a facut referire prin fraza trimisă.

Exemplu:

Exemplu de pachet de date de intrare NMEA:

$GPWPL,4807.038,N,01131.000,E,WPTNME*31

în care:

WPL – poziția punctului de reper (Waypoint Location);

4807.038,N – latitudine;

01131.000,E – longitudine;

WPTNME – numele punctului ce se dorește a fi încarcat;

*31 – suma de control;

Deasemenea se pot adresa cereri receptorului GPS, printr-o serie de fraze de tipul:

$CCGPQ,GGA<CR><LF>;

în care al șaselea caracter este întotdeauna „Q” și se solicită numai o anumită frază („GGA” pentru exemplul acesta).

2. Modul Garmin

Protocolul Garmin este un protocol propriu firmei Garmin..

Caracteristicile legăturii seriale ale acestui mod sunt:

viteza: 9600 baud;

8 biți de date;

un bit de stop;

fara paritate;

Nu se folosesc semnale speciale de genul xon/xoff;

Prin comunicația bidirecțională bazată pe comenzi între modulul GPS și un dispozitiv extern se poate:

obține numărul versiunii soft-ului;

afla caracteristicile modulului GPS;

încărca/descărca date despre punctele de reper;

încărca/descărca date despre poziție;

încărca/descărca date despre traseu;

încărca/descărca date despre sateliții utilizați;

descărca ora curentă;

descărca poziția curentă;

încărca un nouă versiune de software;

încărca un set nou de hărți;

descărca o captură de ecran;

recepționa în timp real, o soluție PVT completă;

Formatul unui mesaj Garmin

Toate mesajele incep cu 10 hexa și se termina cu suma de control pe 8 biți urmată de 10 hexa și 03 hexa. Dacă apare un alt caracter 10hexa, în câmpul de date acesta este repetat. Suma de control este complementul față de 2 al restului împărțirii sumei totale a octeților ce alcătuiesc mesajul (fără primul 10 hexa), la 256.

Primul octet din mesaj indică tipul mesajul ce urmează, iar al doilea reprezintă lungimea mesajului.

Exemplu:

Comandă pentru a cere poziția sateliților curenți utilizați:

10 0A 02 01 00 F3 10 03 Send Almanac

3. Modul DGPS

DGPS (Differrential GPS) realizeaza o corecție a semnalelor ce are rolul de compensa erorile de poziție generate de sistemul SA. Exista stații DGPS, instalate de guvernele statelor ce folosesc sistemul GPS, ce transmit semnale de corectare. De obicei acestea funcționeaza pe frecvențele folosite în semnalizarile pentru sistemele maritime, în jurul frecventei de 300KHz.

Exista receptoare opționale ce au rolul de a recepționa aceste semnale diferențiale și le furnizeaza unității GPS. Când modulul GPS se situeaza în apropierea unei stații DGPS, acest sistem marește precizia localizării, la sub 10 metri și precizia estimării vitezei de deplasare la mai puțin de 0.1 noduri.

4. Modul text

Acesta este un mod simplu de ieșire ce furnizează datele despre viteza și poziția în timp real. În prezent acesta este folosit în primul rând de anumite camere foto digitale care pot să afișeze aceste date primite de la GPS.

Acest mod are avantajul că necesită foarte puțină procesare.

Exemplu:

@000607204655N6012249E01107556S015+00130E0021N0018U0000
@aallzzoommss Latitudine Longitudine eroare Altitudine VitEV VitNS VitV

Fiecare obiect are lungimea fixă, ușurând extragerea datelor. Singurele date care necesită procesare este viteza care este divizată în componentele de pe axele X, Y și Z (VitEV, VitNS și VitV).

2.3. Implementarea protocolului NMEA

Deoarece pentru a folosi protocolul Garmin se impune o comunicație bidirecțională, pentru schimbul de mesaje, este necesară implementarea unei seriale USART duplex. Deoarece microcontrolerul dispune numai de un singur port serial USART, care va fi folosit în comunicația cu telefonul mobil, este de preferat să folosim un protocol care nu necesită o legătură pe două fire, cum este NMEA.

Nu este necesar ca microcontrolerul să trimită pachete către GPS, de aceea pentru comunicație este folosit doar firul TX al GPS-ului. Acesta este conectat (prin circuitul MAX232) la un pin din portul B al PIC-ului (la pinul RB5). Acest pin este setat ca pin de intrare, iar recepția datelor se face folosind o rutină de tip bit-bang. În cazul nostru această rutină se cheamă receptieGPS(), vezi anexa 2, la pagina 73. Aceasta este calibrată pentru o rată de transfer de 4800 baud, cu un bit de start și unul de stop.

Algoritmul rutinei receptieGPS () este următorul:

așteaptă primul front descrescător (bitul de start);

așteptă să treacă un bit și jumătate (la 4800 bps, un bit are durata: 312.5 us); (un bit – bitul de start, și jumătate – pentru o eșantionare corectă)

eșantionează semnalul la intervale de un bit (208,33 us); Eșantionarea se face pe mijlocul bitului, deoarece la pasul anterior a fost realizat un decalj de jumătate de bit;

se repetă pasul anterior până când se acumulează 8 biți, care sunt păstrați într-un buffer de un octet și sunt returnați către funcția apelantă;

Urmează extragerea datelor din pachetele trimise de GPS.

Din toate frazele NMEA, pe care le trimite GPS-ul, microcontrolerul selectează linia „$GPRMC” si extrage datele din aceasta conform figurii de mai jos. Datele sunt apoi, pastrate intr-un buffer (Fig. 6).

Figura 6. Extragerea datelor NMEA

Bufferul este are lungimea de 73 de octeți și este de forma: buffer[]={"20:00:00-45gr 26.094'N-025gr 31.476'E-054.0 noduri-060.3gr-09.05.'05 -"};

Pașii parcurși pentru a extrage datele dintr-un pachet NMEA sunt prezentați în figura 7. (pentru funcția formeazamesajdelaGPS(), vezi anexa 2, pagina 80)

În primul rând, dintr-un bloc de date trimis de GPS, trebuie extrasă linia cu prefixul „$GPRMC”. Microcontrolerul așteaptă să primească un caracter „$”, după care ignoră următoarele patru caractere. Citește caracterul care urmează, și dacă acesta este „C” înseamnă ca a fost găsită o frază de tip „$GPRMC” (din toate tipurile de fraze, numai aceasta are al cincilea caracter „C”).

Figura 7. Rutina de extragere a datelor din pachetele NMEA

Datele sunt citite serial. Caracterele sunt introduse în buffer imediat după ce au fost recepționate Aceste date sunt introduse în buffer respectând structura acestuia. De exemplu pentru a introduce latitudinea în buffer trebuie săriți octeții ce conțin text de formatare a acestor date. Zona din buffer care este folosită pentru memorarea latitudinii are forma: „45gr 26.094'N”. Așadar, când se introduc date, se va sări peste octeții ce conțin „gr ” .

Deoarece linia $GPRMC are o structură fixă, se cunoaște exact numărul de octeți ce alcătuiesc fiecare bloc de informație (ora, latitudine, longitudine etc…). De aceea, extragerea datelor se realizează ușor, ignorând caracterele care nu prezită interes (cum ar fi virgulele de delimitare).

Acest buffer va fi încapsulat apoi în PDU (pentru a fi trimis prin SMS) sau în pachete UDP (pentru a fi trimis prin Internet).

Cap. 3 GSM (Global System for

Mobile Communications)

3.1. Generalități despre GSM

Sistemul de telefonie celulară pan-european, cunoscut sub denumirea GSM (sistem global de telecomunicații mobile – Global System for Mobile Communications), reprezintă, în momentul de față, una dintre cele mai complexe rețele de radiocomunicații din lume, luând în considerație chiar și realizările din domeniul militar. El a început să fie utilizat din anul 1991.

GSM beneficiază de o capacitate de 5 pana la 10 ori mai mare față de capacitalea rețelor celulare analogice, această sporire fiind datorată mai multor mecanisme:

Rețeaua GSM este concepută ca o rețea inteligentă (IN – Intelligent Network). Rețelele de radiocomunicații mobile numerice, din care face parte și GSM ca standard european, dispunând de o mare varietate de mesaje de semnalizare, simplifică și îmbunătățesc funcțiile legate de mobilitate. Aceasta se realizează prin procedeele de localizare și înregistrare automată în rețea.

GSM este descris în 161 de recomandări care se întind pe mai bine de 6000 de pagini. Respectarea acestora garantează:

funcționarea oricărui tip de echipament mobil în orice rețea GSM;

interconectarea corectă a echipamentelor și programelor livrate de

diferiți fabricanți.

O rețea GSM este alcatuită din următoarele componente (fig. 8):

Mobile station (MS)

Base transceiver station (BTS)

Base station controller (BSC)

Base station subsystem (BSS)

Mobile switching center (MSC)

Authentication center (AuC)

Home location register (HLR)

Visitor location register (VLR)

Figura 8. Arhitectura sisemului GSM

Transmisiunile de fonie și de date

Sistemul GSM este bidirecțional și nu se limitează numai la asigurarea de servicii telefonice, de calitatea celor terestre, pentru echipamente portabile și mobile. Dintre alte numeroase facilități se remarcă:

• înglobarea unor caracteristici ISDN cum ar fi:

o numerotare cotnpletă ISDN;

transmisiuni de date cu viteze până la 9,6 Kbit/s.

Admiterea de transmisiuni de faximile (Grupul 3 FAX = analog), cu
toate că reluarea transmisiei, datoritâ cerințelor de sincronizare și probabilității de
eroare pe canalul radio, conduce la limitări tehnice serioase.

Transmiterea de mesaje asigurând două servicii:

Serviciul pentru mesaje scurte punct la punct, SMSPP;

Serviciul pentru mesaje scurte difuzate în toată celula, SMSCB.
Calitatea comunicației în fonie este superioară față de sistemele analogice

în cazul unui raport semnal/zgomot (interferență) mai mic. De asemenea, viteza transmisiunilor de date este mai mare decât în cazul sistemelor analogice, iar rata erorilor este mai mică.

3.1.1. Securitate

GSM extinde funcția de mobilitate la nivelul abonatului, prin utilizarea modulului personal de identitate (SIM – Subscriber Identity Modide). La introducerea SIM într-un terminal, acesta este dedicat abonatului. La fiecare apel, folosind proceduri de control al autenticității, rețeaua GSM verifică dacă uiilizatorul este un abonat autentic. Un SIM pierdut nu poate fi folosit decâl dacă se cunoaște numărul de idcntificare (PIN) asociat acestuia. Astfel, se previne încârcarea prin fraudă a notei de plată a unui abonat. Securitatea este sporilă prin introducerea secretizârii comunicațiilor (fonie, fax sau date) la nivelul interfeței radio. Se exclude astfel posibilitatea interceptării radio a unei comunicații.

în concluzie, datorită tehnicii numerice folosite, s-a realizat o integrare pe scară largâ a terminalelor GSM, ceea ce va conduce la reducerea dimensiunii, greutății și a consumului.

3.1.2. Servicii

Serviciile de telecomunicafii oferite de sistemul GSM se clasifică în două categorii principale: servicii suport și teleservicii (fig. 9).

Figura 9. Servicii suport și teleservicii

Serviciile suport sunt responsabile de transmisia semnalelor întrc punctele de acces ale rețelei, numite, în standardul GSM, interfețe utilizator-rețea. Teleserviciile asigură comunicațiile între utilizatori, în conformitate cu protocoalele stabilite de operatorii de rețea. Funcțiile echipamentului terminal (TE) sunt încluse în teleservicii.

Serviciile suport pot include mai multe centrale de tranzit. Rețeaua terminală este fie rețeaua GSM de origine fie orice altă rețea. Echipamentul terminal poate fi compus din una sau mai multe entități, cum ar fi: aparat telefonic, echipament pentru transmisia de date

(DTE), echipament teletext etc. Pe lângă serviciile suport și teleservicii, GSM oferă o serie de servicii speciale. Acestea modifică și/sau suplimentează serviciile de bază de telecomunicații, motiv pentru care nu pot fi oferite ca servicii de sine stătătoare.

Standardul GSM s-a dezvoltat și se dezvoltă în etape, fiecare etapă
reprezentând o fază.

Dintre serviciile de date oferite se menționeează:

FAZA 1

1. Servicii suport:

Transmisiuni de date asincrone și sincrone cu viteze cuprinse între
300-9600 bit/s (inclusiv 1200, 75 bit/s asincron);

PAD (Packet Assembler/Disassembler) asincrone 300-9600 bit/s;

Fonie și date (alternativ) cu opțiunea fonie urmată de date.

2. Teleservicii:

Serviciu de mesaje scurte sursă-destinatar (SMSPP);

Serviciu de difuzare de mesaje scurte, sursă-destinatari muhipli
(SMSCB);

Grupul 3 Telefax.

FAZA 2

îmbunătățirea serviciilor de mesaje scurte,

introducerea modulului de identitateaabonatului(SIM).

este o combinație între serviciile "Conferință" din ISDN și "Al Ireilea
interlocutor" specific telefoniei.

Indicația taxării: Se oferă informații on-line asupra costului convor-
birii în desfașurare;

Serviciul de mesaje scnrte cu date nestnicturate: permite operatorului,
în competiția pentru piață, să-și defmească și să ofere servicii noi,
nestandardizate;

FAZA 2+

Faza 2 s-a încheiat în 1994. Ea reprezintă un pas important spre definirea Sistemului Universal de Telecomunicații Mobile (UMTS). Din dorința de a anticipa dezvoltarea ulterioară s-a hotarât ca procesul de standardizare să continue, conducând la faza 2+. Câteva din direcțiile investigate în faza 2+ sunt:

Interfețe radio multimodale, fiind deja realizate interfețe comune cu
sistemele DECT și INMARSAT;

Servicii de poziționare a abonatului mobil pentru asistență rapidă în
cazul apelurilor de alarmă;

Packet Radio, pentru a introduce aplicații noi cum ar fi: rețele infor-
matice pentru transportul rutier, sisteme de dispecerizare a parcului
circulant de vehicule etc.;

Alocarea unei capacități de comunicație de date sporită, la cerere;

GPRS (General Packet Radio Services) va introduce un tip nou de
scrvicii de date, exploatând o structură pe pachete a mesajelor care este mai puțin

restrictivă asupra întârzierilor absolute și relative între pachete. GPRS poate aloca dinamic până la 8 canale temporale pentru un utilizator mobil;

Comunicație de date prin circuite de mare viteză (HSCSD) prin
asignarea de 8 canale temporale pentru un utilizator.

HSCSD, GPRS și ASCI pot fi privite ca posibile servicii pentru sistemul universal de comuniccații mobile (UMTS).

Compresia de date conform standardului V42bis cu o capacitate de
compresie de 2 până la 3 ori pentru text obișnuit;

3.1.3. Modulul pentru identitatea abonatului (SIM)

SIM conține informații necesare pentru conectarea unui abonat la rețeaua GSM. Unele informații se modifică pe durata exploatării, cele mai multe sunt însă fixe. Accesul la datele de pe cartelă este protejat cu ajutorul unei parole constiluitc din numărul de identitate personal (PIN – Personal Identily Number), având o funcție similară ca în cazul cărților de credit. SIM identifică abonatul prin intermediul IMSI (numărul de identitate internațională al abonalului). Modulul SIM mai conține numărul ISDN al abonatului mobil (MSISDN), număr prin care acesta este apelat, și profilul de servicii la care are acces. Toate aceste informalii sunt fixe.

SIM este implicat în funcții cum ar fi: autorizarea, secretizarea convorbirii, administrarea apelurilor în rețeaua de origine și rețeaua vizitată elc. Acestea modifică o parte din informațiile conținute în memoria SIM. Dintre informațiile variabile fac parte:

Detalii ale numărului de identitate temporară a abonatului (TMSI),
număr care este schimbat periodic de sistem ca metodă de protecție a abonalului
împotriva încercării de interceptare a convorbirilor prin interfața radio.

Detalii despre aria de localizare în care se află abonatul la momentul
respectiv și despre numerele de identificare locală ale sistemului. Astfel, numărul
de identitate al ariei de localizare (LAI) este modificat la intervenția VLR în urma
solicitării centralei.

Multe dintre datele memorate pe SIM sunt protejate împotriva citirii sau modificării ulterioare datei de emitere. Un operator GSM emite un nou modul SIM cu ocazia înregistrării unui nou abonat. Rețeaua în care s-a emis abonamentul este rețeaua de origine (de apartenență) pentru abonatul mobil. Evident, un abonat poate lucra în orice rețea GSM, dacă operatorii au convenit asupra modului de distribuire a încasărilor și cheltuielilor.

3.2. Analiza soluțiilor posibile

Odată ce am obținut datele de la modulul receptor GPS, acestea trebuie transmise către utilizator folosind terminalul mobil.

Soluții pentru transmiterea datelor în timp real: (fig. 10)

Figura 10. Soluții posibilie pentru transmisie de date în timp real

Transmisiune de date pe un canal de voce GSM, utilizând modulația FSK. Modem construit sau modem FSK în circuit integrat.

Folosind această metodă, nu se pot obține viteze de transmisie mari deoarece sistemul GSM folosește CODEC-uri, și filtre pentru a scoate cât mai mult din informația redundantă din semnalul vocal.

În cel mai fericit caz se poate obține o viteză de transmisie de 300bps.

Exemple de modemuri FSK, integrate, potrivite pentru această aplicație:

Pentru a realiza transmisia de date între două terminale mobile, utilizând acest principiu, este necesară deschiderea unui canal de voce. Așadar taxarea se face în funcție de timpul cât este deschisă legătura, nefiind prea convenabilă viteza de 300 bps.

Se poate realiza deasemenea un circuit modulator FSK, după schema de principiu: (fig. 11)

Figura 11. Modulator FSK cu componente discrete

Metoda are performanțe scăzute, de aceea nu a fost adoptată pentru această aplicație.

Folosirea unui canal de date GSM, de 9,6 kbs.

Transmiterea de date prin telefonia celulară, reprezintă o parte a Fazei a doua a implementării sistemului GSM. Astfel, o rețea GSM permite transmisiuni de date la viteze de până 9600 bps și fax până la 9600 bps. Aceste viteze de transfer de date fiind mai mici decât în cazul folosirii sistemelor din faza 2+ (de exemplu GPRS sau HSCSD).

Pentru acest proiect, trebuie să transmitem pachete de date de 100 octeți la intervale de două secunde. Nu este convenabil să folosim un sistem de date care realizează taxarea în funcție de timpul cât este realizată conexiunea, deoarece costurile sunt foarte mari pentru un trafic foarte scăzut.

Utilizarea sistemului GPRS. (necesită un modem GPRS)

După cum va fi prezentat și în Capitolul 4, GPRS are o serie de avantaje pentru transmiterea de date față de transmisia de date pe canale de date GSM. În afară de viteza mare de transmisie (care nu este neapărat necesară pentru acest proiect), un lucru mai important este taxarea, relizată în funcție de volumul de date schimbat între terminale.

În proiect microcontrolerul se conectează la Internet folosind sistemul GPRS. Pentru a putea fi trimise pachete de date spre server, este necesară implementarea unei stive de protocoale, care să realizeze încapsularea datelor.

Soluții pentru crearea stivei de protocoale:

Circuit integrat cu stiva TCP/IP incorporată, (S-7600A);

Stivă TCP/IP implementată în microcontroler;

Utilizarea unui circuit integrat cu stivă UDP/IP;

Implementarea stivei UDP/IP în microcontroler;

Circuitul integrat S-7600A, produs de Seiko Instruments, reprezintă o stivă TCP/IP special concepută pentu acest gen de aplicații. Are 10KB de RAM, interfață pentru comunicația cu un microcontroler și port serial UART.

Acesta îndeplinește următoarele funcții:

se comportă ca un buffer de date;

la transmisie: primește datele care trebuie transmise și le adaugă header-ele specifice și sumele de control. Apoi trimite pachetul pe UART.

la recepție: determină dacă adresa IP și portul sunt cele din setări, calculează și verifică sumele de control și transferă datele din pachet într-un buffer. Semnalizează microcontrolerul că are date noi recepționate.

implementează protocoalele: PPP, IP, TCP, UDP și PAP;

Utilizarea unui microcontroler cu stivă incorporată prezintă dezavantajul că stiva ocupă resursele acestuia.

Dintre acestea stiva TCP/IP este mult mai greu de implementat decât stiva UDP/IP, deoarece procolul TCP necesită un schimb de pachete de ambele părți ale comunicației pentru a se realiza un transfer sigur al datelor. Spre deosebire de acesta, protocolul UDP nu necesită confirmări că pachetele au ajuns la destinație. În cazul nostru nefiind necesară garanția ca pachetele cu datele GPS au ajuns la destinație, deoarece în programul aplicație care afișează poziția pe hartă se pot face aproximări ale pozițiilor care nu au fost recepționate.

Din lista de mai sus de soluții a fost aleasă varianta a patra: implementarea protocolului UDP în microcontroler.

În concluzie, datele sunt trimise în timp real prin Internet, la care dispozitivul mobil se conectează prin modemul GPRS al telefonului mobil. Datele sunt încapsulate în pachete UDP, și trimise la intervale de două secunde către serverul care rulează aplicația care interpretează aceste date.

A doua parte a proiectului constă în transmiterea poziției către un utilizator mobil, prin SMS. Soluții pentru transmiterea datelor prin SMS: (fig. 12)

Figura 12. Soluții posibile pentru transmiterea poziției prin SMS

Folosind protocolul M-BUS implementat pe telefoanele Nokia;

Utilizând protocolul F-BUS de pe telefoanele Nokia;

Utilizarea unui telefon mobil cu modem incorporat cu care se comunică prin comenzi AT;

Dintre acestea cea mai avantajoasă este soluția a treia, deoarece este mult mai ușor de implementat, iar folosirea unui telefon cu modem incorporat prezită avantaje și pentru cealaltă parte a proiectului, și anume transmiterea datelor în timp real prin Internet.

3.3. SMS (Short Message Service)

Mesajul SMS poate avea o lungime maximă de 160 de caractere, unde fiecare caracter este reprezentat pe 7 biți comform cu alfabetului standard pentru SMS (vezi Anexa 1, pagina 65).

Mesajele pe 8 biți (de maxim 140 de caractere), nu pot fi vizualizate, de obicei, pe telefoane ca mesaje text, în schimb ele sunt folosite pentru date (imagini sau tonuri de apel) și pentru setări pentru WAP. Mesajele pe 16 biți (maxim 70 de caractere) sunt folosite pentru mesaje text de folosesc Unicode (UCS2) și pot fi vizualizate pe majoritatea telefoanelor. Pe unele terminale mobile, mesajele pe 16 biți de clasă 0 sunt afișate clipind (SMS de alarmă).

Serviciul SMS folosește un centru de servicii SC (Service Center) care are rolul de a stoca și trimite mesajele.

Tabelul 2 și fig. 13 explică mai bine cum este codat un mesaj text, pe 7 biți. După codare se formează un șir de octeți ce va fi decodificat la recepție.

Tabelul 2.. Codare pe șapte biți

Exemplu:

Exemplu:

Mesajul: „Acesta este un test pentru codarea pe 7 biti !” este codat pe 7 biți, obținându-se un șir de 42 de octeți în loc de 48 (cât are mesajul în cod ASCII). Mesajul codat, exprimat în hexa, este:

C1 71 79 4E 0F 83 CA 73 7A 19 54 77 83 E8 E5 39 1D 04 2F BB E9 F2 3A 68 FC 26 87 E5 E5 30 08 5E 06 DD 40 E2 34 3D 0D 0A 35 14

Codarea pe 7 biți a mesajului „Acest” (fig. 14)

Figura 13. Exemplu de codare pe șapte biți

PDU (Packet Data Unit)

PDU reprezintă modul în care informația digitală este structurată și codată când este trimisă prin interfața radio.

Există mai multe tipuri de PDU-uri implicate în mesageria SMS, dintre care cele mai importante sunt:

SMS-SUBMIT: acest tip de PDU este folosit pentru a trimite mesaje de la terminalul mobil, către centrul de servicii (SC) pentru SMS;

SMS-DELIVER: pentru mesajele primite de terminalul mobil de la SC.

PDU este alcătuit din: adresa centrului de servicii (SCA – Service Center Address) urmat de TPDU (Transport Protocol Data Unit).

Exemplu de PDU:

00 11 00 0A 81 70 44 85 52 27 00 00 FF 04 F4 F2 9C 0E

Formatul PDU este un format hexazecimal codat binar. Aceasta înseamnă ca două cifre din baza hexazecimală reprezintă un octet de date. Așadar acest PDU va fi trimis ca un șir de caractere ASCII, astfel: „0”, „0”, „1”, „1”, „0”, „0”, „0”, „A”, etc…

Interpretarea acestui pachet PDU este prezentată în tabelul 3.:

Tabelul 3. – Componentele pachetului PDU

Protocoale de comunicație seriala suportate de telefoanele NOKIA

Majoritatea telefoanelor mobile Nokia au implementate două protocoale de comunicație serială ce pot fi folosite pentru a conecta echipamentul mobil (telefonul) la un calculator sau un alt dispozitiv extern (în cazul nostru la un microcontroler). Prin aceste protocoale se pot controla aproape toate funcțiile telefonului, cât și pentru actualizarea software-ului intern al mobilului.

În acest proiect seriala este folosită pentru a trimite mesaje SMS de la microcontroler prin telefon către un număr de destinație.

3.4.1. Comparație între M-Bus și F-Bus

M-Bus este un protocol de comunicație seriala pe un singur fir (half-duplex), folosit fie pentru a transmite sau a recepționa date de la telefon. Este relativ încet, deoarece lucrează la viteza de 9600 bps.

Dintre pinii din conectorul telefonului sunt folosiți numai doi, unul pentru date și unul pentru masă.

Caracteristicile serialei sunt:

viteza: 9600 baud;

8 biți de date;

paritate: impară;

un bit de stop;

semnalele DTR/RTS, care trebuie puse pe ‚0’ logic.

F-Bus este un protocol mai nou, de viteză mare care lucrează full-duplex. Acesta folosește un pin pentru transmiterea datelor, unul pentru a recepționa data plus pinul de masă.

F-Bus are urmatoarele caracteristici:

viteza: 115200 baud;

8 biți de date;

fara paritate;

un bit de stop;

semnalul DTR (Data Terminal Ready) trebuie setat pe ‚1’ logic;

semnalul RTS (Request To Send) trebuie setat pe ‚0’ logic;

F-Bus necesită sincronizarea portului serial al telefonului de către PC (sau microcontroler). Acest lucru este realizat trimițând un șir de caractere 55 hexa (‚U’ în ASCII) de 128 de ori. După această inițializare portul este pregătit pentru a trimite/primi pachete (cadre).

Protocoalele Nokia includ o serie de comenzi ce permit utilizatorului să inițieze apeluri, să trimită sau să recepționeze SMS-uri.

Exemplu:

Pachet trimis către Nokia:

Nr. octet: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

Date: 1E 00 0C D1 00 07 00 01 00 03 00 01 60 00 72 D5

Aceasta este o comandă pentru a obține de la telefon versiunea software-ului și a hardware-ului.

Octetul 00: toate pachetele trimise prin cablu încep cu 1E hexa (ID-ul PC-ului). Pentru pachete trimise prin portul infra-roșu, acest prim octet este 1C hexa.

Octetul 01: adresa destinație (00 este ID-ul telefonului).

Octetul 02: adresa sursă. 0C hexa este ID-ul PC-ului.

Octetul 03: comanda, sau tipul mesajului. D1 hexa este comanda pentru a obține versiune sofware-ului și a hardware-ului;

Octeții 04 și 05: lungimea mesajului. În cazul nostru, mesajul este de lungime 7. Octetul 04 este MSB (More Significant Byte), iar 05 este LSB (Less Significant Byte)

Octeții 06-12: de aici începe mesajul efectiv de lungime 7. Deoarece telefoanele Nokia lucrează pe 16 biți și lungimea mesajului este un număr impar este necesară adaugarea unui octet de umplutură (octetul 13) cu valoarea 00. Ultimul octet din șirul de date (octetul 12), reprezintă numărul de secvență. Ultimii trei biți din acest octet este mărit de la 0 la 7 cu fiecare pachet. Aceștia trei trebuie trimiși înapoi în pachetul care confirma comanda.

Octeții 14 și 15: aceștia reprezintă suma de control. Octetul 14 este obținut prin aplicând SAU-EXCLUSIV pentru toți octeții impari, iar octetul 15 este calculat la fel, dar pentru octeții pari.

Pentru a trimite mesaje SMS de la microcontroler a fost preferat protocolul F-Bus, cu toate ca este mai greu de implementat este mai rapid și mai ușor de urmărit.

Majoritatea comunicațiilor dintre telefon și microcontroler au următoarea formă:

microcontrolerul trimite un pachet cu o cerere sau o comandă către telefon;

telefonul trimite o confirmare;

telefonul trimite un răspunus sau o cerere;

microcontrolerul trimite o confirmare;

Exemplu:

Pachet F-Bus de tip SMS-SUBMIT, ce conține date de la GPS (fig. 14)

Figura 14. Pachet SMS-SUBMIT trimis de la microcontroler la telefon:

lungime – lungimea mesajului de la următorul octet până la numărul de secvență

SMSC – (Short Message Service Center) centrul de mesagerie; Numărul SMSC pentru cazul nostru este: +40 72 20 06 00 0 (trebuie trimis sub forma 40270260000F).

Numărul destinatar, pentru acest exemplu este: 07 44 58 25 72 (trimis sub forma 70 44 85 52 27)

3.5. Implementare SMS

Pentru a trimite un SMS cu datele obținute de la GPS, sunt realizate etapele din figura 15.

Asteaptă apel

Când telefonul este apelat, modemul acestuia trimite pe serială, textul „RING”. Rutina „asteaptă apel” are rolul de a detecta dacă între mesajele trimise de telefon către microcontroler se găsește și acest text, „RING”.

Memorează numărul apelantului

Deoarece a fost folosită comanda „AT+CLIP=1” (CLIP = Calling Line Identification) la inițializarea modemului, în momentul în care telefonul primește un apel, pe langă mesajul „RING” acesta trimite și nurmărul de telefon al apelantului în format ASCII, într-o frază de genul:

RING +CLIP: "0722839645",161

Pentru extragerea numărului, rutina așteaptă „RING” după care așteaptă caracterul ‚ ” ’. Următoarele zece caractere reprezintă numărul apelant. Acesta este memorat într-un vector de 10 octeți.

Închide

Comanda utilizată pentru a întrerupe o un apel pe un canal de voce, este „AT+CHUP” (Hang-Up).

Formeaza mesajul de la GPS este prezentată în Cap. 2 GPS.

Trimite SMS

În principiu, la această etapă trebuie efectuate două operații: formare PDU și trimitere PDU. (pentru rutina trimiteSMS() vezi anexa 2, pagina 81)

3.5.1. Formare PDU

În figura 16 sunt prezentate două variante de a trimite un SMS de la microcontroler folosind un telefon mobil Nokia, sau un telefon Sony-Ericsson.

Figura 16. Încapsularea datelor în PDU

Pentru a folosi cât mai puțin RAM, am folosit un PDU șablon, în care am modificat doar câmpurile ce conțin mesajul și numărul destinatar (câmpurile reprezentate cu verde în figura 16).

Șablonul PDU folosit este:

const unsigned char pduSMS[20]={"0011000A81 0000FF7D"};

semnificațiile valorilor din acest vector sunt explicate în Figura 17 și tabelul 3 (Componentele pachetului PDU).

Figura 17. Un exemplu de PDU format de funcția trimiteSMS()

Microcontrolerul trimite telefonului comanda AT pentru SMS-SUBMIT și anume „AT+CMGS=125” (125 e lungimea PDU). Așteaptă răspuns de la telefon (dovadă ca e gata să primească PDU).

În ultima etapă, este trimis pachetul PDU. Microcontrolerul trimite pe rând:

primii 10 octeți din pduSMS[],

vectorul ce conține numărul apelant,

următorii 8 octeți din pduSMS[]

în final mesajul ce trebuie trimis codat pe 7 biți exprimat în hexazecimal codat binar.

3.5.2. Rutina de compresie pe 7 biți și transmisie hexazecimal codat binar

Microcontrolerul are o memorie RAM destul de mică, de 368 octeți. Pentru a putea comprima mesajul este nevoie să se creeza două buffer-e de memorie, unul care să conțină mesajul ce trebuie comprimat și unul pentru a păstra șirul de octeți rezultați în urma comprimării.

Mesajul trimis prin SMS are lungimea de 123 de caractere și este de forma:

„Ora: 20:00:00 Latitudine: 45gr 26.094'N Longitudine: 025gr 1.476'E Viteza: 054.0 noduri Unghi: 060.3gr Data: 09.05.'05”

Șirul de octeți obținut după compresia acestuia pe 7 biți, are lungimea de 108 de octeți.

Dacă am rezerva câte o zonă din memoria RAM pentru fiecare dintre aceste șiruri (mesajul text și mesajul codat), am ocupa:

123 octeți + 108 octeți = 231 octeți

aceștia reprezentând 62% din memoria RAM disponibilă, lucru neconvenabil, deoarece nu ar mai rămâne destulă memorie liberă pentru implementarea protocoalelor de Internet, folosite pentru transmiterea pachetelor în timp real, implementare ce este destul de costisitoare în privința memoriei utilizate.

Este prezentată în continuare, soluția găsită pentru minimizarea utilizării resurselor RAM

În primul rând, se încearcă stocarea a cat mai multor date în ROM (deoarece PIC16F876 dispune de 8KB de memorie ROM). De aceea din mesajul SMS, câmpurile care nu-și modifică valoarea în program sunt declarate ca și constante. Din întregul text „Ora: 20:00:00 Latitudine: 45gr 26.094'N Longitudine: 025gr 1.476'E Viteza: 054.0 noduri Unghi: 060.3gr Data: 09.05.'05”, sunt definite o serie de șiruri, declarate constante, care vor fi stocate în ROM. Acestea sunt:

const unsigned char ora[]={"Ora: "};

const unsigned char latitudine[]={" Latitudine: "};

const unsigned char longitudine[]={" Longitudine: "};

const unsigned char viteza[]={" Viteza: "};

const unsigned char unghi[]={" Unghi: "};

const unsigned char data[]={" Data: "};

Din start, din cele 123 de caractere ale mesajului, 60 nu mai solicită memorie RAM. Bufferul utilizat pentru SMS, încă păstrat în RAM, este de 73 octeți și are forma:

bank1 unsigned char buffer[]={"20:00:00-45gr 26.094'N-025gr 31.476'E-054.0 noduri-060.3gr-09.05.'05 -"};

Al doilea pas este de a reduce buffer-ul ce memorează mesajul după codare.

Se observă că folosind codarea pe 7 biți, un text cu lungimea de 8 octeți va fi comprimat în 7 octeți: 8 caractere x 7 biți = 7 octeți x 8 biți;

Principiul este să luăm grupuri de câte 8 octeți din mesaj, pe care le codăm și obținem șiruri de 7 octeți. Acest șir de 7 octeți este trimis octet cu octet, imediat după ce a fost format fiecare octet al șirului. De aceea nu este nevoie să fie format încă un buffer care să păstreze acești 7 octeți. Datele trebuie să fie transmise în hexazecimal codat binar (de ecemplu: 0xA5 este trimis ca un șir de două caractere ASCII, ‚A’ și ‚5’).

Pentru a simplifica algoritmul de comprimare pe 7 biți al mesajului text, am folosit un mesaj de lungime multiplu de 8. Pentru a obține acest lucru am adugat spații la sfarșitul mesajului. Astfel, din 123 caractere s-a ajuns la lungimea de 128.

Algoritmul folosit pentru comprimarea pe 7 biți și transmisiea în hexazecimal codat binar este prezentat în Figura 18. (pentru programul în C vezi anexa 2, pagina 81).

Soluția prezentată utilizează: 73 octeți (mesaj) + 8 octeți (buffer) = 81 octeți, care reprezintă 22% din memoria RAM a microcontrolerului, aproape de 3 ori mai puțin decât în primul caz.

Figura 18. Rutina de comprimare pe 7 biți și transmisie hexazecimal codat binar

Exemplu:

Codarea pe 7 biți a textului „Test” folosind rutina implementată în microcontroler:

Codurile ASCII ale caracterelor ce apar în text sunt:

„T” = 0x54 = 01010100

„e” = 0x65 = 01100101

„s” = 0x73 = 01110011

„t” = 0x74 = 01110100

Octetul 1:

J = 0

x = „T’ = 01010100

y = „e” = 01100101

x >>= 0 => x = 01010100

y <<= (7-0) => y = 10000000

octet_codat = x XOR y => octet_codat = 11010100 = 0xD4

A = octet_codat>>4 => A = 00001101 = 0x0D

B = octet_codat&0x0F => B = 00000100 = 0x04

A<=9? NU => C = 0x0D + 0x37 = 0x44 = „D” (ASCII)

trimite caracterul „D”

B<=9? DA => C = 0x04 + 0x30 = 0x34 = „4” (ASCII)

trimite caracterul „4”

Octetul 2:

J = 1

X = „e” = 01100101

Y = „s” = 01110011

x>>=1 => x = 00110010

y<<=6 => y = 11000000

octet_codat = x XOR y = 11110010 = 0xF2

trimite „F”

trimite „2”

Octetul 3:

J = 2

X = „s” = 01110011

Y = „t” = 01110100

x>>=2 = 00011100

y<<=5 = 10000000

octet_codat = x XOR y = 10011100 = 0x9C

trimite „9”

trimite „C”

etc…

Exemplu:

Un exemplu concret de mesaj format de la GPS, împachetat în PDU și trimis prin SMS folosind două tipuri diferite de telefoane (la Nokia prin F-Bus, și la Sony Ericsson prin comenzi AT) este prezentat în figura 19.

Figura 19 Exemple de încapsulare a datelor în PDU

Exemplu:

Comunicație între microcontroler și modemul telefonului (SE T68i), la trimiterea unui SMS ce conține textul: „test”.

În ASCII:

WRITE AT+CMGS=17.

READ ..> .

WRITE 0011000A8170448552270000FF04F4F29C0E..

READ ..+CMGS: 80..

READ ..OK..

În hexa:

WRITE 41 54 2B 43 4D 47 53 3D 31 37 0D

READ 0D 0A 3E 20 00

WRITE 30 30 31 31 30 30 30 41 38 31 37 30 34 34 38 35 35 32 32 37 30 30 30 30 46 46 30 34 46 34 46 32 39 43 30 45 1A 0D

READ 0D 0A 2B 43 4D 47 53 3A 20 39 37 0D 0A

READ 0D 0A 4F 4B 0D 0A

Cap. 4 GPRS (General Packet Radio Service)

4.1.Generalități despre GPRS

GPRS oferă un serviciu suplimentar de comunicație prin care se îmbunătățește substanțial și se simplifică accesul utilizatorilor mobili la rețele de transmisii de date în pachete, precum rețeaua Internet. El constă în aplicarea aceleiași tehnici de transmisii de date în pachete și pe canalele radio GSM, motiv pentru care datele utilizatorilor mobili pot fi transmise direct către rețelele externe de date. Transmisiile în pachete pe calea radio facilitează întrețeserea mai multor comunicații pe același. canal radio și sporesc, astfel, efîciența de utilizare a spectrului. Timpul de acces și viteza de transmisie sporesc simțitor.

Astfel, dacă în sistemele GSM timpul de acces este de câteva secunde și viteza maximă este limitată la 9,6 Kb/s, în sistemele GPRS timpul de acces este mai mic de o secundă, iar viteza maximă de transmisie este de peste 150 Kb/s. în plus tarifarea comunicațiilor se face în funcție de cantitatea de informație vehiculată de utilizatorul mobil și nu în funcție de timpul de ocupare a canalului radio. Aceast tip de tarifare este avantajos pentru comunicațiile intermitente de genul accesului la rețeaua Internet în care utilizatorul este conectat la rețea o perioadă mai mare de timp, dar transmite date în intervale de timp mici cu pauze lungi între două transmisii.

în concluzie, serviciul GPRS crește eficiența de utilizare a resurselor radio, simplifică accesul utilizatorilor mobili la rețelele fixe de transmisii date, asigură timp mic de acces și viteză mare de transmisie și permite utilizatorului să achite costurile activității efective de comunicație și nu pe cele mult mai mari asociate timpului de ocupare a canalului de comunicație.

4.2. Arhitectura sistemului GPRS

Două principii au stat la baza redefinirii arhitecturii de rețea în vederea implementării funcțiilor GPRS: separarea netă dintre entitățile GPRS și entitățile radio (BTS și BSC) ale GSM și neintroducerea de modificări în structura și funcțiile MSC. Primul principiu asigură independența funcționării entităților GPRS în raport cu interfața radio a sistemului și, în acest fel, posibilitatea implementării funcțiilor GPRS și în alte sisteme celulare în afara celor GSM. Al doilea princpiu este rezultatul unor constrângeri economice, MSC fiind entitatea cea mai complexă și mai scumpă dintr-un sistem GSM. Nefîind necesare modificări în structura și funcțiile acestuia costul implementării fancțiilor GPRS este mai mic.

Pentru realizarea funcțiilor specifice GPRS în arhitectura clasicâ a unui sistem GSM a fost introdusă o nouă clasă de noduri de rețea numite noduri suport GPRS (GSN – GPRS Support Node). Aceste noduri sunt responsabile de preluarea pachetelor de date de la stațiile mobile, rutarea acestora prin rețea și livrarea către rețelele externe cu transmisii de date în pachete. Arhitectura standard a unui sistem GSM ce oferă și servicii GPRS (denumit, în continuare, sistem sau rețea GPRS) este prezentată în figura 20.

– Un nod GSN server (SGSN – Server GSN) este responsabil de livrarea pachetelor de date de la și către stațiile mobile din interiorul ariei sale de responsabilitate. Sarcinile lui includ rutarea pachetelor și transferul comunicațiilor, managementul mobilității (conectare/deconectare și localizare) și funcțiile de taxare și de autentificare. Registrul de locație al unui nod SGSN înmagazinează informații despre localizarea și profilul tuturor utilizatorilor GPRS înregistrați în respectivul SGSN.

Figura 20 – Arhitectura standard a unei rețele GPRS

Un nod GSNpoartă (GGSN – Gateway GSN) este o interfață între magistrala rețelei GPRS și rețelele de pachete de date exteme. El convertește pachetele GPRS ce vin de la SGSN în formatul corespunzător protocolului rețelei de date cu transmisii în pachete (PDN) și le transmite rețelei corespunzătoare. Pe de altă parte, adresele PDN ale pachetelor de date ce sosesc sunt convertite în adrese GSM ale utilizatorilor destinatari. Pachetele readresate sunt transmise către nodurile SGSN corespunzatoare. în acest scop, nodul GGSN înmagazinează în propriul registru de locație numărul nodului SGSN curent pentru toți utilizatorii din rețeaua GPRS, precum și profilurile lor. Deasemenea nodul GGSN realizează funcțiile de autentificare și taxare. în general, există o relație de "mai mulți la mai mulți" (many-to-many) între nodurile SGSN și nodurile GGSN: un nod GGSN este interfața cu rețelele externe de date pentru mai multe noduri SGSN, iar un nod SGSN își poate ruta pachetele sale spre diferite noduri GGSN pentru a putea ajunge la diferite rețele externe de date.

Figura 20 prezintă, deasemenea, interfețele dintre noile noduri ale rețelei și rețeaua GSM clasică. Astfel, interfața Gb conectează unitățile BSC cu nodul SGSN. Prin intermediul interfețelor Gp și Gn sunt transmise datele utilizatorilor și cele de semnalizare între nodurile GSN. Dacă nodurile SGSN și GGSN sunt localizate în aceeași rețea GPRS se folosește interfața Gn, iar dacă acestea se află în rețele GPRS diferite se folosește interfața Gp. Toate nodurile GSN sunt interconectate prin intermediul unei magistrale GPRS bazate pe protocolul IP. în interiorul acestei magistrale, nodurile GSN încapsulează pachetele de date și le transmit folosind protocolul de tunelare GPRS (GTP – GPRS tunneling protocol).

4.3. Clase de unități mobile GPRS

Comunicațiile vocale pot fi susținute de orice unitate mobilă capabilă să realizeze comunicații GPRS, însă în funcție de modul în care cele două funcții se pot combina se definesc trei clase de stații mobile:

stații mobile de clasă A ce suportă comunicații vocale simultan cu servicii GPRS;

stații mobile de clasă B ce se pot înregistra în rețea atât pentru servicii GPRS, cât și pentru servicii GSM, dar nu pot oferi decât un singur tip de comunicație la un moment dat;

stații mobile de clasă C ce se pot înregistra fie pentru servicii GPRS, fie pentru servicii GSM convenționale, dar nu simultan. O excepție o constituie mesajele scurte SMS, care pot fi recepționate și transmise fie ca serviciu GSM, fie ca serviciu GPRS indiferent de tipul înregistrării.

4.4. Context PDP

O unitate mobilă poate efectua o transmisie de date în pachete numai după parcurgerea unei proceduri de activare a acestei funcționalități denumită activare context PDP (PDP – Packet Data Protocol). în mesajul de activare transmis de unitatea mobilă trebuie să specifice identitatea sa temporară, adresa nodului SGSN prin care comunică, tipul rețelei externe de date cu care comunică, adresa nodului GGSN prin care se face accesul către rețeaua externă, calitatea dorită (QoS) a serviciului de comunicație precum și unii parametri solicitați de protocul de comunicație utilizat de rețeaua externă. Toate aceste date formează contextul PDP al unității mobile. în el se poate include și adresa unității mobile dacă aceasta este alocată static. în cazul alocării dinamice a adreselor, ea va primi o nouă adresă la fiecare activare a contextului PDP. Din contextul PDP poate lipsi identitatea temporară a unității mobile dacă acesta se referă la un serviciu nepersonalizat (acces anonim).

în funcție de drepturile pe care unitatea mobilă le are în rețea și de setările rețelei ea poate activa 0, 1 sau mai multe contexte PDP, câte unul pentru fiecare din rețelele exteme de date cu care comunică și tipul de serviciu pe care îl solicită.

După autentificare și verificarea – onformității solicitării cu drepturile în rețea ale unității mobile nodul SGSN confirmă activarea contextului PDP, memorează acestă stare și transmite informația nodului GGSN corespunzător.

Activarea unui context PDP se face numai la inițiativa unității mobile, însă rețeaua îi poate solicita parcurgerea acestei proceduri atunci când unitatea mobilă este apelată de către o rețea externă.

4.5. Conlucrarea cu rețelele IP

GPRS suportă ambele sisteme de adresare din rețeua Intemet (IPv4 și, respectiv, IPv6). Din punctul de vedere al rețelelor IP exteme, rețeaua GPRS arată ca orice altă subrețea IP, iar nodurile GGSN sunt echivalente unui router IP obișnuit. în figura 21 se prezintă un exemplu de conectare a unei rețele GPRS la Internet.

Un utilizator GPRS înregistrat care vrea să schimbe pachete de date cu rețelele IP obține o adresă IP din cele aflate în spațiul adreselor operatorului GPRS. Pentru a suporta un număr mai mare de utilizatori, este esențială folosirea alocării dinamice a adreselor IP. De aceea, este instalat un server DHCP (Dynamic Host Configuration Protocol). Corespondența dintre adresele IP și cele GPRS este realizată de nodul GGSN pe baza contextului PDP activat de utilizator. Poate fi folosit și un server al denumirii domeniilor (DNS – Domain Name Server) controlat de operatorul GPRS sau de către rețeaua IP pentru realizarea corespondenței dintre adresele IP externe și cele inteme. Pentru menținerea unei viteze mari de transmisie rutarea pachetelor IP se face prin tunelare prin magistrala intra-GPRS folosind un protocol specific. Tunelarea înseamnă, în esențâ, că nodul GGSN atașează fiecărui pachet adresa de destinație și calea de rutare, fară a verifica integritatea datelor incluse. Cu această configurație, rețeaua GPRS poate fi privită ca o extensie radio a rețelei Intemet până la o unitate mobilă sau un computer mobil.

Pentru a evidenția aspectele de bază asociate stabilirii unei transmisii de date cu comutare de pachete între un untilizator mobil GPRS și un utilizator din rețeaua Internet să considerăm exemplul practic în care utilizatorul MS aflat în rețeaua GPRS1 din figura 21 dorește să transfere un volum de date din calculatorul PC aflat într-o rețea locală LAN conectată la Internet. Presupunem.că utilizatorul MS este înregistrat în rețeaua GPRS2 și are drept de roaming în rețeaua GPRS1.

Pentru extragerea datelor utilizatorul MS își activează contextul PDP ce îi permite accesarea rețelei Internet prin transmiterea unui mesaj specific către nodul SGSN2 în zona căruia se află. Acesta verifică drepturile de roaming și de comunicație ale MS prin schimb de informații cu nodul poartă BG2 de interconectare cu rețeaua GPRSl și transmite nodului GGSN2 de interconectare cu rețeaua Internet cererea de activare a contextului PDP de către MS. Dacă alocarea de adrese IP se face dinamic nodul GGSN2 alocă o adresă utilizatorului MS și memorează contextul PDP activat.

Figura 21 – Exemplu de rutare a unei transmisii GPRS

Cererea de transmisii de date este adresată de către utilizatorul MS nodului SGSN2, care o retransmite nodului GGSN2. Acesta retransmite cererea către rețeaua Internet după ce înlocuiește adresa internă a utilizatorului MS cu cea sub care el este recunoscut în rețeaua Internet. Pe baza adresei de destinație solicitarea ajunge la calculatorul PC care furnizează șirul de pachete de date solicitat.

Deoarece utilizatorul MS este cunoscut în rețeaua Internet ca facând parte din rețeaua GPRSl, pachetele de date sunt dirijate către aceasta prin nodul poartă GGSNl și, pe baza informației privind locația curentă a utilizatorului MS, sunt redirijate prin nodul poartă BGl, magistrala inter-GPRS și nodul poartă BG2 către nodul SGSN2, iar, de aici, către utilizatorul MS. De notat că între nodurile GGSNl și SGSN2 transmisia se face prin tunelare, deci cu viteză maximă posibilă.

Cap. 5 Comenzi AT

Comenzile AT sunt folosite pentru a schimba informații cu telefonul sau modemul incorporat în acesta.

Cu acestea se poate realiza:

configurarea telefonului sau a modemului pentru a stabili o conexiune cu un dispozitiv extern;

obținerea de informații cu privire la configurația sau starea operațională a telefonului sau a modemului

testarea parametrilor valizi pentru o comandă AT;

5.1. Comenzi AT folosite pentru inițializarea modemului

AT (Attention)

Comanda are rolul de a verifica, dacă a fost stabilită o legatură de comunicație între telefon și un alt dispozitiv. Deasemenea determină prezența telefonului.

Comanda de execuție: AT

AT&F

Această comandă resetează parametrii la valorile din fabrică.

Comanda de execuție: AT&F

AT+CMEE

Rolul ei este de a raporta erorile apărute în echipamentul mobil.

Aceasta cere echipamentului mobil un control asupra erorilor. Comanda activează sau dezactivează rolul codului de eroare „+CME ERROR” de a indica o eroare legată de funcționarea ME (Mobile Equipment). Când este activată, codul de eroare generat va fi „+CME ERROR” , dacă eroarea este legată de ME, în locul codului general folosit, „ERROR”. Astfel, „ERROR” va fi trimis numai când eroarea este produsă de sintaxa greșită, parametri invalizi sau de funcționarea legăturii cu dispozitivul extern.

Comanda de setare: AT+CMEE=[<n>]

Comanda de citire: AT+CMEE? – afișează setarea <n> curentă.

Comanda de test: AT+CMEE=? – afișează dacă această comanda este implementată.

Lista valorilor <n> acceptate:

Parametrul <n> poate lua valorile:

– 0 – dezactivează codul de eroare „+CME ERROR”. Folosește „ERROR” în schimb;

– 1 – activează „+CME ERROR” și trimite codul erorii sub formă numerică;

– 2 – activează „+CME ERROR” și trimite codul erorii în text clar (verbose);

Comanda este opțională pentru acest proiect.

5.2. Comenzi AT folosite pentru modul SMS

AT+CLIP

Aceasta cere identificarea abonatului apelant.

Comanda de setare: AT+CLIP=<n>

Comanda de citire: AT+CLIP? – afișează setarea curentă a parametrilor <n>.

Comanda de test: AT+CLIP=? – afișează dacă această comanda este implementată.

Lista valorilor <n> acceptate:

0 – opțiune dezactivată;

1 – opțiune activată;

Comanda este folosită pentru a obține numărul apelant. Acesta va fi introdus în PDU ca destinatar al SMS-ului ce conține datele de la modulul GPS.

5. AT+CHUP

Comanda închide un apel în desfașurare.

Comanda de execuție: AT+CHUP

Pentru proiect, cu această comandă, microcontrolerul încheie apelul primit de la utilizator, după ce a obținut numărul de pe care a fost apelat.

6. AT+CMGS

Comanda are rolul de a trimite un mesaj (SMS) de la echipamentul terminal TE (Terminal Equipment) spre rețea (SMS-SUBMIT). Este returnat parametrul <tr> dacă operația a fost îndeplinită cu succes. Opțional, este returnat <ackpdu>. Dacă apare o eroare este returnat mesajul de eroare „+CMS+ERROR”.

Comanda de execuție: AT+CMGS=<lungime> <pdu> <ctrl-z/ESC>

Răspunsul: +CMGS: <mr>, [<ackpdu>]

Comanda de test: AT+CMGS=? – arată dacă aceasă comandă este implementată;

Parametrii folosiți:

<lungime> – lungimea pachetului TPDU (Transfer Protocol Data Unit)

<pdu> – adresa SC-ului (Service Center) folosit (defint în GSM 04.11), urmată de TPDU (definit în GSM 03.40), în format hexazecimal. Fiecare octet trebuie convertit în două caractere ASCII (de exemplu 0xFE este trimis ca și caracterele ‚F’ și ‚E’ in cod ASCII).

<mr> – TP-MR (TP-Message Reference), definit în GSM 03.40

<ackpdu> – RP-User Data element – defint în GSM 04.11

5.3. Comenzi AT folosite pentru modul „timp real” (GPRS)

Comenzile de baza pentru GPRS încep cu „+CG”.

7. AT+CGDCONT

Definește parametrii pentru contextul PDP (Packet Data Protocol) indetificat prin parametrul <cid>. Acest context PDP trebuie să fie activat pentru a face posibil transferul de date. Aceasta înseamnă deasemenea ca telefonului mobil i se atribuie o adresă IP.

Comanda de setare: AT+CDGCONT=[<cid>[,<pdp_type>[,<APN>[,<pdp_addr>[,<d_comp>

[,<h_comp>[,<pd1>[,…[,<pdN>]]]]]]]]]

Parametrii:

<cid> – este un număr ce definește contextul PDP. Este un parametru propriu interfeței dintre telefon și dispozitivul extern cu care comunică acesta.

<pdp_type> – poate fi „X25”, „IP”, „OSPIH” sau „PPP”

APN (Access Point Name) este un nod de legătură între operatorul de telefonie mobilă și o rețea externă bazată pe adrese IP.

<d_comp> – activează/dezactivează compresia de date;

<h_comp> – activează/dezactivează compresia header-ului;

Comanda este utilizată în acest proiect sub forma:

AT+CGDCONT=1,"ip","internet”,"",0,0

Așadar, <pdp_type> folosit este „ip”, <APN> este „internet”, <d_comp> și <h_comp> sunt 0.

8. ATD (Dial)

Inițiaza un apel, care poate fi de date, fax sau voce. Numărul apelat poate fi trecut în linia de comandă sau poate fi luat din memoria telefonului, de pe SIM sau din lista de apeluri recente.

Comanda de execuție:

ATD[<nr_apelat>][;]

ATD>ME<index>[;] – apeleaza numărul memorat în telefon la poziția <index>.

ATD>SIM<index>[;] – apeleaza numărul memorat în SIM la poziția <index>.

ATD>LD<index>[;] – apeleaza numărul memorat în lista de numere recent apelate (Last Dialed Number) la poziția <index>.

ATDL – reapelează ultimul număr.

Pentru Serverul ISP Orange folosit în acest proiect se folosește numărul „*99#”, în comanda: ATD*99#. După inițierea apelului nu mai pot fi trimise comenzi AT către telefon pentru configurarea legăturii de date prin GPRS.

9. +++ATH

Comanda este utilizată pentru a încheia o legătură de date. Acesta este trimisa telefonului când se dorește schimbarea modului de operare de la timp real la SMS. Șirul „+++” este o secvență escape.

La fiecare dintre comenzile enumerate până acum, modemul telefonului răspunde returnând textul „OK”. În caz de eroare modemul trimite către microcontroler „ERROR”. O excepție face comanda ATD care în cazul în care este îndeplinită cu succes, returnează „CONNECT”.

Comenzile sunt memorate în ROM sub forma unui vector, caracterul „-” având rolul de delimitator:

const unsigned char comAT[]={"AT-AT&F-ATV1E0S0=0&D2&C1-AT+CLIP=1-AT+CGDCONT=1,\"ip\",\"internet\",\"\",0,0-"};

Exemplu: comunicație Microcontroler – Telefon mobil, folosind comenzile AT:

AT

OK

AT&F

&F

OK

ATV1E0S0=0&D2&C1V1E0S0=0&D2&C1

OK

AT+CLIP=1

OK

AT+CGDCONT=1,"ip","internet","",0,0

OK

+++ATH

OK

(vezi anexa 2, pagina 74, pentru rutina de trimitere a comenzilor AT)

Cap. 6 Protocoale utilizate în Internet

Cele mai importante protocoale utilizate în Internet sunt:

6.1. PPP (Point-to-Point Protocol)

PPP a fost creat ca un protocol de încapsulare pentru a transporta pachete în rețele bazate pe IP, în legături punct-la-punct. PPP include deasemenea un standard pentru atribuirea și gestionarea adreselor IP, încapsulări pentru legături asincrone (start/stop) și legături sincrone orientate pe bit, multiplexarea protocoalelor de rețea, configurarea legăturii, testarea calității legăturii, detecția erorilor și opțional negocieri pentru adresele de la nivelul legătura de date și negocieri pentru compresie de date.

Componentele PPP

PPP furnizeaza o metodă de transmitere a datagramelor printr-o legătură punct-la-punct. El conține trei componente principale:

o metodă de a încapsula datagrame transportate pe o legătură serială. PPP are la bază protocolul HDLC (High-Level Data Link Control) .

LCP, care este extensibil, folosit pentru a stabili, configura și testa conexiunea de la nivelul legătură de date.

O familie de protocoale NCP (Network Control Protocol), folosit pentru a negocia parametri, configurații și alte facilități ale protocoalelor de la nivelul rețea. În plus, pe lângă IP acesta poate suporta și alte protocoale, cum ar fi IPX (Novell's Internetwork Packet Exchange) sau DECnet.

Pachete PPP

Formatul unui pachet este prezent în figura 22.

Figura 22. Câmpurile componente ale unui pachet UDP

Câmpurile ce alcătuiesc un pachet sunt:

Flag – un singur octet care indică începutul sau sfârșitul unui pachet. Acesta constă din secvența binară 01111110 (7E în hexa).

Adresă – un octet ce conține valoarea binară 11111111 (FF în hexa), valoare standard. PPP nu atribuie alte adrese individuale.

Control – un octet cu secvența 00000011 (03 în hexa) care semnifică faptul că datele utilizatorului încapsulate în acest pachet nu țin cont de numărul de secvență.

Protocol – doi octeți ce indică protocolul încapsulat în câmpul de date al pachetului. Exemple de valori utilizate în acest proiect:

8021 – IPCP (Internet Protocol Control Protocol)

c021 – LCP (Link Control Protocol)

c023 – PAP (Password Authentication Protocol)

c223 – CHAP (Challenge Handshake Authentication Protocol)

Cod – acest octet reprezintă tipul pachetului. Valorile acestui câmp au semnificațiile

Configure-Request

Configure-Ack

Configure-Nak

Configure-Reject

Terminate-Request

Terminate-Ack

Code-Reject

Protocol-Reject

Echo-Request

Echo-Reply

Discard-Request

ID – identificatorul pachetului. Un număr prin care se face referire la pachetul respectiv. De exemplu dacă se primește un NAK cu ID=12, înseamnă ca acesta este venit ca răspuns pentru un pachet trimis anterior cu ID-ul 12.

Lungime – lungimea câmpului „Date” incluzând cei doi octeți care reprezintă campul „Lungime”.

Date – zero sau mai mulți octeți ce conțin datagrama protocolului specificat în câmpul „Protocol”.

FCS (Frame Check Sequence) – sumă de control de tip CRC pe 16 biți.

6.2. LCP (Link-Control Protocol)

LCP poate negocia modificări la structura standard a pachetelor PPP, însă aceste pachete modificate vor fi ușor de recunoscut.

Înainte de a putea trimite datagrame (de exemplu pachete UDP/IP), LCP trebuie să realizeze o conexiune și să negocieze parametrii acesteia. Aceasta etapă este încheiată când au fost trimise și recepționate confirmări din ambele părți.

Urmează o fază opțională de determinare a calității legăturii, după care se poate trece la etapa de negocieri în cadrul protocolului NCP, de la nivelul rețea.

În final, legătura poate fi întreruptă fie la cererea utilizatorului fie datorită unei întreruperi la nivelul fizic, cum ar fi pierderea purtătoarei sau expirarea perioadei maxime de inactivitate.

Există trei clase de pachete LCP:

pachete pentru stabilirea și configurarea legăturii;

pachete pentru terminarea unei legături de date;

pachete utilizate pentru menținerea și depanarea legăturii;

În prima etapă sunt schimbate pachete LCP ce conțin opțiunile ce trebuie negociate.

Pachetele LCP sunt pachete PPP de forma celui prezentat mai sus, ce în câmpul de date conțin o serie de opțiuni, de forma (fig. 23):

Figura 23. Opțiuni LCP

Tip – un octet ce indică tipul opțiunii ce se dorește a se configura. Opțiunile principale:

0 rezervat;

1 dimensiunea maximă a pachetului (Maximum-Receive-Unit);

2 harta caracterelor escapate (Async-Control-Character-Map);

3 protocolul folosit pentru autentificare (Authentication-Protocol);

4 calitatea legăturii (Quality-Protocol);

5 număr magic (Magic-Number);

7 compresia câmpului „Protocol” (Protocol-Field-Compression);

8 compresia câmpului „Adresă” (Address-and-Control-Field-Compression);

Lungime – lungimea, pe 8 biți, a opțiunii incluzând câmpurile „Tip”, „Lungime” și „Date”;

Date – conține informații specifice opțiunii;

Exemplu:

Pachet LCP de tip cerere pentru negocierea opțiunilor 2, 3, 5, 7 și 8 (fig. 24):

Figura 24. Exemplu de pachet LCP

Opțiunile folosite la nogocierea PPP în acest proiect sunt:

– opțiunea 2 – harta caracterelor escapate (Async-Control-Character-Map);

Câmpul „Date” al acestei opțiuni este alcătuit din patru octeți, adică 32 de biți. Fiecare bit corespunde unui caracter de control ASCII. Bitul cel mai semnificativ corespunde caracterului cu codul ASCII, 31, iar cel mai puțin semnificativ bit corespunde caracterului 0. Dacă un bit are valoarea ‚1’, caracterul corespunzător lui, trebuie trimis ca o secvență escape.

Pot fi escapate chiar și caracterele care nu au nevoie de acest lucru deoarece nu fac parte din caracterele de control. Pentru a simplifica implementarea software, toate caracterele sunt trimise în secvențe escape.

Secveța escape

Aceasta este alcatuită din doi octeți: caracterul „Control Escape” cu valoarea 7D hexa urmat de rezultatul operației logice SAU-EXCLUSIV dintre caracterul ce trebuie escapat și caracteru 02.

Exemplu:

Caracterul care trebuie escapat este 03. 0x03 XOR 0x20 = 0x23

0x03

XOR

0x20

Rezultatul este:

0x23

Așadar caracterul 0x03 va fi trimis ca un șir de doi octeți: 0x7d și 0x03.

Alte exemple:

0x7e este codat ca 0x7d, 0x5e. (Flag Sequence)

0x7d este codat ca 0x7d, 0x5d. (Control Escape)

0x03 este codat ca 0x7d, 0x23. (ETX)

0x11 este codat ca 0x7d, 0x31. (XON)

0x13 este codat ca 0x7d, 0x33. (XOFF)

0x91 este codat ca 0x7d, 0xb1. (XON cu paritate)

0x93 este codat ca 0x7d, 0xb3. (XOFF cu paritate)

– opțiunea 7 – compresia câmpului „Protocol” (Protocol-Field-Compression);

Aceasta are ca rezultat transmisie pachetelor PPP fără cei doi octeți ai câmpului „Protocol”. Opțiunea nu are parametri.

– opțiunea 8 – compresia câmpului „Adresă” (Address-and-Control-Field-Compression);

Opțiunea are ca rezultat transmisie pachetelor PPP fără cei doi octeți ai câmpulurilor „Adresă” și „Control” (0xFF și 0x03). Nici această opțiune nu are parametri.

Pentru acest proiect, nu a fost necesară negocierea celorlalte opțiuni.

După încheierea negocierilor pentru aceste opțiuni, etapa LCP este închiată.

6.3. Protocoale PPP folosite pentru autentificare

Există două protocoale principale folosite pentru autentificarea unui utilizator, PAP (Password Authentication Protocol) și CHAP (Challange-Handshake Authentication Protocol).

Acestea sunt negociate în etapa LCP folosind opțiunea 3. Șirul de octeți pentru a forma opțiunii este prezentat în figura 25.

:

Figura 25. Opțiuni PAP și CHAP

6.3.1. PAP (Password Authentication Protocol)

PAP nu este o metodă puternică pentru autentificare, deoarece parolele sunt trimise în text clar, fără protecție împotriva atacurilor. Terminalul nu poate controla frecvența și numărul de încercări de autentificare pentru un utilizator.

6.3.2. CHAP (Challange-Handshake Authentication Protocol)

Autentificarea folosind CHAP este realizată imediat după setarea inițială a legăturii, și poate fi repetată oricând după ce legătura a fost stabilită. Acest protocol previne încercarile repetate de autentificare și a atacurilor.

Această metodă depinde de un „secret” cunoscut numai de cele două terminale implicate în procedura de autentificare.

6.4. IPCP (IP Control Protocol)

Acest protocol este responsabil pentru configurarea, activarea și dezactivarea modulelor protocolului IP la ambele capete ale legăturii punct-la-punct. IPCP folosește același mecanism de schimb de pachete ca și LCP. Pachetele IPCP nu pot fi schimbate între terminale înainte ca PPP să intre în faza de configurări pentru nivelul rețea (Network-Layer Protocol).

Opțiunile IPCP

Formatul lor este același ca și pentru opțiunile LCP.

Opțiunile ce se pot negocia la această etapă sunt:

1 IP-Addresses

2 IP-Compression-Protocol

3 IP-Address

În acest proiect este utilizată numai opțiunea 3 – IP-Address (fig. 26). Aceasta furnizează o cale de a negocia adresa IP ce va fi utilizată de către microcontroler. Deasemenea, permite terminalului care emite o cerere de configurare (REQ), să precizeze o anumită adresă IP dorită. Dacă serverul nu poate să-i asigure acea adresă IP, îi va trimite o adresă IP validă într-un pachet de tip NAK.

Figura 26. Opțiune IP Address

Exemplu:

Un exemplu de pachet IPCP, de tip NAK este prezentat în fig. 27.

Figura 27. Exemplu de pachet IPCP

6.5. IP (Internet Protocol)

Liantul care ține Internet-ul la un loc este protocolul de retea IP – Internet Protocol, si el a fost conceput încă de la început pentru interconectarea rețelelor. Caracteristica esentială este că fiecare pachet este tratat ca o entitate independentă (numită pachet sau datagramă), fără legături cu alte pachete. Acest nivel este nivelul responsabil cu rutarea pachetelor (datagramelor) în Internet. Sarcina acestui protocol este de a oferi o cale pentru a transporta datagramele de la sursă la destinatie, fără a tine seama dacă aceste sisteme sunt sau nu în aceeasi retea, sau dacă sunt sau nu alte retele între ele. Protocolul IP rutează pachetele prin rețelele interconectate îndeplinind si funcții de segmentare (la emițător) si de reasamblare (la destinatar) a pachetelor; acest protocol nu garantează livrarea pachetelor către destinatar, dar prin intermediul nivelului imediat superior, protocolului TCP, se asigură fiabilitatea corespunzătoare. În operația de rutare protocolul IP utilizează adresa IP a calculatorului (numită si adresă de retea).

Figura 28. Header IP

Componentele header-ului (fig. 28):

4 biți – Versiunea: indică adreselor IP folosite. În proiect este utilizată IP versiunea 4;

4 biți: IHL (Internet Header Length) – lungimea header-ului IP, exprimată în cuvinte de 32 biți. Pentru cazul nostru este are valoarea 5;

16 biți: TOS (Type Of Service) – tipul serviciului – reprezintă o serie de parametrii cu referire la calitatea serviciului dorit.

16 biți: Lungimea totală: este măsurată în octeți, incluzând header-ul și datele. Acest câmp acceptă o valoare maximă de 65535, așadar aceasta este lungimea maximă a unui pachet IP.

16 biți: Identificator – o valoare atribuită pachetului respectiv de către entitatea care trimite pachetul. Este folosită la asamblarea fragmentelor unei datagrame;

3 biți: Flag-uri: sunt folosite pentru control;

13 biți: Offset-ul fragmentului: indică poziția fragmentului din acest pachet în cadrul datagramei;

8 biți : TTL (Time To Live): timpul maxim permis unei datagrame să rămână în rețeaua Internet. Acest mecanism permite eliminarea datagramelor vechi din rețea.

8 biți: Protocol: indică protocolul încapsulat în blocul de date. În cazul nostru este vorba despre UDP, care are codul 11 hexa.

16 biți: Suma de control a header-ului IP: este calculată pe 16 biți numai pentru octeții ce alcătuiesc header-ul IP (20 octeți în cazul nostru).

32 biți: adresa IP sursă. În cazul nostru este adresa atribuită telefonului de către furnizorul de servicii Internet;

32 biți: adresa IP destinație. Pentru acest proiect, ca adresă destinație este folosită adresa IP a Server-ului către care sunt trimise pachetele cu datele de la GPS.

Date: blocul de date conține un pachet UDP.

6.6. ICMP(Internet Control Message Protocol)

ICMP, protocolul mesajelor de control în Internet. Știm că protocolul IP furnizează un serviciu fără conexiune, care nu garantează livrarea fiecărui pachet la destinatie. Pentru a înlătura acest dezavantaj se utilizează un mecanism prin care ruter-ele si sistemele din retea comunică informatii privind situatiile de functionare anormală (destinatie inaccesibilă, suprasolicitarea unui ruter, etc.); el poate fi utilizat de un sistem pentru a testa dacă un alt sistem este accesibil. Mesajele ICMP sunt încapsulate într-un pachet IP;

6.7. UDP (User Datagram Protocol)

UDP numit si protocol pentru informația utilizator – este un protocol fără conexiune, nesigur, dar cu viteză mare de transmisie, care utilizează datagrame pentru livrarea datelor. Când se utilizează acest protocol, comunicația este efectuată prin serviciu fără conexiune (nu se stabilește un circuit între cele două calculatoare care vor să comunice) folosind IP pentru transferul mesajelor. Acest protocol nu garantează livrarea mesajului la receptie fără erori, fără pierderi, fără duplicate, în ordinea în care au fost emise. Acest protocol permite identificarea sistemelor sursă si destinatie, precum si a programelor de aplicatie între care are loc transferul de informatie.

Figura 29. Header-ul pachetului UDP

Componentele header-ului UDP (fig. 29).

port sursă: câmp opțional, indică portul pe care sunt trimise datele. Poate fi considerat portul pe care se așteaptă să fie recepționat un răspuns. Nu este important pentru acest proiect;

port destinație: are o semnificație în contextul unei adrese de destinație;

lungime: lungimea datagramei incluzând header-ul și datele. Valoarea minimă este 8;

checksum: suma complement față de 1, a pseudo-header-ului format din header-ul IP, header-ul UDP și datele, completate în final cu zerouri pentru ca pachetul să aibă lungime pară.

6.8. TCP (Transmission Control Protocol)

TCP este un protocol sigur, care asigură transferul fiabil al informatiilor între aplicatiile de pe cele două calculatoare aflate în comunicatie. TCP este mult mai complex decât UDP pentru că furnizează un serviciu de livrare a datelor sigur, fără erori, orientat pe conexiune. Protocolul TCP este responsabil pentru împărtirea mesajului în mai multe datagrame, reasamblarea, retransmiterea în cazul în care ceva nu a fost transmis corect.

6.9. Implementare UDP contra implementare TCP

Implementarea protocolului TCP necesită memorii RAM și ROM de dimensiuni mari pentru a se putea păstra evidența conexiunilor deschise și a pachetelor care nu au primit o confirmare încă de computer-ul aflat la distanță cu care se face schimbul de pachete.

Un protocol mai puțin utilizat UDP, este mult mai ușor de implementat decât TCP deoarece fiecare pachet UDP este trimis fără să se aștepte un răspuns la pachetele trimise anterior. Așadar nu este necesară implementarea unui buffer de retransmisie sau a unui tabel de conexiuni pentru a păstra ordinea corectă a pachetelor.

Spre deosebire de UDP, TCP-ul furnizează un control asupra fluxurilor de date. Conexiunea prin TCP se bazează pe adresa IP și porturi. Fiecare dintre terminalele implicate au propria adresa IP, dar trebuie să lucreze pe același port pentru a putea comunica. Numărul portului determină, de obicei, tipul aplicației care îl folosește. Aceste numere sunt cuprinse între 0 și 65535, dar unele sunt deja atribuite unor aplicații specifice.

Un alt factor în deciderea utilizării dintre aceste protocoale pentru acest proiect, este importanța informațiilor transportate de protocol. Datele de la modulul receptor GPS sunt trimise la intervale de două secunde. Pierderea unui pachet nu influențează foarte mult aplicația ce realizează afișarea poziției dispozitivului mobil pe hartă, deoarece se pot face estimări aproximative ale datelor pierdute, din pachetele recepționate înainte sau după respectivul pachet care nu a ajuns la destinație. UDP are prevăzută și o modalitate de transmitere sigură a informației, dar implementarea este mai laborioasă.

Din aceste motive a fost ales pentru transmiterea datelor către server, protocolul UDP.

6.10. Conectare la Internet prin GPRS

Primul lucru care trebuie realizat de către microcontroler pentru a se putea conecta la Internet, folosind telefonul mobil (Sony-Ericsson T68i pentru acest proiect), este de a configura modemul GPRS al acestuia cu o serie de parametri.

Pentru acest proiect au fost configurați următorii parametri:

CID (Context ID)- numărul de indentificare al contextului PDP;

APN (Access Point Name ) – numele punctului de access din rețeaua GPRS. Pentru Orange acesta poate fi „internet” (folosit pentru acces normal la Internet) sau „speed” (pentru accesul la Internet utilizând un accelerator GPRS).

Utilizarea acceleratorului GPRS are următoarele beneficii:

– creșterea vitezei de navigare pe Internet prin GPRS de pană la 6 ori (în medie de 2 ori);

– scăderea semnificativă a costurilor de navigare pe Internet prin GPRS (reducere de pană la 5 ori a costurilor de navigare – în medie reducerea la jumătate) datorită diminuării cantității de informație transferată prin comprimarea textului și a imaginilor;

Contextul PDP;

Acești parametri sunt configurați cu comanda AT:

AT+CGDCONT=1,"ip","internet”,"",0,0

– adică CID=1, contextul PDP=”ip” și APN=”internet”.

După aceaste setări, trebuie apelat un numărul *99#, folosit pentru conectarea modemului la rețeaua GPRS. Acest lucru este realizat cu comanda AT: ATD*99#. În urma acestui apel modemul primește purtătoarea de la serverul îndepărtat și se pot trimite pachetele pentru negocierea PPP.

6.10.1. Negociere PPP

Pentru a stabili o comunicație printr-o legătură punct-la-punct, este necesară desfășurarea unei negocieri a parametrilor liniei. Acest lucru este realizat prin protocolul PPP, în patru etape:

stabilirea parametrilor liniei folosind LCP;

autentificarea abonatului;

atribuirea unei adrese IP terminalului folosit de utilizator, prin IPCP;

trimiterea pachetelor încapsulate în PPP;

Pentru conectarea microcontrolerului la Internet, folosind ca furnizor de servicii Internet, firma Orange, nu este necesară autentificarea abonatului. Așadar pentru a putea trimite pachete către serverul folosit în această aplicație se parcurg etapele descrise în fig. 30.

Figura 30. Negociere PPP

Exemplu:

Negociere PPP efectuată între PC și serverul Orange, al furnizorului de servicii Internet (ISP), la realizarea unei conectări la Internet. (fig. 31 și fig. 32).

Etapa LCP:

Figura 31. Negocierea opțiunilor LCP

1. PC-ul trimite către server un pachet LCP de tip REQ (cerere) pentru a se negocia opțiunile: 2 (ACCM), 5 (MN), 7 (PFC), 8 (ACFC), 13 (Callback), 17 și 19.

2. ISP (Internet Service Provider) răspunde cu un pachet de tip REJ, prin care respinge negocierea opțiunilor 5, 13, 17 și 19.

3. ISP-ul cere negocierea opțiunilor 2 (ACCM), 7 (PFC) și 8 (ACFC)

4.PC-ul acceptă aceste opțiuni

Negocierea pentru opțiuni se încheie când fiecare parte a trimis un REQ și un ACK pentru acele opțiuni. Așadar, e rândul PC-ului să ceară opțiunile 2, 7 și 8.

Serverul confirmă cererea PC-ului pentru opțiunile 2, 7 și 8, printr-un pachet de tip ACK.

În acest moment etapa de negociere a opțiunilor LCP este încheiată. Urmează o negociere a adreselor IP, prin protocolul IPCP (fig. 32).

Etapa IPCP:

Figura 32. Negocierea opțiunilor IPCP

7. PC-ul inițiază această etapă, cerând negocierea următoarelor opțiuni ale adreselor IP: 2 (Compresia IP), 3 (Adresa IP), 0x81 (adresa serverului DNS primar), 0x82 (adresa serverului NBNS primar), 0x83 (adresa serverului DNS secundar), 0x84 (adresa serverului NBNS secundar),

8. În același timp ISP-ul trimite cererea lui pentru opțiunea ce dorește a o negocia, și anume: opțiunea 3 (Adresa IP)

9. PC-ul trimite o confirmare la această cerere, pentru opțiunea 3 (Adresă IP)

10. ISP-ul respinge negocierea opțiunilor 2, 0x82 și 0x 84.

11. PC-ul cere din nou negocierea unei serii de opțiuni. În acest pachet de tip REQ sunt incluse opțiunile care nu au fost respinse de server, și anume: 3, 0x81 și 0x83. În câmpurile de date ale acestora este pusă valoarea „00”, ceea ce echivalează cu o cerere adresată ISP-ului de a trimite telefonului IP-urile pentru aceste opțiuni, adică IP-ul atribuit PC-ului (opțiunea 3) și IP-urile pentru serverele DNS primar și secundar folosite (opțiunile 0x81 și 0x83).

12. Serverul nu acceptă IP-urile cerute (adica 00.00.00.00 pentru telefon, 00.00.00.00 pentru serverul DNS primar și 00.00.00.00 pentru serverul DNS secundar) și trimite un pachet NAK ce conține adresele IP ce pot fi utilizate.

13. PC-ul trebuie să formuleze o cerere pentru aceste IP-uri, furnizate de ISP.

14. În final, serverul ISP acceptă folosirea acestor adrese și trimite un pachet de confirmare (ACK) pentru cererea anterioară a PC-ului.

6.10.2. Implementare

Aceste negocieri necesită o memorie ROM destul de mare, pentru stocarea programului (deoarece trebuie implementată interpretarea tuturor tipurilor de pachete ce pot să apară în comunicație), dar și o memorie RAM considerabilă pentru a crea buffer-ele necesare pentru păstrarea și respectarea ordinii tuturor pachetelor primite.

Ideea este de a se realiza o conectare cu minimul de schimburi de pachete. Deoarece se cunosc parametrii pe care serverul Orange dorește a-i negocia, au fost create pachete predefinite, ce pot fi stocate în ROM (la PIC16F876 memoria ROM este de 8KB, mult mai mare decât memoria RAM care este de 368 octeți).

Deasemenea, această metodă duce la scurtarea timpului în care se realizează conectarea la Internet.

Pașii parcurși de microcontroler pentru conectarea la Internet (figura 33):

(partea din program care realizează aceste etape este listată în anexa 2, pagina 83, funcția GPRS() )

Exemplu:

Conectare la Internet între microcontroler și serverul Orange (fig. 34).

Figura 34 Negociere între microcontroler și ISP-ul Orange

Etapa LCP:

1. Microcontrolerul inițiază dialogul cerând negocierea opțiunilor: 2 (ACCM), 7 (PFC) și 8 (ACFC).

2. Serverul Orange acceptă aceste opțiuni.

3. Este rândul serverului de a trimite lista opțiunilor pe care le dorește.

4. Microcontrolerul le confirmă și etapa LCP este încheiată.

Etapa IPCP:

5. Microcontrolerul trimite o cerere pentru a negocia opțiunea 3 din IPCP, adică IP Address. La finalul negocierii acestei opțiuni dispozitivul mobil (alcătuit din microcontroler, telefon mobil și modul receptor GPS), va avea atribuită o adresă IP proprie. De aceasta este nevoie pentru a forma pachetele UDP.

6. În același timp serverul a trimis o cerere de negociere a aceleiași opțiuni. Pentru aceasta va trebui să trimitem un răspuns de tip ACK. De aceea câmpul IP1 este păstrat într-un vector

7. Cererea serverului este confirmată de microcontroler.

8. Serverul nu acceptă cererea microcontrolerului de la punctul 5, de a primi adresa IP 00.00.00.00 și trimite un pachet NAK care conține în schimb o adresă liberă, care poate fi folosită dispozitivul mobil (păstrată de microcontroler în vextorul ip2).

9. Este emisă o cerere pentru această adresă IP (ip2).

10. Serverul acceptă să-i atribuie această adresă microcontrolerului. Această adresă, ip2 va fi folosită în pachetele IP ca adresă sursă.

Negocierea se încheie aici. De acum se pot trimite pachete UDP către serverul (ce rulează un program ce interpretează și afișează datele încapsulate în aceste pachete) folosit de această aplicație.

6.11. Încapsularea pachetelor UDP

Datele primite de la GPS trebuie încapsulate în pachete UDP. Pentru aceasta li se adaugă un header UDP, apoi un header IP și se încadrează pachetul în PPP – HDLC.

În fig. 35 sunt prezentate nivelurile OSI pentru pachetele UDP:

Figura 35. Nivelurile OSI pentru un pachet UDP

Pentru a putea trimite datele către Server, acestea trebuie încapsulate într-o serie de protocoale după structura din fig. 36.

Figura 36. Schema generală pentru un pachet UDP/IP

Etapele parcurse în program sunt enumerate în fig. 37.

Funcția „Formeaza mesajul de la GPS” este explicată la pagina 12.

Formeaza pachet UDP

Din toate câmpurile componente ale acestor pachete, se modifică numai:

– indexul pachetului

adresa IP sursa (obținută la negociere)

suma de control pentru IP;

suma de control pentru UDP;

FCS (Frame Check Sequence) – suma de control a întregului pachet PPP;

Lungimea IP sau lungimea UDP nu se modifică, deoarece blocul de date are întotdeauna aceeași lungime (buffer-ul de 73 octeți)

In RAM este definit un buffer pentru UDP cu lungimea totală = lungimea headerului IP + lungimea headerului UDP (fig. 38), adică 20 + 8 = 28 octeți.

Figura 38. Componența bufferului UDP

În câmpurile acestui buffer se vor opera modificări asupra IP sursă și sume de control.

Componentele PPP sunt trimise direct din program (0x7E 0x21) la începerea trimiterii unui pachet. Apoi sunt trimise pe rând: headerul IP, headerul UDP, blocul de date (obținute de la GPS și introduse în buffer) și FCS-ul și delimitatorul de sfârșit de pachet PPP, 0x7E.

Figura 39 prezintă etapele încapsulării datelor de la GPS într-un pachet UDP.

Figura 39. Încapsulare UDP-IP-PPP

În urma încapsulării rezultă pachetul din fig. 36.

Aceste pachete UDP sunt trimise la intervale de două secunde (intervalul minim de obținere a datelor de la GPS). Pachetele au indexuri diferite, deoarece serverul respinge pachetele care au același index.

6.12. Sume de control (Checksum)

Sunt prezentate în continuare principiile și modalitățile de implementare pentru calcularea sumelor de control pentru pachete PPP (FCS-ul), pentru IP siUDP.

6.12.1. FCS (Frame Check Sequence)

FCS-ul este o metodă de detecție a erorilor de apar în blocurile de date stocate pe diferite suporturi sau în transmisii.

În pachetele PPP în cadre HDLC, folosite pentru această aplicație, suma de control (FCS – Frame Check Sequence) poate fi calculată pe 16 biți sau pe 32 biți. În proiect am folosit varianta pe 16 biți.

FCS-ul mai este numit și CRC (Cyclic Redundancy Check), în alte aplicații decât HDLC și PPP. FCS și CRC au o funcționare similară, dar diferă polinomul după care sunt calculate.

Suma FCS a fost proiectată inițial pentru o implementare hardware, pentru comunicații seriale pe liniile telefonice. Pentru a accelera implementarea software, în loc de calcule la nivel de bit sunt folosiți octeți, valori calculate di-nainte și puse într-un tabel.

Specificațiile acestui tip de sumă de control sunt definite de CRC16-CCITT:

cuvine de 16 biți;

polinomul folosit: x16+x12+x5+1 ;

valoarea inițială a sumei: 0xFFFF;

rezultul final al sumei este inversat;

Exemplu:

Un calcul pentru CRC, făcut de mână, pentru mesajul cu textul „A”, la nivel de bit folosind polinomul de mai sus este prezentat în anexa la pagina 65:

O altă metodă mai simplu de implementat în software, este cea folosind un tabel de valori (vezi anexa 1, tabelul de la pagina 67), definit în documentația despre pachetele PPP în cadru HDLC.

Algoritmul de calcul al FCS, folosind acest tabel este:

setează valoarea inițială a tabelului la valoarea 0xFFFF;

ia un octet de date;

face SAU-EXCLUSIV între octetul de date și octetul Low din valoarea inițială a tabelului. Valoarea obținută reprezintă un indice petnru tabel;

citește valoarea indicată de acest indice în tabel;

face SAU-EXCLUSIV între octetul Low din acesta valoare din tabel și octetul High din valoarea inițială a tabelului;

memorează valoarea formată din octetul High al valorii curente din tabel și octetul Low obținul la pasul 5. Setează această valoare nou obținută ca valoare a tabelului inițial;

repetă algoritmul de la pasul 2 pentru toți octeții de date;

Exemplu:

Calculul FCS pentru un pachet PPP, folosind acest algoritm este prezentat în Anexa 1, pagina 68:

Rutina implementată în microcontroler, pentru calcularea FCS, este listată în anexa 2, pagina 75:

6.12.2. Suma de control pentru protocolul IP

Aceasta este o sumă complement față de 1, pe 16 biți, calculată pentru toți octeții din headerul IP (20 de octeți).

Suma complement față de 1 este calculată adunând toți octeții de date după ce au fost grupați în perechi, deci pe 16 biți. Se obține astfel o sumă reprezentată pe 32 biți. La cei mai puțin semificativi doi octeți, se adaugă cei mai semnificativi doi octeți. Rezultatul acestei adunări este suma de control pentru pachetele IP.

Exemplu:

Calcul pentru suma de control IP pentru un grup de date format din 10 octeți.

Etape:

– octeții adiacenți se grupează în perechi pentru a forma numere întregi pe 16 biți. Se calculează suma acestor numere întregi pe 16 biți.

– pentru a genera suma, valoarea inițială a ei este setată pe 0. Se calculează suma complement față de 1 și valoarea obținută este pusă în câmpul „Checksum”;

Pachet: 01 00 F2 03 F4 F5 F6 F7 00 00

Ultimii doi octeți cu valorile „00” sunt câmpul pentru suma de control;

Formează cuvinte de 16 biți: 0100 F203 F4F5 F6F7

Calculează suma acestor valori:

0100 + F203 + F4F5 + F6F7 = 0002 DEEF

Adună octeții cei mai semnificativi la cei mai puțini semnificativi:

0002+DEEF = DEF1

Inversează suma relutată: ~DEF1 = 210E

Este trimis pachetul cu suma inclusă: 01 00 F2 03 F4 F5 F6 F7 21 0E

Rutina implementată în microcontroler, pentru calcularea sumei de control pentru pachetele IP, este listată în anexa 2, pagina 77:

6.12.3. Suma de control pentru protocolul UDP

Pentru a calcula această sumă la header-ul UDP, un pseudo-header alcătuit din:

Adresa IP sursă: 4 octeți;

Adresa IP destinație: 4 octeți;

Protocol: 2 octeți;

Lungimea pachetului UDP: 2 octeți;

Suma este calculată pentru toți octeții din acest pseudo-header, header-ul UDP și blocul de date. Dacă datele au o lungime impară, se adaugă la sfârșitul acestuia un octet pentru a obține un bloc de lungime pară.

Pseudo-header-ul nu este trimis cu pachetul

Rutina implementată în microcontroler, pentru calcularea sumei de control pentru pachetele UDP, este listată în anexa 2, pagina 77:

6.13. Schema logică a programului

Programul implementat în microcontroler realizează preluarea datelor de la GPS și trimiterea lor către utilizator prin SMS sau GPRS/Internet, cât și comutarea între cele două moduri de funcționare. Schema logică a programului (listat în Anexa 2) este prezentat în figura 40. Funcțiile ce apar în diagramă au fost explicate în capitolele 2-6.

Programul a fost scris în C, folosind un compilator special creat pentru microcontrolerele produse de Microchip.

Resursele folosite de acest program sunt:

– memorie ROM: 3714 cuvinte (45.3%)

– memorie RAM: 250 octeți (67.9%)

– port UART;

– 1 pin de intrare pentru rutina recepțieGPS();

– 1 pin de intrare, folosit pentru comutarea între modurile SMS și GPRS;

Figura 40. Schema logică a programului din microcontroler

Cap. 7 Concluzii și persepective

Dezvoltări ulterioare:

se pot realiza optimizări ale programului pentru a utiliza cât mai puțină memorie.

implementarea unei căi bidirecționale de comunicație între microcontroler și Server (pentru a putea primi comenzi prin Internet);

implementarea de comenzi trimise prin SMS;7

implementarea protocolului TCP/IP;

implemenetarea unei aplicații de tip Server/Client pentru interpretarea datelor recepționate prin Internet;

Schema circuitului este prezentată în anexa 1 la pagina 69. Din comutatorul WR/SPY se poate selecta între opțiunile: programează microcontroler și spionează cu PC-ul comunicația telefon-micrcontroler. Este folosit un integrat MAX232, pentru transformările de niveluri RS232 – TTL/CMOS.

7.1. Server

Microcontrolerul trimite prin Internet datele de la GPS, încapsulate în pachete UDP. Destinația acestor pachete este un server UDP care are rolul de a verifica dacă pe un anumit port primește pachete UDP.

Serverul trebuie să aibă o adresă IP externă pentru a putea fi accesat din exterior. IP-ul său este cunoscut și scris în memoria microcontrolerului ca adresă IP destinație (aceasta poate fi modificată doar prin reprogramarea microcontrolerului).

Programul server „Indy UDP server” realizat în Delphi (fig. 41), a fost folosit pentru testarea transmisiei datelor în timp real de la GPS către Server, prin Internet.

7.2. Posibilități de utilizare a proiectului

O aplicație care să interpreteze datele după ce acestea au fost decapsulate de către serverul UDP ar putea să afișeze aceste poziții pe hartă, să aproximeze traseul pe care se va deplasa autovehiculul în care este amplasat echipamentul. (figura 42).

Echipamentul mobil, poate fi deasemenea utilizat împreună cu o aplicație corespunzătoare situată pe server, pentru gestiunea taximetrelor într-un oraș, sau pentru orice altă firmă de transporturi terestre.

Ideea constă in localizarea taxi-urilor dintr-un oras, dispecerul preia comanda de la client, introduce datele comenzii (cartierul/blocul/scara) Aplicatia îi afișeaza primele variante posibile (sa spunem: 57 – 1:50 min, 82 – 3 min, 43 – 6 min) pentru acea comanda (order), dispecerul selectează una din aceste variante (să spunem ca taxiul 57). Un mesaj cu adresa destinatie este astfel trimis catre soferul taxiului 57. Acesta utilizează tastatura pentru a confirma sau infirma comanda.

Datele despre poziția unui autovehicul si transmiterea acestora (pozitia: latitudine, longitudine) către dispecer folosind tehnologia GSM prin SMS, sau in timp real prin GPRS si Internet (Fig. 42). Datorita solutiilor alese, costurile sunt reduse iar aria de acoperire este foarte larga.

Figura 42. Aplicație client

Se pot găsi numeroase alte utilizări pentru acest sistem. Pe lângă modulul receptor GPS se pot adăuga o serie de senzori pentru a putea trimite în timp real diverși parametri sau alarme.

Deasemenea, gestionarea automatelor de cafea dintr-un oraș, sau a automatelor bancare. Acestea se conectează singure la Internet și trimit datele despre tranzacțiile efectuate, și dacă au nevoie de reîncărcări. Cel care se ocupă de gestiunea lor, poate vizualiza situația lor, utilizând un program aplicație (cu Server UDP inclus).

O altă posibilitate are fi implementarea transmisiei de voce (prin VoIP), prin aceste pachete UDP. Astfel se pot realiza convorbiri de pe un echipament mobil (ce utilizează rețeaua GSM), cu orice zona a lumii (deoarece transmisia de date se face prin Internet), la același tarif, indiferent de distanța la care se află cel apelat. Modulul ar fi ușor de utilizat, fiind un circuit simplu, conectat la mufa serială a telefonului mobil.

Anexa 1

Figura 43 Alfabetul pe 7 biți pentru SMS-uri

Exemplu de calcul FCS:

Tabelul 4. Tabel de valori pentru calculul FCS

Tabelul 5. Exemplu de calcul FCS cu rutina calculeazăFCS()

Figura 44. Schema electronică de principiu a proiectului

Anexa 2

#include <pic1687x.h>

#include <conio.h>

#include <stdio.h>

///////////////////////VARIABILE\\\\\\\\\\\\\\\\\\\\\\\\\

const unsigned short int fcstab[256] = {

0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,

0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,

0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,

0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,

0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,

0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,

0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,

0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,

0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,

0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,

0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,

0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,

0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,

0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,

0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,

0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,

0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,

0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,

0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,

0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,

0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,

0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,

0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,

0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,

0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,

0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,

0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,

0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,

0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,

0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,

0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,

0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78

};

const unsigned char ora[]={"Ora: "};

const unsigned char latitudine[]={" Latitudine: "};

const unsigned char longitudine[]={" Longitudine: "};

const unsigned char viteza[]={" Viteza: "};

const unsigned char unghi[]={" Unghi: "};

const unsigned char data[]={" Data: "};

//const unsigned char sablon1[]={"Ora: ~ Latitudine: ~ Longitudine: ~"};

//const unsigned char sablon2[]={" Viteza: ~ Unghi: ~ Data: ~"};

unsigned int ix, registruGPS1;

unsigned int i, is, ib, ij;

unsigned char car;

unsigned int p, ind, ind1;

const unsigned char comAT[]={"AT-AT&F-ATV1E0S0=0&D2&C1-AT+CLIP=1-AT+CGDCONT=1,\"ip\",\"internet\",\"\",0,0-"};

const unsigned char comATinchide[]={"AT+CHUP"};

const unsigned char comATSMS[]={"AT+CMGS=125"};

//const unsigned char comATconectare[]={"AT-ATV1E0S0=0&D2&C1-AT+CGDCONT=1,\"ip\",\"internet\",\"\",0,0-"};

const unsigned char comATdial[]={"ATD*99#"};

const unsigned char comATdeconectare[]={"+++ATH"};

const unsigned char pachet1[]={ 0x7E, 0xFF, 0x7D, 0x23, 0xC0, 0x21, 0x7D, 0x21, 0x7D, 0x20,

0x7D, 0x20, 0x7D, 0x2E, 0x7D, 0x22, 0x7D, 0x26, 0x7D, 0x20,

0x7D, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7D, 0x27, 0x7D, 0x22,

0x7D, 0x28, 0x7D, 0x22, 0xDD, 0x31, 0x7E

};

const unsigned char pachet2[]={ 0x7E, 0xFF, 0x7D, 0x23, 0xC0, 0x21, 0x7D, 0x22, 0x7D, 0x21,

0x7D, 0x20, 0x7D, 0x2E, 0x7D, 0x22, 0x7D, 0x26, 0x7D, 0x20,

0x7D, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7D, 0x27, 0x7D, 0x22,

0x7D, 0x28, 0x7D, 0x22, 0x4E, 0xB7, 0x7E

};

const unsigned char pachet3[]={ 0x7e, 0x80, 0x21, 0x01, 0x01, 0x00, 0x0a, 0x03, 0x06, 0x00,

0x00, 0x00, 0x00, 0x6d, 0xc6, 0x7e

};

const unsigned char pduSMS[20]={"0011000A810000FF7D"};

//00 11 00 0A 81 70 44 85 52 27 00 00 FF 04 F4 F2 9C 0E .. (1A 0D)

unsigned char eapelat, j, k, x, y, z, msjimp, Hascii, Lascii, registruGPS;

unsigned char nrapelant[11]={"0722839645"}, mesaj[9];

/*//bank1 unsigned char buffer[]={0x41, 0x42};

bank1 unsigned char buffer[]={

0x82, 0xF7, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x20, 0x45, 0x4A, 0x46, 0x44, 0x45, 0x42, 0x46, 0x45, 0x45, 0x42, 0x46,

0x41, 0x43, 0x41, 0x43, 0x41, 0x43, 0x41, 0x43, 0x41, 0x43, 0x41, 0x43,

0x41, 0x43, 0x41, 0x43, 0x41, 0x43, 0x41, 0x41, 0x41, 0x00, 0x00, 0x20,

0x00, 0x01, 0x7d};*/

bank1 unsigned char buffer[]={"20:00:00-45gr 26.094'N-025gr 31.476'E-054.0 noduri-060.3gr-09.05.'05 -"};

//80 21 02 01 00 0A 03 06 AC 15 83 B4 //2E 6E 7E

bank2 unsigned char date[14]={

0x80, 0x21, 0x02, 0x01, 0x00, 0x0a, 0x03, 0x06, 0x00,

0x00, 0x00, 0x00

};

bank3 unsigned char pachetUDP[33]={

0x21, 0x45, 0x00, 0x11, 0x11, 0xdd, 0xdd, 0x00, 0x00, 0x80,

0x11, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xdd, 0xdd, 0xdd,

0xdd, 0x55, 0x55, 0xdd, 0xdd, 0x11, 0x11, 0x00, 0x00,// 0x11,

// 0x11, 0x11, 0x11

};

const unsigned char adrdest[4]={82, 208, 136, 131}, lungimemesaj=72;

unsigned char ip1[4], ip2[4], lungimesir, lungimeIP, lungimeUDP;

const unsigned int portsursa=8090, portdest=8090;

//unsigned int b[11];

unsigned char pseudoheader[12];

bank2 unsigned char sumaH, sumaL, lung;

bank2 unsigned int ID, zx, carry;

bank2 unsigned int suma1, suma;

bank2 unsigned long suma2;

bank2 unsigned char lungimeIPH, lungimeIPL, IDH, IDL;

bank2 unsigned char portsursaH, portsursaL, portdestH, portdestL;

bank2 unsigned char lungimeUDPH, lungimeUDPL;

bank2 unsigned int tabelinitial = 0xffff;

bank2 unsigned int tabelinitialhigh=0xff, tabelinitiallow=0xff;

bank2 unsigned int tabinterm, tabintermH, tabintermL, tabelinit, fcs, fcsH, fcsL;

unsigned char modactiv, selectie;

//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//

//////////////////////PAUZA\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

void pauza(int durata){

for(p=0;p<durata;p++) ;

}

/////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

/////////////////////SERIALA///////////////////////

void trimite(unsigned char cardetrimis){

TXREG = cardetrimis;

while(!TXIF) ;

}

unsigned char receptie(){

PORTB|=0b00000100;

while(!RCIF) {

if(!selectie){ if((PORTB>>7) ^ modactiv) {selectie=1; return(0);} }

}

PORTB&=0b11111011;

return RCREG;

}

unsigned char receptieGPS(){

//sincronizare

//for(y=0;y<100;y++) {

// if(PORTB!=0) y=0;

// pauza(79);

// }

registruGPS=0;

// asteapta primul front crescator

while ((PORTB&0b00100000)!=0) {

asm("clrwdt");

if(!selectie){ if((PORTB>>7) ^ modactiv) {selectie=1; return(0);} }

}

pauza(118); // asteapta 312,5 us (1,5T)

for(z=0;z<8;z++) {

// introduce bitii prin rotatie la stanga intr-un registruGPS

// esantioneaza bitii la intervale de 208,33 us (1T)

if((PORTB&0b00100000)!=0) {registruGPS1+=256; registruGPS1>>=1; registruGPS1&=0x00ff; }

else {registruGPS1&=0x00ff; registruGPS1>>=1;}

pauza(79);

}

// returneaza registruGPS

registruGPS=registruGPS1;

return registruGPS;

}

void initializareseriala(){

IRP = 0;

SPBRG = 31; // la 20Mhz 64 inseamna 4800 baud; 31 inseamna 9600 baud

TXSTA = 32; //TXEN+BRGH (1 si 0)

RCSTA = 144;

TRISA = 0;

TRISB = 0b10100000; //seteaza toti pinii portului B ca pini de intrare

}

//////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\

////////////////////MODEM//////////////////////////////////\\/\/

void esteOK(){

do{ if(selectie) { return; } car=receptie(); if (car==0) {return;} } while (car != 'O');

car=receptie();

if (car=='K'){

receptie();

receptie();

} //end if "K"

}

void inchide(){

for(i=0;i<7;i++) {

trimite(comATinchide[i]);

pauza(700); }

trimite(0x0D);

esteOK();

}

void dial(){

for(i=0;i<7;i++) {

trimite(comATdial[i]);

pauza(500); }

trimite(0x0D);

esteOK();

}

void deconecteaza(){

for(i=0;i<6;i++) {

trimite(comATdeconectare[i]);

pauza(700); }

trimite(0x0D);

pauza(500);

esteOK();

}

void initializaremodem(){

for(i=0;i<(sizeof(comAT)-1);i++)

{

if(comAT[i] != '-') {

trimite (comAT[i]);

pauza(500); }

else {trimite(0x0d);

pauza(500);

esteOK();

pauza(10000);

} //end else

} //end for

} //end functie

//////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

///////////Verifica daca este conectat\\\\\\\\\\\\\\\\\\\

unsigned char nuesteCONNECT(){

do { car=receptie();} while (car != 'C');

receptie();

receptie();

if(receptie()=='N') {

receptie();

receptie();

if(receptie()=='T'){

receptie();

receptie();

return(0); }

}

else return(1);

return(0);

}

//////////\\\\\\\\\\\\\\\\\\\////////////////\\\\\\\\\\\\\

///////////////ASTEAPTA APEL SI IA NUMARUL\\\\\\\\\\\\\\\

unsigned char asteaptaapel(){

PORTB|=0b00000001;

do{selectie=0; car=receptie();

if(selectie) { PORTB&=0b11111110; modactiv = PORTA>>7; return(0);}

} while(car!='R');

if(receptie()=='I'){

if(receptie()=='N'){

if(receptie()=='G'){

for(i=0;i<12;i++) receptie();

for(i=0;i<10;i++) nrapelant[i]=receptie();

do{car=receptie(); } while(car!=0x0A);

PORTB&=0b11111110;

return(1);

}}}

return(0);

}

/////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

//////////////////FCS date////////\\\\////////////

void calculeazaFCSdate(){

tabelinitial = 0xffff;

tabelinitialhigh=0xff;

tabelinitiallow=0xff;

tabinterm=0;

tabintermH=0;

tabintermL=0;

tabelinit=0;

fcs=0;

fcsH=0;

fcsL=0;

for(i=0;i<12;i++){

tabelinitialhigh = (tabelinitial&0xff00) >> 8;

tabelinitiallow = tabelinitial & 0x00ff;

tabinterm = fcstab[ date[i]^tabelinitiallow ];

tabintermH = tabinterm >> 8;

tabintermL = tabinterm & 0x00ff;

tabelinit = (tabintermL^tabelinitialhigh) + (tabintermH<<8);

tabelinitial = tabelinit;

}

fcs = tabelinitial^0xffff;

fcsH = (fcs&0xff00) >> 8;

fcsL = fcs&0x00ff;

//adauga la date si fcs-ul

date[12]=fcsL;

date[13]=fcsH;

}

////////////////////////////////////////////\\\\\\\\\\\

//////////////////FCS pt pachetele UDP intregi////////////////////

void calculeazaFCSpachet(){

tabelinitial = 0xffff;

tabelinitialhigh=0xff;

tabelinitiallow=0xff;

tabinterm=0;

tabintermH=0;

tabintermL=0;

tabelinit=0;

fcs=0;

fcsH=0;

fcsL=0;

for(i=0;i<29;i++){

tabelinitialhigh = (tabelinitial&0xff00) >> 8;

tabelinitiallow = tabelinitial & 0x00ff;

tabinterm = fcstab[ pachetUDP[i]^tabelinitiallow ];

tabintermH = tabinterm >> 8;

tabintermL = tabinterm & 0x00ff;

tabelinit = (tabintermL^tabelinitialhigh) + (tabintermH<<8);

tabelinitial = tabelinit;

}

for(i=0;i<lungimemesaj;i++){

tabelinitialhigh = (tabelinitial&0xff00) >> 8;

tabelinitiallow = tabelinitial & 0x00ff;

tabinterm = fcstab[ buffer[i]^tabelinitiallow ];

tabintermH = tabinterm >> 8;

tabintermL = tabinterm & 0x00ff;

tabelinit = (tabintermL^tabelinitialhigh) + (tabintermH<<8);

tabelinitial = tabelinit;

}

fcs = tabelinitial^0xffff;

fcsH = (fcs&0xff00) >> 8;

fcsL = fcs&0x00ff;

}

/////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\///////

////////////////////Calculeaza IP CHECKSUM\\\\\\\\\\\\\\\\\\\\\\\\

void ipCHKS(){

sumaH=0;

sumaL=0;

carry=0;

suma=0;

suma1=0;

suma2=0;

pachetUDP[11]=0;

pachetUDP[12]=0;

for(i=1;i<20;i+=2){

suma=(pachetUDP[i]*256+pachetUDP[i+1]);

suma2+=suma;

}

//suma2&=0xffff;

carry=suma2>>16;

suma=suma2&0xffff;

suma+=carry;

suma1=~suma;//=0xffff;

sumaH=suma1>>8;

sumaL=suma1&0xff;

pachetUDP[11]=sumaH;

pachetUDP[12]=sumaL;

}

void UDPCHKS(){

sumaH=0;

sumaL=0;

carry=0;

suma=0;

suma1=0;

suma2=0;

lung=6+4+lungimemesaj;//lungimea lui b[]

pachetUDP[27]=0;

pachetUDP[28]=0;

//initializeaza pseudoheader cu: adresa sursa (4b), adr dest (4b)

//protocol (2b) si lungimeUDP(2)

for(i=0;i<4;i++) {pseudoheader[i]=ip2[i]; pseudoheader[i+4]=adrdest[i];}

pseudoheader[8]=0x00;

pseudoheader[9]=0x11;

pseudoheader[10]=pachetUDP[25];

pseudoheader[11]=pachetUDP[26];

//calculeaza CHKS pt pseudoheader[]

for(i=0;i<11;i+=2) {

suma =(pseudoheader[i]*256 + pseudoheader[i+1]);

suma2+=suma;}

for(i=21;i<29;i+=2) {

suma=(pachetUDP[i]*256 + pachetUDP[i+1]);

suma2+=suma;}

for(i=0;i<(lungimemesaj-1);i+=2) {

suma=buffer[i]*256 + buffer[i+1];

suma2+=suma; }

carry=suma2>>16;

suma=suma2&0xffff;

suma+=carry;

suma1=~suma; //suma pseoudoheaderului+UDPhead+data

sumaH=suma1>>8;

sumaL=suma1&0xff;

pachetUDP[27]=sumaH;

pachetUDP[28]=sumaL;

}

///////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////

///////////////////ASTEAPTA PACHET\\\\\\\\\\\\\\\\\\\\\\\\

void asteaptapachet(){

do{car=receptie(); } while (car!=0x7e);

do{car=receptie(); } while (car!=0x7e);

}

////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////

///////////////////////OBTINE IP\\\\\\\\\\\\\\\\\\\\\\\\\\\

void obtineip1(){

//do{car=receptie(); } while (car!=0x7e);

do{car=receptie(); } while (car!=0x7e);

for(i=0;i<8;i++) receptie();

for(i=0;i<4;i++) { car=receptie(); ip1[i]=car; }

do{car=receptie(); } while (car!=0x7e);

}

void obtineip2(){

do{car=receptie(); } while (car!=0x7e);

for(i=0;i<8;i++) receptie();

for(i=0;i<4;i++) { ip2[i]=receptie(); }

do{car=receptie(); } while (car!=0x7e);

}

//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////

/////////////////FORMEAZA PACHETUL UDP\\\\\\\\\\\\\\\\\\\\///////

void formeazapachetUDP(){

//lungimemesaj=2;

// ID=0x2f65;

// ip2[0]=0xac;

// ip2[1]=0x15;

// ip2[2]=0x85;

// ip2[3]=0x3c;

//initializari valori

// portsursa=0x89;//0401;

// portdest=0x89;//1f9a;

// adrdest[0]=0xff;//193;//82;//193;

// adrdest[1]=0xff;//231;//208;//231;

// adrdest[2]=0xff;//148;//136;//148;

// adrdest[3]=0xff;//45;//148;//45;

//baga adresasursa(adica ip2) si adrdest

for(i=0;i<4;i++) {pachetUDP[i+13]=ip2[i]; pachetUDP[i+17]=adrdest[i];}

lungimeIP=28+lungimemesaj;

lungimeUDP=8+lungimemesaj;

//baga mesajul in pachetUDP

for(i=0;i<lungimemesaj;i++) pachetUDP[i+29]=mesaj[i];

//baga lungimeI, ID, lungimeUDP,portsursa, portdest

lungimeIPH=lungimeIP>>8;

lungimeIPL=lungimeIP&0x00ff;

pachetUDP[3]=lungimeIPH;

pachetUDP[4]=lungimeIPL;

IDH=ID>>8;

IDL=ID&0x00ff;

pachetUDP[5]=IDH;

pachetUDP[6]=IDL;

portsursaH=portsursa>>8;

portsursaL=portsursa&0x00ff;

pachetUDP[21]=portsursaH;

pachetUDP[22]=portsursaL;

portdestH=portdest>>8;

portdestL=portdest&0x00ff;

pachetUDP[23]=portdestH;

pachetUDP[24]=portdestL;

lungimeUDPH=lungimeUDP>>8;

lungimeUDPL=lungimeUDP&0x00ff;

pachetUDP[25]=lungimeUDPH;

pachetUDP[26]=lungimeUDPL;

}

///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\\\\\\

//////////////////////// G P S \\\\\\\\\\\\\\\\\\\\\\\\\\\\

void formeazamesajdelaGPS(){

// formeaza parametrii cu datele de la GPS

do{PORTB|=0b01000000;

do {

car = receptieGPS(); /*if(selectie) {PORTB&=0b10111111;}*/ asm("clrwdt");

} while(car!='$') ;

for(i=0;i<4;i++) receptieGPS();

car=receptieGPS();

if (car=='C') { break; }

} while(1);

receptieGPS();

PORTB&=0b10111111;

// 1 2 3 4 5 6 7

// 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 12

//buffer[]={"20:23:34-45gr 26.094'N-025gr 31.476'E-054.0 noduri-060.3gr-09.05.'05 -"};

//$GPRMC, 202334,A,4526.094,N, 02531.476,E,054.0,060.3,090505,004.3,E*70

//ora

for(j=0;j<8;j++){

if(j==2) j++;

if(j==5) j++;

buffer[j]=receptieGPS();

}

for(j=0;j<3;j++) receptieGPS(); //sare peste ,A,

//latitudine

for(j=9;j<22;j++){

if(j==11) j=14;

buffer[j]=receptieGPS();

}

buffer[20]='\'';

receptieGPS();

//longitudine

for(j=23;j<37;j++){

if(j==26) j=29;

buffer[j]=receptieGPS();

}

buffer[35]='\'';

receptieGPS();

//viteza

for(j=38;j<43;j++){ buffer[j]=receptieGPS();}

receptieGPS();

//unghi

for(j=51;j<56;j++){ buffer[j]=receptieGPS();}

receptieGPS();

//data

for(j=59;j<68;j++){

if(j==61) j=62;

if(j==64) j=66;

buffer[j]=receptieGPS();

}

}

//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\

//////////////////////IMPACHETARE pe 7 biti\\\\\\\\\\\\\\

//trimite grupuri de 8B codati pe 7b

void trimitegrup(){

//codeaza pe 7b

for(j=0;j<7;j++){

x=mesaj[j];

y=mesaj[j+1];

x>>=j;

y<<=(7-j);

msjimp = x|y;

//hexainascii

x=msjimp; x>>=4;

y=msjimp; y&=0x0f;

if(x<=9){Hascii=x+0x30;}

else {Hascii=x+0x37;}

if(y<=9){Lascii=y+0x30;}

else {Lascii=y+0x37;}

trimite(Hascii);

pauza(500);

trimite(Lascii);

pauza(500);

}

j=0;

}

void trimiteSMS(){

//trimite AT+CMGS=125 (13+112)

for(z=0;z<11;z++) {trimite(comATSMS[z]); pauza(500);}

trimite(0x0d);

while(receptie()!=32) ;

pauza(500);

//trimite PDU: 00 11 00 0A 81

for(z=0;z<10;z++) {pauza(500);trimite(pduSMS[z]); }

pauza(500);

//trimite numarul: 0722839645 -> 7022386954

for(z=0;z<10;z+=2) {trimite(nrapelant[z+1]); pauza(500);

trimite(nrapelant[z]); pauza(500); }

for(z=10;z<18;z++) {trimite(pduSMS[z]); pauza(500);}

//trimite blocuri de 7bytes cu datele

ib=0; j=0;

for(z=0;z<5;z++) {mesaj[j]=ora[z]; j++; }

while(buffer[ib]!='-') {

//trimite('*');

mesaj[j]=buffer[ib]; j++; ib++;

if(j==8) trimitegrup();

}

ib++;

for(i=0;i<14;i++) {

mesaj[j]=latitudine[i]; j++; if(j==8) trimitegrup();}

while(buffer[ib]!='-') {

mesaj[j]=buffer[ib]; j++; ib++;

if(j==8) trimitegrup();

}

ib++;

for(i=0;i<15;i++) {

mesaj[j]=longitudine[i]; j++; if(j==8) trimitegrup();}

while(buffer[ib]!='-') {

mesaj[j]=buffer[ib]; j++; ib++;

if(j==8) trimitegrup();

}

ib++;

for(i=0;i<10;i++) {

mesaj[j]=viteza[i]; j++; if(j==8) trimitegrup();}

while(buffer[ib]!='-') {

mesaj[j]=buffer[ib]; j++; ib++;

if(j==8) trimitegrup();

}

ib++;

for(i=0;i<9;i++) {

mesaj[j]=unghi[i]; j++; if(j==8) trimitegrup();}

while(buffer[ib]!='-') {

mesaj[j]=buffer[ib]; j++; ib++;

if(j==8) trimitegrup();

}

ib++;

for(i=0;i<8;i++) {

mesaj[j]=data[i]; j++; if(j==8) trimitegrup();}

while(buffer[ib]!='-') {

mesaj[j]=buffer[ib]; j++; ib++;

if(j==8) trimitegrup();

}

ib++;

//trimite si 1A si 0D

trimite(0x1a);

pauza(300);

trimite(0x0d);

pauza(300);

} // end trimiteSMS

////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\

//////////////'''''''''''' GPRS '''''''''''\\\\\\\\\\\\\\\\\\

void GPRS(){

selectie=0;

modactiv=0;

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

PORTB&=0b11111110;

PORTA|=0b111111; // aprinde ledul rosu pt GPRS

//PORTA&=0b111011; // stinge ledul galben pt SMS

//PORTB|=0b00000100; //aprinde ledul de la pozitia unde este '1'

//while(1) {

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

dial();

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

//do{dial();}

//while(nuesteCONNECT());

nuesteCONNECT();

pauza(10000);

//trimite pachet1 REQ pt 03 07 si 08

for(i=0;i<37;i++) { trimite(pachet1[i]); pauza(500);}

asteaptapachet();

asteaptapachet();

pauza(20000);

//trimite pachet2 ACK pt 03 07 si 08

for(i=0;i<37;i++) { trimite(pachet2[i]); pauza(1000);}

pauza(10000);

//trimite pachet3 – cere IP Address

for(i=0;i<16;i++) { trimite(pachet3[i]); pauza(1000);}

//obtine ip1 pt a forma un pachet ACK pt el

obtineip1();

//obtine ip-ul telefonului: ip2

obtineip2();

//formeaza un pachet pt acceptarea acestui ip

for (i=0;i<4;i++) date[8+i]=ip1[i];

calculeazaFCSdate();

//trimite ACK pt ip1

trimite(0x7e); pauza(500);

for(i=0;i<14;i++) { trimite(date[i]); pauza(500); }

trimite(0x7e); pauza(500);

//formeaza REQ pt ip2

for (i=0;i<4;i++) date[8+i]=ip2[i];

date[2]=1;

date[3]=2;

calculeazaFCSdate();

//trimite REQ pt ip2

trimite(0x7e); pauza(500);

for(i=0;i<14;i++) { trimite(date[i]); pauza(500); }

trimite(0x7e); pauza(500);

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

asteaptapachet();

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

PORTB&=0b11111011; // stinge ledul de la pozitia unde este '0'

// CONECTARE TERMINATA !!

/// dupa conectare, trebuie luata pozitia de la GPS, bagata in pachetul UDP si trimisa

//ia datele de la GPS si le baga in mesaj[]

//zx=0;

while(1){

modactiv=0;

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

ID=zx; zx++;

PORTB|=0b00010000; //aprinde ledul de la pozitia unde este '1'

// selectie=0;

formeazamesajdelaGPS();

PORTB&=0b11101111; // stinge ledul de la pozitia unde este '0'

// if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

//formeaza pachetul UDP

//lungimesir=29+lungimemesaj;

formeazapachetUDP();

ipCHKS();

UDPCHKS();

//copie pachetUDP in date[]

//for(i=0;i<lungimesir;i++) date[i]=pachetUDP[i];

calculeazaFCSpachet();

trimite(0x7e);

pauza(500);

for(i=0;i<29;i++) { trimite(pachetUDP[i]); pauza(500); }

for(i=0;i<lungimemesaj;i++) { trimite(buffer[i]); pauza(500); }

trimite(fcsL);

pauza(500);

trimite(fcsH);

pauza(500);

trimite(0x7e);

pauza(500);

if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

}//end al doilea while(1)

//deconecteaza();

//esteOK();

asm("clrwdt");

//}//end primul while(1)

} // end functie

////////////////''''''''''''''''''''///////////////////////

// ––––––– –>SMS<– –––––- \\

void SMS(){

selectie=0;

modactiv=1;

pauza(20000); deconecteaza(); pauza(20000);

PORTA&=0b000000;

//PORTA|=0b000100; // aprinde ledul galben pt SMS

//PORTA&=0b101111; // stinge ledul rosu pt GPRS

while(1){

modactiv=1;

//asteapta un apel si ia numarul in nrapelant[]

asteaptaapel();

if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

inchide();

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

//ia datele de la GPS

formeazamesajdelaGPS();

//if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

trimiteSMS();

if(selectie) { pauza(20000); modactiv=PORTB>>7; return; }

} // end while(1)

} //end functie

//\\ ––––––- –>–<– –––––-//\\

//––––––––MAIN–––––––––-\\\

void main(){

modactiv=PORTB>>7;

PORTB|=0b00000001; //aprinde ledul de la pozitia unde este '1'

initializareseriala();

initializaremodem();

PORTB&=0b11111110; // stinge ledul de la pozitia unde este '0'

/*

PORTA|=0b000100; // aprinde ledul galben pt SMS

pauza(30000);

PORTA&=0b111011; // stinge ledul rosu pt GPRS

pauza(30000);

PORTA|=0b010000; // aprinde ledul galben pt SMS

pauza(30000);

PORTA&=0b101111; // stinge ledul rosu pt GPRS

pauza(30000);

if(modactiv) trimite('1');

else trimite('0');

*/

while(1){

//initializaremodem();

pauza(20000);

modactiv =(PORTB>>7);

pauza(20000);

selectie=0;

if(modactiv) { pauza(20000); SMS();}

else { pauza(20000); if(!modactiv) { pauza(20000); GPRS();} }

pauza(20000);

}//end while(1)

} //// END MAIN

//–––––––––––––––––––\\\

Bibliografie

1. Ion Marghescu, Nicolae Coțanis, Ștefan Nicolaescu – „Comunicații mobile terestre”, Ed. Tehnică, 1999;

2. Titu Băjenescu – „Sisteme personale de comunicații” , Ed. Teora, 2000;

3. Norocel Munteanu, Stefania Bărbălău – „Rețele mobile de telecomunicații. Sistemul GSM”, Ed. ALL Educational S.A., 1997;

4. Ion Bogdan – „Comunicații mobile”, Ed. Tehnopress, 2003;

5. www.italysoft.com/utility/converters/ascii-table.php – codul ASCII

6. www.connectone.com/NewsFiles/ Migrating_M2M_Applications_White_Paper1.pdf – Migrating M2M Applications to 2.5G and 3G Cellular Networks

7. www.item.ntnu.no/fag/tm8100/ Pensumstoff2004/GPRS_Tutorial.pdf – GPRS Tutorial

8. www.possi.de/gps/gps12xl-faq.html – Possi's Webseiten – Garmin 12XL GPS Receiver

9. vvv.it.kth.se/edu/gru/Fingerinfo/ telesys.finger/Mobile.VT96/GPS/xgps45co.mmp – Garmin GPS 45 GRMN/GRMN Simplified Communication Protocol …

10. www.gpsinformation.org/dale/interface.htm – Working with Garmin – Interface topics

11. www.garmin.com/support/pdf/iop_spec.pdf – GARMIN GPS Interface Specification

12. nmeatool.nmea2000.de/download/0183.pdf – The NMEA 0183 Protocol

13. www.cellular.co.za/gsm_ data-why-you-cant-use-analogue.htm – Why you can't use an analogue modem or an acoustic coupler over the GSM networks

14. www.web-ee.com/Schematics/FSK%20Modulator/FSK_Mod.htm – FSK Modulator

15. http://ww1.microchip.com/downloads/en/AppNotes/00724c.pdf – Using PICmicro® MCUs to Connect to Internet via PPP

16. ww1.microchip.com/downloads/en/AppNotes/00833b.pdf – The Microchip TCP/IP Stack

17. ww1.microchip.com/downloads/en/AppNotes/00731a.pdf – Embedding PICmicro® Microcontrollers in the Internet

18. www.freescale.com/files/ microcontrollers/doc/app_note/AN2120.pdf – Connecting an M68HC08 Family Microcontroller to an Internet Service Provider (ISP) Using the Point-to-Point Protocol (PPP)

19. www.netfor2.com/checksum.html – IP Checksum Introduction

20.http://www.freescale.com/files/microcontrollers/doc/app_note/AN2120.pdf – Connecting an M68HC08 Family Microcontroller to an …)

21. http://www.vijaymukhi.com/vmis/ppp.htm – PPP explicat cu exemple

22. http://www.vijaymukhi.com/vmis/pppprg.htm – programe in Windows95 pt PPP

23. RFC 768 – User Datagram Protocol

24. RFC 791 – Internet Protocol

25. RFC 792 – ICMP

26. RFC 1071 – Computing the Internet checksum

27. RFC 1332 – The PPP Internet Protocol Control Protocol (IPCP)

28. RFC 1334 – PPP Authentication Protocols

29. RFC 1661 – The Point-to-Point Protocol (PPP)

30. RFC 1662 – PPP in HDLC-like Framing

Similar Posts