PROGRAMUL DE STUDII REȚELE ȘI SOFTWARE DE TELECOMUNICAȚII [308014]

[anonimizat], CALCULATOARE ȘI INGINERIE ELECTRICĂ

PROGRAMUL DE STUDII REȚELE ȘI SOFTWARE DE TELECOMUNICAȚII

PROIECT DE DIPLOMĂ

Absolvent: [anonimizat] 2018

[anonimizat], CALCULATOARE ȘI INGINERIE ELECTRICĂ

PROGRAMUL DE STUDII REȚELE ȘI SOFTWARE DE TELECOMUNICAȚII

PROIECT DE DIPLOMĂ

DEZVOLTAREA UNUI PROTOCOL DE COMUNICAȚIE FĂRĂ CONEXIUNE REZISTENT LA ERORI PENTRU SISTEME MOBILE

Absolvent: [anonimizat] 2018

Lista figurilor

Fig. 2.1. Comparație între un protocol uman și protocolul unui rețele de calculatoare

Fig. 2.2. Model de comunicare: client-server

Fig. 2.3. Model de comunicare: peer-to-peer

Fig. 2.4. Model de comunicare: comunicare ierarhică

Fig. 2.5. Structura mesajului

Fig. 2.6. Reguli de comunicare

Fig. 2.7. Protocolul lui Lynch din “Network Protocol Design and Evaluation”, Stefan Rührup, 2009, pag. 33 [11]

Fig. 2.8. [anonimizat]. 2.9. [anonimizat]. 2.10. [anonimizat]. 2.11. Comunicare UDP

Fig. 2.12. Comunicare TFTP

Clientul A cere permisiunea să scrie date

Serverul S recunoaște cererea

Clientul A trimite pachete de date numerotate

Clientul A cere permisiunea pentru citire

Serverul S trimite pachetul de date 1

Clientul A recunoaște pachetul de date 1

Fig. 2.13. Comunicare TFTP

Fig. 2.14. Straturile unui protocol de comunicare TCP/IP

Fig. 2.15. Topologia de rețea TCP / IP

Fig. 2.16. Diagrama flux de date TCP / IP

Fig. 2.17. Modul ESP8266

Fig. 2.18. Arduino Mega 2560

Fig. 2.19. Arduino Uno top

Fig. 2.20. Arduino Uno bottom

Fig. 3.1. Proiectarea Hardware

Fig. 3.2. Proiectarea Software

Fig. 3.3. [anonimizat]. 3.4. [anonimizat]. 3.5. Schemă bloc tratare erori

Listă de abrevieri

ISO = Organizația Internațională pentru Standardizare

RF = Radio Frequency (Radio Frecvență)

SOC = System on a chip (Sistem pe un cip)

RRQ = Read Request (cerere de citire)

ACK = Acknowledge (confirmare)

LAN = Local Area Network (Rețea locală)

IEFT = Internet Engineering Task Force

IEEE = Institute of Electrical and Electronics Engineers

FTP = Protocolul de transfer de fișiere

TCP / IP = Transmission Control Protocol/Internet Protocol (Protocol de control al transmisiei/Protocol Internet)

UDP = User Datagram Protocol (Protocolul de utilizator datagram)

HTTP = Hypertext Transfer Protocol (Protocolul de transfer al hipertextului)

POP3 = Protocolul Post Office

WWW = World Wide Web

TCP = Transmission Control Protocol (Protocol de control al transmisiei)

IP = Internet Protocol (Protocol de internet)

IPTV = Internet Protocol television (Televiziune prin rețele IP sau Televiziune pe suport IP)

Voice over IP (VoIP)

TFTP = Trivial File Transfer Protocol (protocol de transfer de fișiere trivial)

DoD = Department of Defense (Departamentul Apărării)

FTP = Protocolul de transfer de fișiere

SMTP = Protocolul de transfer simplu de mesaje

DHCP = Protocolul de configurare a gazdei dinamice

ERR = Error (eroare)

USB = Universal Serial Bus

LNA = Low-noise amplifier (Amplificator de zgomot redus)

EEPROM = Electrically Erasable Programmable Read-Only Memory

SRAM = Static Random Access Memory

DCXO = Digitally-compensated crystal oscillator

I/O = In/Out (Intrare/Ieșire)

STBC = Space–time block code (Codul blocului spațiu-timp)

SDIO = Secure Digital Input Output (Ieșire/Intrare digitală securizată)

SPI = Serial Peripheral Interface (Interfață serială perifercă)

UART = Universal asynchronous receiver-transmitter (Receptor-transmițător asincron universal)

MIMO = multiple-input and multiple-output (multiple intrări și multiple ieșiri)

A-MPDU = Aggregated MAC Protocol Data Unit (protocol MAC agregat)

MAC = Media Access Control (Controlul accesului media)

DIY = Do It Yourself

PTC = Positive temperature coefficient (coeficient de temperatură pozitiv)

NTC = Negative temperature coefficient (coeficient de temperatură negativ)

CPU = Central processing unit (Unitate centrală de procesare)

Tema de proiectare

Tema proiectului de diplomă este ”Dezvoltarea unui protocol de comunicație fără conexiune, rezistent la erori pentru sisteme mobile”. În lucrare este prezentat modul în care s-a proiectat un sistem care să utilizeze un protocol de comunicație bazat pe UDP. Sunt tratate cazurile: eroare, pachet recepționat corect, recepție dublă, pachet primit în altă ordine și timeout.

Se va utiliza sistem machetă Arduino pentru citirea de date de la senzori, iar datele se vor trimite cu ajutorul modulului Wi-Fi ESP8266.

CAPITOLUL I

Introducere

Scopul lucrării

Scopul acestui proiect de diplomă este dezvoltarea unui protocol de comunicație bazat pe UDP (User Datagram Protocol), care să descarce date de pe un echipament mobil în condițiile minimizării traficului și tratarea erorilor de comunicație: eroare, pachet recepționat corect, recepție dublă, pachet primit în altă ordine și timeout.

Această lucrare se va folosi pentru actualizarea laboratoarelor ”Rețele de calculatoare”, ”Protocoale de comunicație” și ”Ingineria traficului”.

Actualitatea temei

CAPITOLUL II

Studiu teoretic

2.1. Protocol de comunicație

”Un protocol este un acord privind schimbul de informații într-o rețea distribuită.” (Holzmann 1991)

Un protocol definește, similar unei limbi:

Sintaxa: formarul pentru mesajele valide

Gramatica: reguli pentru schimbul de date

Semantica: un vocabular de mesaje și înțelesul acestora

Protocolul uman Protocolul unei rețele de calculatoare

Fig.2.1. Comparație între un protocol uman și protocolul unui rețele de calculatoare

În telecomunicații, un protocol de comunicație este un sitem de reguli care permit ca două sau mai multe entități ale sistemului de comunicație să transmită informații prin variația unei cantități fizice. Protocolul definește sintaxa de reguli, semantica, sincronizarea comunicațiilor și, de asemenea, posibile metode de corectare a erorilor. Protocoalele pot fi implementate prin harware, software sau o combinație a celor două.

Sistemele de comunicație utilizează formate bine definite pentru schimbul de mesaje. Fiecare mesaj este urmat de un răspuns predefinit pentru acea situație particulară.

Mai multe protocoale descriu deseori aspecte diferite ale unei singure comunicații.

Protocoalele de comunicație prin internet sunt publicate de către Internet Engineering Task Force (IEFT). IEEE se ocupă de rețelele prin cablu si fără fir, iar Organizația Internațională pentru Standardizare (ISO) se ocupă de alte tipuri.

În calculatoare, un protocol sau un protocol de comunicație reprezintă un set de reguli cu ajutorul cărora calculatoarele comunică între ele. Protocolul ne anunță ce parte din informație a ajuns și, de asemenea, cum se poate înceta comunicarea între calculatoare.

Există mii de protocoale de comunicații care sunt utilizate peste tot in comunicațiile analogige și digitale. Rețelele de calculatoare nu pot exista fără ele.

Regulile care definesc transmisiile de dare sunt numite protocoale.

Există multe proprietăți ale unei transmisii pe care un protocol le poate defini. Printre cele mai frecvente se numără:

mărimea pachetului,

viteza de transmisie,

tipurile de corectare a erorilor,

tehnicile de sincronizare,

maparea adreselor,

procesele de confirmare,

controlul fluxului,

controlul secvenței de pachete.

Printre protocoalele populare se numără: Protocolul de transfer de fișiere (FTP), TCP / IP, Protocolul de utilizator datagram (UDP), Protocolul de transfer al html (HTTP), Protocolul Post Office (POP3).

Etapele proiectării unui protocol de comunicație sunt:

Alegerea modelelor de comunicare și transmiterea datelor

Stabilirea obiectivele de proiectare

Alegerea formatului mesajului

Proiectarea structurii mesajului: format, câmpuri, tipuri de mesaje

Proiectarea regulilor de comunicare (secvențe)

Modele de comunicare:

Client-server: una dintre părți inițiază comunicarea, cealaltă răspunde.

Modelul client-server este o structură de aplicație distribuită care împarte sarcini între furnizorii unei resurse sau a unui serviciu, numiți servere și cei care solicită serviciile, numiți clienți. Deseori, clienții și serverele comunică printr-o rețea de calculatoare pe hardware separat, dar atât clientul, cât și serverul pot face parte din același sistem. Clienții inițiază sesiuni de comunicare cu servere, iar acestea din urmă așteaptă cererile primite. Câteva exemple de aplicații informatice care utilizează acest model sunt: E-mail, World Wide Web și imprimare în rețea.

Un singur computer poate rula simultan serverul web și fișierul software al serverului pentru a oferi diferite date către clienți care fac diferite tipuri de solicitări.

În general, un serviciu este o abstractizare a resurselor de calcul și un client nu trebuie să iși facă griji de modul în care funcționează serverul în timp ce îndeplinește cererea și transmite răspunsul. Clientul trebuie doar să înțeleagă răspunsul bazat pe protocolul de aplicație binecunoscut, adică conținutul și formatarea datelor pentru serviciul solicitat.

Clienții și serverele fac schimb de mesaje printr-un model solicitare-răspuns. Clientul trimite o cerere, iar serverul returnează un răspuns.

Pentru a comunica, computerele trebuie să folosească o limbă comună și trebuie să respecte regulile, astfel încât atât clientul cât și serverul să știe la ce să se aștepte. Limba și regulile de comunicare sunt definite printr-un protocol de comunicație.

Fig. 2.2. Model de comunicare: client-server

Peer-to-peer (De la egal la egal): orice persoană poate iniția comunicarea.

Peer-to-peer este o arhitectură de aplicație distribuită care împarte sarcini între persoanele care iau parte la comunicare. Niciun participant la comunicare nu este privilegiat, toți partenerii au aceleași drepturi.

Partenerii se ocupă de o parte din resursele lor, cum ar fi puterea de procesare, stocarea pe disc sau lățimea de bandă a rețelei, direct accesibile altor participanți la rețea, fără a fi necesară o coordonare centrală de către servere sau gazde stabile. Participanții sunt atât furnizori, cât și consumatori de resurse, spre deosebire de modelul tradițional client-server în care consumul și furnizarea de resurse se împart.

O rețea peer-to-peer este concepută în jurul noțiunii de noduri egale de tip peer care funcționează simultan atât precum "clienți", cât și ca "servere" către celelalte noduri din rețea. Acest model de aranjare a rețelei diferă de modelul client-server unde comunicarea este de obicei către și de la un server central.

Ca orice altă formă de software, aplicațiile peer-to-peer pot conține vulnerabilități. Ceea ce face acest lucru deosebit de periculos pentru software-ul peer-to-peer este totuși faptul că aplicațiile peer-to-peer acționează atât ca servere, cât și ca clienți, ceea ce înseamnă că aceștia pot fi mai vulnerabili pentru exploatările la distanță.

Principala utilizare a aplicațiilor peer-to-peer este de a descărca și încărca fișiere. În prezent, în afară de partajarea de fișiere, rețelele peer-to-peer au o diversitate de utilizări: mesagerie vocală, video sau scrisă, streaming media, rețele LAN, forumuri de discuții, etc.

Fig. 2.3. Model de comunicare: peer-to-peer

Comunicare ierarhică: mai multe persoane sunt organizate ierarhic și comunică doar in sensul indicat de săgeți, pe “ramurile copacului”.

Modelele de rețea ierarhice sunt algoritmi iterativi pentru crearea de rețele care sunt capabile să reproducă proprietățile unice ale topologiei fără scară și clusterizarea ridicată a nodurilor în același timp.

O organizație ierarhică este o structură organizațională în care fiecare entitate din organizație, cu excepția unuia, este subordonată unei singure entități. Această formă de aranjare este o formă de ierarhie. Într-o organizație, ierarhia constă, de obicei, dintr-un grup singular / grup de putere în vârf, cu niveluri ulterioare de putere sub ele. Acesta este modul dominant de organizare în rândul marilor organizații; cele mai multe corporații, guverne și religii organizate sunt organizații ierarhice cu diferite niveluri de conducere, putere sau autoritate.

Membrii structurilor organizaționale ierarhice comunică în principal cu superiorul lor imediat și cu subordonații imediați. Structurarea organizațiilor în acest mod este utilă parțial deoarece poate reduce cheltuielile de comunicare prin limitarea fluxului de informații, dar aceasta este, de asemenea, limitarea sa majoră.

Fig. 2.4. Model de comunicare: comunicare ierarhică

Modele de transmisie a datelor:

One-to-one: doar două părți sunt implicate in comunicare în același timp

Multicast: una sau mai multe părți transmit date mai multor părți

Broadcast: una sau mai multe părți transmit date tuturor părților în același timp

Fiecare dintre aceste modele poate fi folosit in diferite stagii ale comunicației.

Obiectivele proiectării unui protocol de comunicație

Un protocol de comunicație trebuie să fie:

Simpu

Nu face sarcinile simple să fie greu de realizat.

Nu furniza două modalități pentru a face același lucru.

Scalabil

Estimează numărul de clienți pentru server.

Proiectează protocolul astfel încât responsabilitățile să fie echilibrate.

Eficient

Minimizează traficul de date.

Minimizează numărul de comenzi.

Extensibil

Păstrează loc pentru posibile viitoare extensii.

Tipuri de mesaje

Există câte un tip de mesaj pentru fiecare aspect al comunicării.

Sunt trei categorii de mesaje:

Comenzi

Transfer de date

Control

Fiecare categorie poate include mai multe tipuri de mesaje.

Mesajele pentru comenzi:

Definesc stadiul dialogului dintre părți.

Abordeaza diferite aspecte ale comunicării:

Începutul sau sfârșitul comunicării

Descrie stadiul comunicării (autentificare, solicitare de stare, transfer de date)

Schimbarea stării (solicitare de schimbare in modul de transfer de date)

Schimbarea resurselor (solicitare pentru noi canale de comunicare)

Transferul de date

Mesaje care transportă date prin rețea.

Acestea sunt de obice trimise ca un răspuns la o comandă .

Datele sunt de obicei fragmentate in mai multe mesaje.

În afară de date, poate descrie:

Tipul formatului de date binare

Indicii pentru structurarea datelor (atunci când structura este flexibilă/dinamică)

Mărimea datelor, offset-ul sau secvența de informație

Tipul de bloc de date: ultimul/intermediary

Mesajele de control

Controlează dialogul dintre părți.

Aboredază multe aspecte ale comunicării:

Coordonarea (comfirmarea primirii, cerere pentru reîncercare);

Anulare sau întrerupere;

Verificare disponibilitate.

Structura mesajului:

Antetul conține câmpuri structurate care descriu datele reale din mesaje:

Tipul mesajului;

Comanda;

Dimensiunea părții principale;

Informații despre destinatar;

Informații despre secvența de mesaj;

Numărarea retrimiterilor.

Partea principală: datele reale care vor fi trimise:

Parametrii comenzilor;

Volumul util de date.

Fig. 2.5. Structura mesajului

Reguli de comunicare:

Împreună cu mesajul, aceasta este o altă parte esențială a protocolului;

Descrie secvențele de comenzi, date și mesaje de control, la fiecare etapă a comunicării, pentru toate părțile din sistem;

Trebuie să fie clar și complet specificat, cu descrieri detaliate ale fiecărui scenariu de comunicare (pentru fiecare caz posibil de interacțiune între persoane).

Diagramele secvențiale sunt mai mult decât utile. Un exemplu de diagramă este următorul:

Fig. 2.6. Reguli de comunicare

În figura de mai sus este explicată regula de comunicare a unui protocol. Clientul conectează parametrii 1 și 2 la server, iar acesta din urmă trimite un răspuns prin intermediul parametrului 1. Clientul cere parametrii de la server, iar acesta îi trimite datele solicitate. Clientul trimite un mesaj de confirmare, prin care confirmă recunoașterea datelor pe care le-a primit de la server și trimite mesaje de încheiere pentru parametrii 1 și 2. Serverul răspunde cu un mesaj de ok.

Componentele unui protocol de comunicații sunt:

Serviciul care trebuie asigurat de protocol

Presupunerile despre mediul în care protocolul a fost executat

Vocabularul mesajelor folosite pentru implementarea protocolului

Codificarea fiecărui mesaj din vocabular

Regulile de procedură păstrează coerența schimburilor de mesaje

Protocolul lui Lynch

Specificații:

Serviciul: Protocolul trebuie să permită o transmisie sigură completă a mesajelor duplex (transmisii simultane în ambele direcții). Transmisia mesajelor are ca răspuns o confirmare pozitivă sau negativă.

Mediul:

Doi utilizatori care împărtășesc un canal de comunicare.

Mesajele pot fi corupte, dar acestea nu sunt niciodată pierdute. Mesajele corupte sunt detectate și transformate în mesaje de eroare.

Vocabularul: Mesaje plus confirmare și eroare

Vocabular = {ACK, NACK, ERR}

Formatul mesajului: • date (char)

• ack flag (binar)

• eroare (binar)

Reguli de procedură (informal):

1. Dacă recepția anterioară a fost fără erori, bitul de confirmare al următoarei transmisii este 1; dacă recepția a fost eroare, bitul este 0.

2. Dacă bitul de confirmare a recepției anterioare a fost 0 sau recepția anterioară a fost eronată, retransmiteți mesajul vechi; altfel aduceți un mesaj nou pentru transmitere.

Fig. 2.7. Protocolul lui Lynch din “Network Protocol Design and Evaluation”, Stefan Rührup, 2009, pag. 33 [11]

Exemplu de comunicație-protocol Lynch:

Secvența A: a, b, c.

Secvența B: x, y, z.

Fig. 2.8. Exemplu de comunicație-protocol Lynch

Defecte de proiectare ale protocolului lui Lynch:

Transmisia nu mai continuă dacă ”get next char” nu returnează date.

Inițierea și terminarea nu sunt specificate.

Metode de reparare a erorilor:

Să se utilizeze mesaje de umplere astfel încât get_next_char să nu blocheze.

Inițierea prin trimiterea unui mesaj fals de eroare.

O altă posibilă problemă este atunci când un mesaj este lăsat deschis. Dacă un terminal acceptă toate mesajele fără eroare, atunci duplicatele nu pot fi detectate.

Fig. 2.9. Exemplu de problemă-protocol Lynch

Exemplu pentru problema duplicării:

Secvența A: a, b, c.

Secvența B: x, y, z.

Fig. 2.10. Exemplu pentru problema duplicării-protocol Lynch

De reținut:

Defectele de proiectare nu sunt întotdeauna evidente.

Anumite erori apar foarte rar. Acest lucru face foarte dificilă detectarea unui defect de proiectare.

Defectele sunt de obicei greu de rezolvat.

Chiar și protocoalele simple necesită un design bun.

2.2. TCP – Protocol de control al transmisiei

Protocolul de control al transmisiei (TCP) este responsabil pentru fragmentarea mesajului (date de la stratul de aplicație) în segmente TCP și reasamblarea lor la recepție. Nu este sigur că datele care ajung la dispozitivul de recepție sunt în aceeași ordine ca atunci când acestea au fost expediate, din cauza problemelor legate de fluxul rețelei sau de fluxul de pachete diferite către destinație. TCP este responsabil pentru păstrarea segmentelor neordonate în ordinea corectă și, de asemenea, asigură o livrare sigură prin retrimiterea oricărui lucru care se pierde în timpul călătoriei în rețea.

Fiabilitate: TCP este un protocol orientat spre conexiune. Când un fișier sau un mesaj se trimite acesta va fi livrat cu excepția cazului în care se pierde conexiunea. Dacă conexiunea s-a pierdut, server-ul va solicita partea pierdută. Nu există nicio corupție în timp ce se transferă un mesaj.

Conexiuni: înainte ca procesele de aplicație să poată trimite date utilizând TCP, dispozitivele trebuie să stabilească o conexiune. Conexiunile se fac între numerele de port ale expeditorului și ale dispozitivelor de recepție. O conexiune TCP identifică punctele terminale implicate în conexiune. Un număr de soclu este o combinație de adresă IP și număr de port, care poate identifica în mod unic o conexiune.

Ordinea datelor: Dacă trimiteți două mesaje de-a lungul unei conexiuni, una după alta, știți că primul mesaj va ajunge mai întâi acolo. Nu trebuie să vă faceți griji că datele sosesc în ordine greșită.

Greutate mare: – când datele fluxului TCP "sosesc" în ordine greșită, trebuie să se trimită din nou solicitările și toate piesele din secvență trebuie să fie readuse împreună, astfel încât este nevoie de un efort mai mare .

Full duplex: TCP asigură fluxuri de date simultane în ambele direcții

Streaming: Datele sunt citite ca un "stream", fără nimic deosebit unde se termină un pachet și începe un altul. Este posibil să existe mai multe pachete pe apel citit.

Exemple în care este utilizat: World Wide Web (portul Apache TCP 80), e-mail (portul SMTP TCP 25 Postfix MTA), File Transfer Protocol (portul FTP 21) și Secure Shell (portul OpenSSH 22)

2.3. UDP – User Datagram Protocol

UDP (User Datagram Protocol) este un protocol alternativ de comunicații la protocolul de control al transmisiei (Transmission Control Protocol – TCP), folosit în principal pentru stabilirea conexiunilor cu întârzieri reduse și pierderi de toleranță între aplicații pe Internet. Atât UDP cât și TCP rulează în fruntea protocolului de internet (IP) și sunt uneori denumite UDP / IP sau TCP / IP. Ambele protocoale trimit pachete de date scurte, numite datagrame.

Este unul dintre cei mai importanți membri ai protocolului internet. Cu ajutorul UDP-ului, aplicațiile computerizate pot trimite mesaje, numite datagrame, altor persoane dintr-o rețea IP.

UDP este un protocol simplu fără conexiune, care trimite pachetele integral, dar nu știm dacă pachetele ajung sau nu la destinație.

UDP este potrivit pentru scopuri în care verificarea și corectarea erorilor fie nu sunt necesare, fie se fac in aplicație. Acesta evită supraîncărcarea unei astfel de procesări in stiva de protocol. Aplicațiile care necesită un răspuns rapid în timp utilizează adesea UDP, deoarece pachetele pierdute sunt preferate față de așteptarea pachetelor întârziate din cauza retransmiterii, acest lucru nefiind o opțiune într-un sistem în timp real.

UDP este un protocol ideal pentru aplicațiile de rețea în care latența trebuie să fie minimă, cum ar fi jocurile, comunicațiile de voce și video, care pot suferi pierderi de date fără a afecta negativ calitatea percepută. În unele cazuri, tehnicile de picare a unor pachete sunt utilizate pentru a îmbunătăți calitatea audio și video în ciuda unor pierderi.

UDP poate fi, de asemenea, utilizat în aplicații care necesită transmisie de date fără pierderi atunci când aplicația este configurată pentru a gestiona procesul de retransmitere a pachetelor pierdute și aranjarea corectă a pachetelor primite. Această abordare poate contribui la îmbunătățirea ratei de transfer a datelor a fișierelor mari în comparație cu TCP.

Fiabilitate: UDP este un protocol fără conexiune. Când trimiteți un mesaj sau o dată, nu știți dacă va ajunge acolo, s-ar putea pierde pe drum; este posibil să existe corupție în timpul transferării unui mesaj.

Ordinea datelor : Dacă trimiteți două mesaje în același timp, nu știți in ce ordine vor ajunge la destinație.

Ușor: Nu se comandă mesaje, nu există conexiuni de urmărire etc. Aceasta înseamnă că este mult mai rapidă, iar sistemul de operare de rețea trebuie să facă foarte puține eforturi pentru a traduce datele din pachete.

Datagrame: Pachetele sunt trimise individual și sunt garantate a fi întregi în cazul în care acestea sosesc. Se trimite un pachet pentru fiecare apel citit.

Exemple în care este utilizat: Sistemul de nume de domeniu (DNS UDP port 53), aplicații media streaming, cum ar fi IPTV sau filme, Voice over IP (VoIP), Trivial File Transfer Protocol (TFTP) și jocuri multiplayer online etc.

În proiectul meu, am ales să folosesc protocolul UDP, deoarece doresc să realizez un protocol de comunicație fără conexiune și care să aibă o latență cât mai mică.

Pașii de stabilire a unei comunicații UDP pe partea de server sunt următorii:

Creați un socket cu funcția socket ();

Legați socket-ul la o adresă utilizând funcția bind ();

Trimiteți și primiți date prin intermediul recvfrom () și sendto ().

Fig. 2.11. Comunicare UDP

2.4. TFTP – protocol de transfer de fișiere trivial (banal)

TFTP este un protocol de transfer de fișiere simplu, care permite unui client să obțină un fișier sau să pună un fișier la distanță. Una dintre utilizările sale principale reprezintă faza incipientă de pornire a nodurilor dintr-o rețea locală. TFTP a fost utilizat pentru această aplicație deoarece este foarte simplu de implementat.

În TFTP, un transfer este inițiat de client, care trimite o solicitare de scriere sau de citire pentru un anumit fișier către server. Cererea poate conține, opțional, un set de parametri de transfer negociați, propuși de client. Dacă serverul recunoaște cererea, fișierul este trimis în blocuri fixe de lungime de 512 octeți, în mod implicit, sau numărul specificat în blocul negociat opțional. Fiecare bloc de date transferat, care de obicei face parte dintr-un singur pachet IP pentru a evita fragmentarea IP, trebuie să fie confirmat printr-un pachet de confirmare, înainte ca următorul bloc să poată fi trimis. Un pachet de date de lungime mai mică decât 512 octeți, sau dimensiunea negociată optional, semnalizează terminarea transferului de date.

Dacă un pachet de date se pierde în rețea, confirmarea de date nu va fi primită și se va cere retrimiterea ultimului pachet (care poate fi pachet de date sau o confirmare). Astfel, expeditorul va retrimite pachetul pierdut. Expeditorul trebuie să păstreze doar un pachet pentru retransmisie, deoarece confirmarea pasului de blocare garantează că toate pachetele trimise înainte au fost primite correct.

Se poate observa că ambele dispozitive implicate în transferul de date sunt considerate atât destinatari, cât și expeditori: unul trimite date și primește confirmări, iar celălalt trimite confirmări și primește date.

TFTP definește trei moduri de transfer:

netascii;

octet;

mail.

Netascii este o formă modificată a codului ASCII. Reprezintă o extensie pe 8 biți a spațiului de caractere ASCII pe 7 biți, de la 0x20 la 0x7F și opt caractere de control.

Octetul permite transferul de octeți arbitrari pe 8 biți, fișierul recepționat rezultat fiind identic octet cu octet cu cel trimis. Mai concret, dacă un client primește un fișier octet și apoi îl returnează, fișierul returnat trebuie să fie identic cu originalul.

Modul de transfer prin mail utilizează transferul Netascii, dar fișierul este trimis destinatarului prin e-mail, specificând adresa de e-mail a destinatarului ca nume de fișier.

TFTP utilizează UDP ca protocol de transport. O solicitare de transfer este întotdeauna inițiată ținând cont de portul 69, dar porturile de transfer de date sunt alese în mod independent de către expeditor și destinatar în timpul inițializării transferului. Porturile sunt alese la întâmplare conform parametrilor de rețea, de obicei din intervalul de porturi de scurtă durată.

Clientul A trimite un pachet pentru cerere de scriere (sau citire) către serverul S la numărul portului 69, care conține numele fișierului, modul de transfer și, opțional, orice opțiune negociată.

Serverul S răspunde cu ACK (recunoaștere) dacă opțiunile au fost folosite pentru cererea de scriere și direct cu pachetul de date pentru cererea de citire. Pachetul este trimis de la un port efemer, alocat aleatoriu, iar toate pachetele următoare pentru serverul S vor fi direcționate automat către acest port.

Clientul sursă trimite pachete de date numerotate către serverul destinație, toate mai puțin ultimul conținând un bloc complet de date (512 octeți). Serverul destinație răspunde cu pachetele numerotate recunoscute (ACK) pentru toate pachetele de date.

Ultimul pachet de date trebuie să conțină obligatoriu un număr mai mic decât un bloc complet de date (512 octeți) pentru a semnaliza că acest pachet este ultimul. Dacă dimensiunea fișierului transferat este un multiplu exact al dimensiunii blocului de date, slientul va trimite un pachet de date final care va conține 0 octeți de date.

Destinatarul răspunde la fiecare pachet de date cu ACK asociat pachetului. Expeditorul după ce primește ACK trece la trimiterea pachetului de date următor.

Dacă un ACK nu este primit, atunci se face retransmiterea respectivului pachet de date.

Clientul A cere permisiunea să scrie date.

Serverul S recunoaște cererea.

Clientul A trimite pachete de date numerotate.

Clientul A cere permisiunea pentru citire.

Serverul S trimite pachetul de date 1.

Clientul A recunoaște pachetul de date 1.

Fig. 2.12. Comunicare TFTP

Deoarece TFTP utilizează UDP, trebuie sa furnizeze propriul suport pentru transport și sesiuni. Fiecare fișier transferat prin TFTP constituie un schimb independent. În mod clasic, acest transfer este efectuat în etapa de blocare, cu un singur pachet (fie un bloc de date, fie o confirmare) alternativ în traficul de rețea în orice moment. Datorită acestei strategii a blocului de date, în loc să transmită o cantitate de blocuri de date lichide înainte de a întrerupe transferul așteptând o confirmare, TFTP are o viteză redusă de transfer, mai ales datorită legăturilor cu latență mare.

Considerații de securitate:

TFTP nu include mecanisme de logare sau de control al accesului. Trebuie să aveți grijă atunci când folosiți TFTP pentru transfer de fișiere unde este necesară autentificarea, controlul accesului, confidențialitatea sau verificarea integrității.

De reținut că aceste servicii de securitate ar putea fi furnizate deasupra sau sub stratul pe care lucrează TFTP. De asemenea, trebuie acordată atenție drepturilor unui proces server TFTP, pentru a nu încălca securitatea sistemului de fișiere al serverului. TFTP este adesea instalat cu controale, astfel încât numai fișierele care au acces de citire public să fie disponibile prin TFTP. De asemenea, listarea, ștergerea, redenumirea și scrierea fișierelor prin TFTP sunt, de obicei, nepermise.

În absența unei pierderi de pachete sau a altor erori, cererile fișierului TFTP se efectuează de obicei după cum urmează:

Clientul trimite o cerere de citire (RRQ) către serverul 69.

Serverul creează un process copil, care obține un port nou, portul S, din sistemul de operare.

Procesul copil trimite date din portul S.

Clientul primeste date și reține valoarea portului S. Acesta va verifica dacă fiecare data viitoare va sosi din același port.

Clientul trimite ACK (confirmarea) la portul S al serverului. Procesul copil al server-ului trimite al doilea pachet de date, de fiecare dată așteptând confirmarea înainte să trimită pachetul următor de date.

Procesul de transfer se oprește atunci când serverul trimite blocul final de date, cu o dimensiune mai mica de 512 octeți, iar clientul trimite confirmarea corespunzătoare.

Fig. 2.13. Comunicare TFTP

2.5. TCP/IP

”Internet protocol suite” (sau suita de protocoale Internet) reprezintă modelul conceptual și setul de protocoale de comunicații utilizate pe Internet și în rețele similare de calculatoare. Este cunoscut sub numele de TCP/IP, deoarece protocoalele fundamentale folosite sunt:

Protocolul de control al transmisiei (TCP);

Protocolul de Internet (IP).

Este uneori cunoscut sub numele de modelul Departamentului Apărării (DoD – Department of Defense), deoarece dezvoltarea metodei de rețea a fost finanțată de Departamentul Apărării al Statelor Unite.

Protocolul de internet oferă o comunicare de tip end-to-end cu specificare modului în care datele trebuie să fie împărțite în pachete, adresate, transmise, redirecționate și primite. Această funcționalitate este organizată în patru straturi de abstractizare care clasifică toate protocoalele în funcție de domeniul de aplicare al rețelei implicate. De la cel mai mic la cel mai înalt, straturile sunt:

stratul de legătură, care conține metode de comunicare pentru datele care rămân într-un singur segment de rețea (link);

stratul de internet, care asigură interconectarea între rețele independente;

stratul de transport care manipulează comunicarea gazdă-gazdă;

stratul de aplicație, care oferă schimb de date proces-la-proces pentru aplicații.

Fig. 2.14. Straturile unui protocol de comunicare TCP/IP

Stratul de legătură are domeniul de acoperire în rețea al conexiunii la rețeaua locală la care este atașată o gazdă. Acesta este stratul cel mai de jos al protocoalelor Internet, deoarece TCP / IP este proiectat să fie independent de hardware. Ca rezultat, TCP / IP poate fi implementat pe orice tehnologie de rețea hardware.

Stratul de legătură definește metodele de rețea, în cadrul domeniului de legătură al rețelei locale, pe care gazdele comunică fără routerele intermediare. Acest strat include protocoalele utilizate pentru a descrie topologia rețelei locale și interfețele necesare pentru a efectua transmiterea datagramelor din straturile de Internet către gazdele vecine următoare.

Acesta este și stratul în care pachetele pot fi selectate pentru a fi trimise prin intermediul unei rețele virtuale private sau al unui alt tunel de rețea.

Stratul internet are sarcina de a schimba datagrame între granițele rețelei. Acesta oferă o interfață uniformă de rețea care ascunde topologia actuală (aspect) a conexiunilor de rețea fundamentale. Acest strat definește structurile de adresare și de rutare utilizate pentru suita de protocoale TCP / IP. Protocolul primar în acest domeniu este Protocolul de Internet, care definește adresele IP. Funcția sa în rutare este de a transporta datagrame către următorul router IP care are conectivitatea la o rețea mai aproape de destinația finală a datelor.

Protocolul de Internet are două funcții de bază:

Adresarea și identificarea gazdei: Acest lucru este realizat cu un sistem ierarhic de adresare IP.

Pachetul de rutare: Aceasta este sarcina de bază de a trimite pachete de date (datagrame) de la sursă la destinație prin redirecționarea acestora către următorul router de rețea mai aproape de destinația finală.

Stratul de transport efectuează comunicații gazdă-gazdă pe gazde identice sau diferite și pe rețeaua locală sau pe rețelele aflate la distanță, separate de routere. Acesta oferă un canal pentru nevoile de comunicare ale aplicațiilor. UDP este protocolul de bază al transportului, oferind un serviciu datagram nesigur. Protocolul de control al transmisiei (TCP) asigură controlul fluxului, stabilirea conexiunilor și transmiterea fiabilă a datelor.

Deoarece IP oferă doar o livrare optimă a efortului, unele protocoale din stratul de transport oferă fiabilitate. De exemplu, TCP este un protocol orientat spre conexiune care abordează numeroase probleme de fiabilitate în furnizarea unui flux de octeți de încredere:

datele sosesc în ordine;

datele au o eroare minimă (adică, corectitudinea);

datele duplicate sunt aruncate;

pachetele pierdute sau aruncate sunt response;

include controlul congestionării traficului.

Protocolul User Datagram Protocol este un protocol datagram fără conexiune. La fel ca IP, este vorba despre un protocol "nesigur". Fiabilitatea este rezolvată prin detectarea erorilor utilizând un algoritm slab de control. UDP este în mod obișnuit utilizat pentru aplicații cum ar fi media streaming (audio, video, Voice over IP etc.) unde sosirea în timp scurt este mai importantă decât fiabilitatea sau pentru aplicații simple de interogare / răspuns.

Stratul de aplicație include protocoalele utilizate de majoritatea aplicațiilor pentru furnizarea de servicii de utilizator sau schimb de date de aplicație prin conexiunile de rețea stabilite prin protocoalele de nivel inferior. Aceasta poate include câteva servicii de bază de suport pentru rețea, cum ar fi protocoalele pentru rutare și configurarea gazdei. Exemplele de protocoale de nivel de aplicație includ: Protocolul de transfer al hipertextului (HTTP), Protocolul de transfer de fișiere (FTP), Protocolul de transfer simplu de mesaje (SMTP) și Protocolul de configurare a gazdei dinamice (DHCP). Datele codificate în conformitate cu protocoalele stratului de aplicație sunt încapsulate în unitățile protocol de strat (cum ar fi mesajele TCP sau UDP), care, la rândul lor, utilizează protocoale de nivel inferior pentru a realiza transferul real de date. Procesele sunt abordate prin intermediul porturilor care reprezintă, în esență, servicii.

Modelul TCP / IP nu ia în considerare specificul formatării și prezentării datelor și nu definește straturi suplimentare între aplicație și straturile de transport. Astfel de funcții fac parte din domeniul bibliotecilor și al interfețelor de programare a aplicațiilor.

Topologia de rețea:

Fig. 2.15. Topologia de rețea TCP / IP

Diagrama flux de date:

Fig. 2.16. Diagrama flux de date TCP / IP

2.7.Modul ESP8266

Modulul WiFi ESP8266 este un SOC autonom cu o stivă de protocoale integrate TCP / IP care poate oferi accesul oricărui microcontroler la rețeaua WiFi. ESP8266 este capabil să găzduiască o aplicație sau să descarce toate funcțiile de rețea Wi-Fi de la un alt procesor de aplicații. Fiecare modul ESP8266 vine pre-programat cu un firmware cu set de comenzi AT, ceea ce înseamnă că puteți să-l conectați doar la dispozitivul dumneavoastră Arduino și să obțineți cât mai multe proprietăți de WiFi.

Acest modul are o capacitate de procesare si stocare suficient de puternica, care ii permite sa fie integrat cu senzori si dispozitive specifice prin intermediul pinilor GPIO.

ESP8266 suportă APSD pentru aplicații VoIP și interfețe de co-existență Bluetooth, conține un RF auto-calibrat care îi permite să funcționeze în toate condițiile de funcționare și nu necesită părți RF externe.

Fig. 2.17. Modul ESP8266

Specificații:

802.11 b / g / n

Wi-Fi Direct (P2P), soft-AP

Protocol TCP / IP integrat

Comutator TR, balun, LNA si amplificator de putere integrate

PLL, DCXO, regulatoare si unitati de gestionare a energiei integrate

+19.5dBm putere iesire in modul 802.11b

Memorie flash 1MB

CPU-ul integrat de 32 bit cu consum redus de energie ar putea fi folosit ca procesor de aplicare

SDIO 1.1 / 2.0, SPI, UART

STBC, 1×1 MIMO, 2×1 MIMO

A-MPDU & A-MSDU aggregation & 0.4ms guard interval

Transmite pachete in < 2 ms

Consumul de energie in modul standby de < 1.0mW (DTIM3)

2.8. Arduino

Arduino este o companie de hardware și software de calculator open source, proiect și comunitate de utilizatori, care proiectează și produce microcontrolere cu o singură placă și kituri de microcontroler pentru construirea de dispozitive digitale și obiecte interactive care pot detecta și controla obiecte din lumea fizică. Produsele proiectului sunt distribuite ca hardware și software open source și care sunt licențiate sub licența GNU Lesser Public General (LGPL) sau GNU General Public License (GPL), care permit fabricarea plăcilor Arduino și distribuția de software de către oricine. Plăcile arduino sunt disponibile comercial în formă preasamblată sau ca truse de tip do-it-yourself (DIY).

Placa Arduino utilizează o varietate de microprocesoare și controlere. Plăcile sunt echipate cu seturi de pini digitali și analogici de intrare / ieșire (I / O) care pot fi interfațate cu diverse plăci de expansiune (scuturi) și alte circuite. Plăcile au interfețe de comunicații seriale, inclusiv Universal Serial Bus (USB) pe unele modele, care sunt utilizate pentru încărcarea programelor de pe calculatoarele personale. Microcontrolerele sunt în mod obișnuit programate utilizând un dialect de caracteristici din limbile de programare C și C ++. În plus față de utilizarea instrumentelor tradiționale de compilare, proiectul Arduino oferă un mediu integrat de dezvoltare (IDE) bazat pe proiectul de procesare a limbajului.

Proiectul Arduino a început în 2003 ca ​​un program pentru studenții de la Institutul de Design al Interacțiunii Ivrea din Ivrea, Italia, menit să ofere un mod ieftin și ușor pentru începători și profesioniști să creeze dispozitive care să interacționeze cu mediul lor folosind senzori și actuatori. Exemple comune de astfel de dispozitive destinate pasionaților de hobby-uri începători includ roboți simpli, termostate și detectoare de mișcare.

Numele Arduino provine dintr-un bar din Ivrea, Italia, unde se întâlneau unii dintre fondatorii proiectului.

Hardware

Arduino este un hardware open source. Proiectele de referință hardware sunt distribuite sub licență Creative Commons Attribution Share-Alike 2.5 și sunt disponibile pe site-ul web Arduino.

Deși design-urile hardware și software sunt disponibile gratuit sub licențele copyleft, dezvoltatorii au cerut ca numele Arduino să fie exclusiv pentru produsul oficial și să nu fie folosit pentru opere derivate fără permisiune. Documentul oficial privind utilizarea denumirii Arduino subliniază faptul că proiectul este deschis spre încorporarea muncii altora în produsul oficial.

Cele mai multe plăci Arduino constau dintr-un microcontroler AVR Atmel 8-bit (ATmega8, ATmega168, ATmega328, ATmega1280, ATmega2560) cu cantități diferite de memorie flash, pini și caracteristici.

Microcontrolerele Arduino sunt pre-programate cu un încărcător care simplifică încărcarea programelor pe memoria flash pe cip.

Placa Arduino expune majoritatea pinilor I / O ai microcontrolerului pentru a fi folosiți de alte circuite.

Software și instrumente de programare

Proiectul Arduino oferă mediul de dezvoltare integrat Arduino (IDE), care este o aplicație cross-platformă scrisă în limba de programare Java. Acesta a provenit din IDE pentru prelucrarea și cablarea limbilor. Acesta include un editor de coduri cu funcții precum tăierea și lipirea textului, căutarea și înlocuirea textului, indentarea automată, potrivirea parantezelor și evidențierea sintaxei și oferă mecanisme simple cu un singur clic pentru a compila și a încărca programe într-o placă Arduino. De asemenea, conține o zonă de mesaje, o consolă de text, o bară de instrumente cu butoane pentru funcții comune și o ierarhie a meniurilor de operare.

Un program scris cu IDE pentru Arduino este numit o schiță. Schițele sunt salvate pe computerul de dezvoltare ca fișiere text cu extensia .ino. Arduino Software (IDE) pre-1.0 salvează schițele cu extensia .pde.

Arduino IDE suportă limbile C și C ++ folosind reguli speciale de structurare a codurilor. Codul scris de utilizator necesită doar două funcții de bază pentru pornirea schiței (setup) și bucla principală de program (loop), care sunt compilate și legate de un program executiv ciclic cu un șir de unelte GNU. Arduino IDE utilizează un program (avrdude) pentru a converti codul executabil într-un fișier text în codificare hexazecimală care este încărcat în placa Arduino printr-un program din firmware-ul plăcii.

Natura open-source a proiectului Arduino a facilitat publicarea a numeroase biblioteci de software liber pe care alți dezvoltatori le folosesc pentru a își mări proiectele.

Structura programului

Un program minimal Arduino C / C ++ constă doar din două funcții:

setup (): Această funcție se folosește o dată când o schiță începe după pornire sau resetare. Aceasta este folosită pentru a inițializa variabilele, modurile de intrare și ieșire cu pini și alte biblioteci necesare în schiță.

loop (): După ce a fost apelată funția setup (), bucla de funcții () este executată în mod repetat în programul principal. Aceasta controlează placa până când este oprită sau resetată.

Cele mai multe plăci Arduino conțin o diodă care emite lumină (LED) și un rezistor de sarcină conectat între pinul 13 și masă, ceea ce este o caracteristică convenabilă pentru multe teste și funcții ale programului.

Fig. 2.18. Arduino Mega 2560

Arduino Uno

Arduino Uno este un microcontroler care are 14 pini digitali de intrare/ieșire, 6 intrări analogice, o mufă de alimentare, o mufă pentru conectarea prin USB, un boton de resetare.

Acesta poate fi pornit prin conectarea lui cu ajutorul unui cablu USB la calculator sau alimentat cu ajutorul unui adaptor sau cu o baterie. Selecția sursei de alimentare se face automat. Arduino Uno poate comunica cu un calculator, cu alt Arduino sau chiar cu alte microcontrolere.

Arduino Uno este prima plăcuță cu un USB integrat și reprezintă un model de referință pentru platforma Arduino. Aceasta este ușor de folosit și este capabilă să preia date din mediul înconjurător prin intermediul senzorilor, dar și să desfășoare acțiuni cu ajutorul motoarelor, luminilor și a altor tipuri de dispositive mecanice.

Procesorul rulează cod scris într-un limbaj de programare asemănător limbajului de programare C++.

Fig. 2.19. Arduino Uno top

Fig. 2.20. Arduino Uno bottom

Specificații:

Microcontroler: ATmega328

Tensiune de lucru: 5V

Tensiune de intrare (recomandat): 7-12V

Tensiune de intrare (limita): 6-20V

Pini digitali: 14 (6 PWM output)

Pini analogici: 6

Curent per pin I/O: 40 mA

Curent 3.3V: 50 mA

Memorie Flash: 32 KB (ATmega328) 0.5 KB pentru bootloader

SRAM: 2 KB (ATmega328)

EEPROM: 1 KB (ATmega328)

Clock Speed: 16 MHz

CAPITOLUL III

Proiectarea sistemului

3.1. Proiectarea Hardware

Fig. 3.1. Proiectarea Hardware

3.2. Proiectarea Software

Fig. 3.2. Proiectarea Software

3.2.1. Program Arduino

Funcția SETUP

Fig. 3.3. Funcția SETUP – Arduino

Funcția LOOP

Fig. 3.4. Funcția LOOP – Arduino

3.2.2. Program JAVA

Schemă bloc tratare erori

Fig. 3.5. Schemă bloc tratare erori

CAPITOLUL IV

Implementarea sistemului

4.1.Instalare modul ESP8266

Instalați aplicația Arduino IDE, versiunea 1.8 sau mai nouă. Versiunea curentă o puteți găsi pe website-ul Arduino: https://www.arduino.cc/en/main/software

Selectați versiunea pentru windows:

Aici găsiți programul Arduino pe care îl descărcați și îl instalați.

Porniți Arduino și deschideți fereastra ”Preferences” din meniul ”File”:

Introduceți http://arduino.esp8266.com/stable/package_esp8266com_index.json în caseta ”Additional Boards Manager URLs”.

Se pot adăuga mai multe adrese URL, separate prin virgulă.

Deschideți ”Boards Manager” din meniul ”Tools” și instalați platforma esp8266 (și nu uitați să selectați modulul vostru ESP8266 din Tools->meniul Board, după instalare).

Selectați Generic ESP8266 Module astfel:

4.2. Senzor de temperatură

Termistorii sunt componente simple, ieftine și exacte, care facilitează obținerea datelor de temperatură. Aceștia sunt senzori analogi, deci codul este relativ simplu în comparație cu senzorii digitali de temperatură care necesită biblioteci speciale și o mulțime de coduri.

Termistorii sunt rezistențe variabile care își schimbă rezistența la temperatură. Aceștia sunt clasificați după modul în care răspund la schimbările de temperatură.

În cazul termistorului Coeficient de temperatură negativă (NTC), rezistența scade odată cu creșterea temperaturii. În termistorii cu coeficient de temperatură pozitivă (PTC), rezistența crește odată cu creșterea temperaturii.

Termistoarele NTC sunt cele mai frecvente, și acesta este tipul pe care îl vom folosi în acest tutorial. Termistoarele NTC sunt fabricate dintr-un material semiconductor (cum ar fi un oxid de metal sau ceramică) care a fost încălzit și comprimat pentru a forma un material de conducție sensibil la temperatură.

Deoarece termistorul este un rezistor variabil, va trebui să măsuram rezistența înainte de a putea calcula temperatura. Cu toate acestea, Arduino nu poate măsura direct rezistența, poate măsura numai tensiunea.

Arduino va măsura tensiunea la un punct dintre termistor și un rezistor cunoscut. Acest lucru este cunoscut ca un divizor de tensiune.

Ecuația pentru un divizor de tensiune este:

VOUT = VIN

În ceea ce privește divizorul de tensiune într-un circuit cu termistor, variabilele din ecuația de mai sus sunt:

VOUT : Tensiunea între termistor și rezistor

VIN : Vcc, 5V

R1 : Valoarea rezistenței cunoscute

R2 : Rezistența termistorului

Această ecuație poate fi rearanjată și simplificată pentru a afla valoarea lui R2, rezistența termistorului:

R2 = R1

Această ecuație este folosită pentru a converti rezistența termistorului la o citire a temperaturii.

CONECTAREA CIRCUITULUI

Se vor conecta termistorul și rezistorul la Arduino astfel:

Valoarea rezistorului ar trebui să fie aproximativ egală cu rezistența termistorului. În acest caz, rezistența termistorului meu este de 100K Ohmi, deci rezistența mea este de asemenea 100K Ohmi.

4.3. Senzor de lumină

Echipament necesar:

Echipamentul de care aveți nevoie este destul de fundamental. LED-urile pe care le folosesc sunt doar pentru feedback vizual.

Arduino Uno

Fotorezistor

Rezistența la 220 de ohmi

Breadboard

Fire pentru breadboard

Opțional:

3 rezistențe x 100 ohmi

1 x LED roșu

1 x LED verde

1 X LED galben

Circutul Arduino pentru senzorul de lumină

Senzorul de lumină sau, de asemenea, cunoscut ca un fotorezistor este piesa de echipament pe care o vom folosi pentru a ne spune cât de luminat sau întunecat este. Când este întunecat rezistorul va avea o rezistență foarte mare de până la 10 megohms, iar când este lumină, va avea probabil doar câteva sute de ohmi de rezistență.

LED-urile din circuitul meu vor reprezenta cantitatea curentă de rezistență pe fotorezistor. Verde va fi atunci când se află la o rezistență scăzută (multă lumină); galben va fi atunci când este o rezistență medie peste LDR (Shady), iar roșul va reprezenta o rezistență ridicată (întuneric).

Circuitul se va conecta în felul următor:

4.4. Senzor de îndoire

Un senzor de flexiune sau un senzor de îndoire este un senzor care măsoară cantitatea de deflexie sau îndoire. De obicei, senzorul este blocat la suprafață, iar rezistența elementului senzorului variază prin îndoirea suprafeței. Deoarece rezistența este direct proporțională cu cantitatea de îndoire, este utilizată ca goniometru (instrument optic pentru măsurarea unghiurilor) și deseori numită potențiometru flexibil.

Cea mai simplă modalitate de a încorpora un senzor de îndoire în proiect este utilizarea acestuia într-un divizor de tensiune. Acest circuit necesită un rezistor. Multe valori de la 10KΩ la 100KΩ vor funcționa. O valoare între valorile rezistenței minime și maxime este de obicei o alegere bună. Vom folosi un rezistor de 47kΩ în acest exemplu. Iată legătura:

Schematicul este:

Rezistența de 47kΩ este conectată pe partea cu ground-ul și senzorul de îndoire pe partea 5V, ceea ce înseamnă că atunci când rezistența senzorului de flexie crește (înseamnă că senzorul se îndoaie), tensiunea pe A0 va scădea.

Un senzor de îndoire se poate cumpăra și costă între 10 și 50 de dolari. Eu am ales să îl confecționez singură.

Materiale necesare:

Bandă izolatoare

2 bucăți din foiță de cupru

O bucată de plastic

O foaie de hârtie

2 Fire

Se lipesc cele două fire de cele două bucăți din cupru, cu fludor:

Una dintre cele două bucăți de cupru se lipește pe banda izolatoare:

Bucata de plastic se lipește pe bandă izolatoare, iar foița de cupru peste bucata de plastic:

Bucata de hârtie se lipește pe una dintre cele două componente obținute:

Se asamblează senzorul:

4.5. Program Arduino

4.5.1. Funcția SETUP

În funcția Setup() care se execută o singură data, se execută urmatoarele:

Serial.begin(115200);

Serial.println();

Se deschide portul serial și se setează rata de date în biți pe secundă (baud) pentru transmisia de date în serie la 115200.

Se tipăresc date către portul serial, ca text ASCII citit de om.

Serial.printf("Connecting to %s ", ssid);

WiFi.begin(ssid, password);

char* ssid = "Clicknet-1949";

char* password = "CRS2EMF6TLGSJ";

Se tipărește pe ecran mesajul cu adresa la care se va conecta, după care se inițializează setările de rețea ale bibliotecii WiFi și se oferă starea curentă.

SSID (Service Set Identifier) reprezintă numele rețelei Wi-fi la care se va conecta.

while (WiFi.status() != WL_CONNECTED)

{

delay(500);

Serial.print(".");

}

Aceasta reprezintă o funcție care se execută la infinit, până când WiFi-ul va fi conectat. În interiorul acestei funcții se aplică o întârziere de 500ms și se afișează pe ecran un ”.” la fiecare executare. Se va ieși din buclă doar în momentul în care statusul WiFi-ul va fi conectat, afișat cu ajutorul următoarei comenzi:

Serial.println(" connected");

Udp.begin(localUdpPort);

Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);â

unsigned int localUdpPort = 4210;

Se inițializează biblioteca și setările pentru rețeaua Wi-Fi UDP și se afișează pe ecran portul UDP și IP-ul de unde urmează să fie primite date, portul care a fost inițializat cu o anumită valoare.

4.5.2. Funcția LOOP

În funcția loop, care se execută la infinit, se execută următoarele:

int packetSize = Udp.parsePacket();

Se inițializează variabila packetSize cu ajutorul funcției Udp.parsePacket(), care verifică prezența unui pachet UDP și raportează dimensiunea acestuia.

if (packetSize)

{

………….

}

Udp.endPacket();

Dacă se primesc pachete UDP se execută instrucțiunile pe care le voi explica mai jos, după care se apelează funcția Udp.endPacket() care returnează 1 dacă pachetul a fost transmis corect și 0 dacă a apărut o eroare sau pachetul s-a pierdut.

În interiorul condiției avem:

Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());

Se afișează pe ecran date despre pachetul care a fost primit, portul, dimensiunea pachetului, adresa IP.

char incomingPacket[255];

int len = Udp.read(incomingPacket, 255);

if (len > 0)

{

incomingPacket[len] = 0;

}

Serial.printf("UDP packet contents: %s\n", incomingPacket);

Variabila len primește date UDP despre pachetul care sosește. Dacă len este mai mare decât 0, atunci variabila incomingPacket primește 0 și se tipărește pe ecran conținutul pachetului UDP.

Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());

Începe o conexiune pentru a scrie date UDP la conexiunea la distanță, de la IP-ul și portul respective.

int ThermistorPin = 0;

Se declară pinul de la care va fi citită valoarea de la senzorul de temperatură.

int Vo;

Vo = analogRead(ThermistorPin);

Se declară o variabilă în care urmează să se memoreze valoarea citită de la senzorul de temperatură.

float R1 = 10000;

Se inițializează variabila R1 cu valoarea rezistenței, masurată în ohmi.

float logR2, R2, T, Tc;

float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

R2 = R1 * (1023.0 / (float)Vo – 1.0);

logR2 = log(R2);

T = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2));

Tc = T – 273.15;

Serial.print(Tc);

Serial.println(" C");

Se calculează temperatura în funcție de valoarea citită de la senzor și se tipărește pe ecran valoarea obținută. Această valoare este memorată în variabila Tc.

int lightSensorPin = A0;

Se declară pinul de la care va fi citită valoarea de la senzorul de lumină.

int analogValue = 0;

analogValue = analogRead(lightSensorPin);

Serial.println(analogValue);

Valoarea primită de la senzor se memorează în variabila analogValue, după care se tipărește pe ecran.

int FLEX_PIN = A0;

Se declară pinul de la care va fi citită valoarea de la senzorul de îndoire.

const float VCC = 4.98;

Constanta VCC primește valoarea măsurată a pinului de 5V de la Arduino.

const float R_DIV = 47000.0;

const float STRAIGHT_RESISTANCE = 37300.0;

Constanta STRAIGHT_RESISTANCE reprezintă rezistența pe care o are senzorul de îndoire atunci când este drept.

const float BEND_RESISTANCE = 90000.0;

Constanta BEND_RESISTANCE reprezintă rezistența pe care o are senzorul de îndoire atunci când este îndoit la 90 de grade.

int flexADC = analogRead(FLEX_PIN);

În variabila flexADC se memorează valoarea citita de la senzorul de îndoire.

float flexV = flexADC * VCC / 1023.0;

float flexR = R_DIV * (VCC / flexV – 1.0);

Serial.println("Resistance: " + String(flexR) + " ohms");

Se calculează și se afișează pe ecran rezistența corespunzătoare fiecărei măsurări.

float angle = map(flexR, STRAIGHT_RESISTANCE, BEND_RESISTANCE,

0, 90.0);

Se estimează unghiul de îndoire al senzorului în funcție de rezistența acestuia, comparând-o cu rezistența atunci când senzorul este drept și cu cea atunci când senzorul este îndoit la 90 de grade.

delay(500);

Se introduce o întarziere de 500ms, interval de timp la care se va face citirea informațiilor de la senzori.

Serial.printf("Pachetul UDP conține: %s\n", incomingPacket);

Se afișează pe ecran ”Pachetul UDP conține:” urmat de mesajul pe care îl recepționăm.

Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());

Se trimite un răspuns către adresa IP și portul de la care se primesc pachete.

int nr = 1;

nr = nr + 1;

Se declară o variabilă nr care reprezintă numărului pachetului care va fi trimis, iar cu ajutorul acesteia se poate testa dacă au fost recepționate toate pachetele, s-au trimis în ordine, avem pachete duplicate sau avem pachete picate.

String test = "";

test = "";

test.concat(nr);

test.concat(",");

test.concat("Temperatura:");

test.concat(Tc);

test.concat(",");

test.concat("Lumina:");

test.concat(analogValue);

test.concat(",");

test.concat(String(angle));

test.concat(" ");

Se declară un șir de caractere „test”, în care se concatenează valorile primite de la senzori, separate între ele prin virgulă, iar prima valoare din șir reprezintă numărul pachetului care va fi trimis.

test.toCharArray(replyPacket, test.length());

Udp.write(replyPacket);

Se memorează valorile conținute in șirul ”test”, în char-ul replyPachet, care va fi trimis prin comanda Udp.write(replyPacket).

Udp.endPacket();

Această funcție se apelează după scrierea datelor UDP la conexiunea la distanță. Returnează 1 dacă pachetul a fost trimis cu succes și 0 dacă au apărut erori.

CAPITOLUL V

Testarea sistemului

Network Emulation (netem)

Utilitarul netem asigură funcționalitatea necesară pentru a testa protocoalele de rețea prin

emularea proprietăților unei rețele. Se asigură suportul pentru a emula:

– introducerea latentei în traficul de rețea;

– variația întârzierii (jitter) în mod variabil sau constant;

– pierderea de pachete;

– duplicarea pachetelor;

– reordonarea pachetelor.

Netem este configurat cu ajutorul utilitarul în linie de comandă tc.

Introducerea latentei în traficul de rețea

Latenta are următoarele componente:

– întârzierea de propagare;

– întârzierea de transmitere;

– întârzierea datorata cozii de procesare a echipamentelor de rețea (in special ruterele).

Pentru a adăuga o întârziere se folosește comanda:

tc qdisc add dev eth0 root netem delay 200ms

Variația întârzierii (jitter)

Variația întârzierii este un factor important de influenta a calității comunicatiilor de voce.

Dacă se dorește ca întârzierea introdusa să se apropie de cea a unei rețele reale, se poate folosi

comanda:

tc qdisc change dev eth0 root netem delay 100ms 10ms

Aceasta comandă introduce o întârziere de 100ms cu o variație de +/- 10ms.

Uneori variațiile latentei dintr-o rețea nu sunt complet aleatorii. Când ruterele devin

încărcate datorita numărului mare de conexiuni sau a traficului susținut în rețea, ele introduc

perioade mai lungi în care variațiile latentei cresc sau scad puțin în jurul unor valori. Pentru a

emula acest comportament se poate adăuga pentru fiecare pachet o întârziere a cărei variație sa

difere de valoarea anterioara doar intr-un anumit procent. Această variație poate fi simulata cu

ajutorul comenzii:

tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Pierderea de pachete

Comunicațiile prin rețele de calculatoare au uneori pierderi de pachete, datorate

echipamentelor defecte, coliziunilor cu alte pachete, mediului de transmisie care introduce

zgomot în semnalul transmis cât și din alte cauze. Este important sa analizam ce se întâmpla în

aceste situații cu aplicațiile pe care le folosim.

Pentru a simula pierderea de pachete se folosește comanda:

tc qdisc change dev eth0 root netem loss 0.2%

Aici 2 din 1000 pachete este eliminat în mod aleatoriu. Similar cu situația anterioara, se

poate preciza suplimentar o marja de variație a pierderii de pachete, în acest mod se pot simula

pierderile grupate de pachete.

tc qdisc change dev eth0 root netem loss 0.3% 25%

Duplicarea pachetelor

Dacă un protocol de rețea decide ca un pachet este pierdut și trebuie retransmis,

dar acesta este în realitate doar întârziat în mod excesiv, este posibil ca pachete duplicat sa

ajungă la destinație. Deoarece aceasta situație care nu este de dorit poate să apară destul de rar,

pentru a o simula cu netem se introduce:

tc qdisc change dev eth0 root netem duplicate 1%

Reordonarea pachetelor

Atunci când circula pe internet, pachetele sunt direcționate (rutate) individual în funcție

de condițiile din rețea. Este prin urmare posibil ca pachetele să nu ajungă la destinație urmând

același traseu deci pot sa ajungă în ordine diferita de cea în care au fost trimise. Acest

comportament poate fi simulat cu netem prin comanda:

tc qdisc change dev eth0 root netem gap 5 delay 10ms

Această comanda permite trecerea unui singur pachet din 5 fără întârziere, celelalte 4

având o întârziere de 10ms. În acest mod ordinea în care pachetele ajung la destinație va fi

modificata.

CAPITOLUL VI

Concluzii

BIBLIOGRAFIE

[1] Designing a protocol, Dan Cosma, http://labs.cs.upt.ro/labs/sprc/html/res/Designing%20a%20Protocol.pdf

[2] The TCP/IP Guide, Charles M. Kozierok, http://www.tcpipguide.com/free/t_TCPSlidingWindowAcknowledgmentSystemForDataTranspo-4.htm

[3] What are WebSockets?, PUSHER, https://pusher.com/websockets

[4] WebSocket, Wikipedia, https://en.wikipedia.org/wiki/WebSocket

[5] TFTP, Wikipedia, https://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol

https://intronetworks.cs.luc.edu/current/html/udp.html

[6] Internet Protocol Suite, Wikipedia, https://en.wikipedia.org/wiki/Internet_protocol_suite

[7] Ethernet, Wikipedia, https://en.wikipedia.org/wiki/Ethernet

[8] Arduino, Wikipedia, https://en.wikipedia.org/wiki/Arduino

[9] Arduino Uno, RoboFun, https://www.robofun.ro/arduino_uno_v3

[10] Arduino Uno REV3, https://store.arduino.cc/usa/arduino-uno-rev3

[11] Network Protocol Design and Evaluation, Stefan Rührup, 2009

[12] Arduino Light Sensor, https://arduinomylifeup.com/arduino-light-sensor/

[13] Make an Arduino Temperature Sensor, http://www.circuitbasics.com/arduino-thermistor-temperature-sensor-tutorial/

[14] Flex Sensor Hookup Guide, https://learn.sparkfun.com/tutorials/flex-sensor-hookup-guide

[15] Modelarea traficului în Linux, Laborator Rețele, https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxsYWJvcmF0b3J1cGl0fGd4OjM5ODI3YmUyZjg2NWY2Yzk

[16] Hierarchical network model, Wikipedia, https://en.wikipedia.org/wiki/Hierarchical_network_model

[17] Peer-to-peer, Wikipedia, https://en.wikipedia.org/wiki/Peer-to-peer

[18] Client-server model, Wikipedia, https://en.wikipedia.org/wiki/Client%E2%80%93server_model

Anexe

Similar Posts