Sunteți pe pagina 1din 12

Universitatea POLITEHNICA București

Facultatea de Electronică, Telecomunicații și Tehnologia Informației

Proiect
Informatică Aplicată

Studenți:
Anghel Alexandru-Dan
Sinani Kristi

Grupa 422B
Echipa B19
Considerente teoretice ............................................................................................... 1 
Protocoalele și metodele de comunicație utilizate..................................................... 2 
WI-Fi ....................................................................................................... 4 
HTTP (HyperText Transfer Protocol) ..................................................... 5 
JSON (JavaScript Object Notation) ........................................................ 6 
Implementare ............................................................................................................. 7 
Concluzii .................................................................................................................... 7 
Bibliografie ................................................................................................................ 8 
Anexe (Codul complet).............................................................................................. 8 

Introducere

Franciza Marvel este un univers vast și extrem de popular de supereroi și


povești care a captivat publicul încă de la începuturile sale. Totul a început în
1939, când Timely Comics, care mai târziu avea să devină Marvel Comics, a
publicat prima sa carte de benzi desenate, „Marvel Comics #1”. Franciza
Marvel a obținut un succes remarcabil, combinând acțiune palpitantă,
povestiri convingătoare și personaje memorabile.

În acest proiect, ne-am propus să creăm un ghid care să ofere informații


despre filmele Marvel, cum ar fi detalii despre data lansării, box office etc.
Pentru a crea acest ghid, am folosit un modul ESP32, care dispune de WI-FI,
Bluetooth Clasic respectiv Bluetooth Low Energy. Noi am folosit Bluetooth
Classic pentru realizarea proiectului.

Considerente teoretice
Modulul ESP32 reprezintă o placă de dezvoltare extrem de versatilă și
puternică, care se bazează pe chipsetul ESP8266 dezvoltat de către compania
Espressif Systems. Acesta combină funcționalitatea unui microcontroler puternic
cu conectivitate Wi-Fi și Bluetooth, oferind o gamă largă de aplicații și posibilități
de dezvoltare.
Pag. 1
Acesta este foarte apreciat în comunitatea tehnologică datorită puterii de calcul
considerabilă, fiind echipat cu un procesor dual-core Xtensa de 32 de biți, ce
rulează la frecvențe de până la 240 MHz.
Memoria flash integrată permite stocarea programelor și datelor, iar modulul
dispune și de o cantitate generoasă de memorie RAM pentru a susține aplicații
complexe.
Modulul dispune de interfețe UART, SPI, I2C și GPIO, permițând conectarea
la o mare varietate de senzori, actuatori și alte dispozitive periferice. Mai mult
decât atât, modulul poate fi programat folosind diverse medii de dezvoltare, cum
ar fi Arduino IDE, MicroPython sau ESP-IDF, oferind dezvoltatorilor o
multitudine de opțiuni și abordări.
Suportul pentru Wi-Fi îl face ușor de conectat la rețele wireless, permițând
transmiterea și recepționarea datelor prin intermediul internetului. De asemenea,
prezența modulului Bluetooth deschide calea către comunicarea fără fir cu
dispozitive periferice, cum ar fi smartphone-uri, tablete sau alte dispozitive
inteligente.

Protocoalele și metodele
de comunicație utilizate
Bluetooth Classic (BTC)
Bluetooth Classic este o tehnologie fără fir de comunicație utilizată pentru a
stabili legături între dispozitive electronice.
Bluetooth Classic utilizează o frecvență radio de 2,4 GHz pentru a permite
transferul de date, la o rată maximă de 3Mbps, între dispozitivele compatibile.
Aceasta oferă o rază de acțiune de aproximativ 100 de metri în condiții ideale.
Pag. 2
Comunicația Bluetooth Classic este o comunicație serială, permițând
transmisia bidirecțională a datelor.
Printre cele mai cunoscute profiluri Bluetooth Classic se numără profilul
pentru căști și difuzoare audio (A2DP și AVRCP), profilul pentru telecomandă
(HID), profilul pentru transfer de fișiere (FTP) și profilul pentru modem (DUN).
Aceste profiluri permit utilizatorilor să se conecteze și să interacționeze cu diferite
dispozitive într-un mod specific și optimizat pentru fiecare aplicație. De asemenea,
Bluetooth Classic oferă și suport pentru protocoale de comunicație serie, cum ar fi
RS-232, permițând conectarea și controlul dispozitivelor cu porturi seriale.
Cu toate acestea, tehnologia Bluetooth Classic a fost înlocuită în mare
măsură de către Bluetooth Low Energy (BLE) în ceea ce privește aplicațiile IoT și
dispozitivele cu consum redus de energie.

Bluetooth Low Energy (BLE)


Bluetooth Low Energy (BLE, BTLE) este o tehnologie fără fir bazată pe
Bluetooth care facilitează conexiunile pe distanțe mici, de 5 ... 10 m. BLE a fost
creat de Nokia la începutul anului 2006 sub numele de Bluetooth Low End
Extension, pentru ca în octombrie același an să fie numită Wibree. Tehnologia a
fost comercializată ca Bluetooth Smart, iar integrarea în versiunea 4.0 a pecificației
de bază a fost finalizată la începutul anului 2010.

Pag. 3
WI-Fi
Tehnologia Wi-Fi (Wireless Fidelity) este o soluție de comunicare
fără fir ce permite dispozitivelor să se conecteze la internet și să comunice între ele
prin intermediul unor rețele locale sau la distanță scurtă. Este una dintre cele mai
răspândite și utilizate tehnologii de conectivitate wireless.

Wi-Fi se bazează pe standardele definite de către Institute of Electrical and


Electronics Engineers (IEEE), în special standardul IEEE 802.11. Aceste standarde
stabilesc reguli și protocoale pentru transmiterea datelor prin unde radio, utilizând
frecvențele de 2,4 GHz sau 5 GHz. Fiecare dispozitiv Wi-Fi are un adaptor Wi-Fi
care permite transmiterea și recepționarea semnalelor radio Wi-Fi.

Principalele avantaje ale tehnologiei Wi-Fi includ:

1. Conectivitate fără fir: Wi-Fi permite dispozitivelor să se conecteze la


rețele locale fără utilizarea cablurilor fizice, oferind o libertate de
mișcare și flexibilitate în plasarea dispozitivelor.

2. Acces la internet: Prin conectarea la un router Wi-Fi sau la alte puncte


de acces, dispozitivele pot accesa internetul și pot naviga pe web,
utiliza aplicații online, trimite și recepționa e-mailuri și multe altele.

3. Comunicare între dispozitive: Tehnologia Wi-Fi permite


dispozitivelor să comunice între ele într-o rețea locală. Aceasta
facilitează partajarea fișierelor, imprimarea în rețea, jocurile
multiplayer și alte activități de colaborare.

Pag. 4
4. Viteză și performanță: Wi-Fi oferă transfer de date rapid și
performanță sporită în funcție de standardul utilizat (de exemplu,
802.11ac, 802.11ax). Aceasta permite streaming-ul video fără
întreruperi, descărcarea rapidă de fișiere și utilizarea eficientă a
aplicațiilor online.

5. Securitate: Standardele Wi-Fi includ protocoale și metode de


securitate, cum ar fi WPA2 (Wi-Fi Protected Access 2), care ajută la
protejarea rețelei Wi-Fi împotriva accesului neautorizat și a atacurilor
cibernetice.

6. Interoperabilitate: Dispozitivele Wi-Fi sunt interoperabile, ceea ce


înseamnă că majoritatea dispozitivelor compatibile Wi-Fi pot
comunica între ele, indiferent de producător sau model.

HTTP (HyperText Transfer Protocol)


  Tehnologia HTTP (Hypertext Transfer Protocol) este un protocol de
comunicare utilizat în transferul de informații între servere și clienți pe internet.
Acesta este un protocol fundamental pentru World Wide Web și formează baza
pentru interacțiunea dintre utilizatori și site-uri web.

HTTP este bazat pe modelul client-server, unde clientul (de exemplu, un


browser web) solicită informații de la server, iar serverul furnizează răspunsul
corespunzător. Comunicarea se realizează prin intermediul cererilor și răspunsurilor
HTTP, care sunt mesaje structurate și formate conform unor reguli și convenții
specifice.
Codurile de stare al raspunsurilor HTTP sunt clasificate în 5 categorii.
Acestea sunt:
• 1xx - erori informaționale: această clasă a status-ului indică un
răspuns provizoriu al serverului și conține numai linia de status (de răspuns) sau
alte aplicații opționale. Aceste status-uri pot fi ignorate.

• 2xx - răspuns reușit: clasa de răspuns/status ce indică utilizatorului


că cererea a fost primită, înțeleasă și acceptată cu succes.

Pag. 5
• 3xx - redirecționări: această clasă de răspuns/status indică faptul că
acțiunile următoare vor trebui făcute de browser pentru a putea fi îndeplinita
cererea.
• 4xx - erori ale utilizatorilor: această clasă de mesaje/statusuri este
folosită în cazurile în care utilizatorul ar putea greși formularea cererii.
• 5xx - erori de server: răspunsurile/status-urile ce încep cu
unitatea/cifra 5 indică cazurile în care serverul e conștient de greșelile produse sau
e incapabil să execute cererea.

JSON (JavaScript Object Notation)


JSON (JavaScript Object Notation) este un format ușor de schimb
de date. Este ușor pentru oameni să citească și să scrie. Este ușor pentru mașini să
analizeze și să genereze. Se bazează pe un subset al standardului limbajului de
programare JavaScript. JSON este un format de text care este complet independent
de limbaj, dar utilizează convenții familiare programatorilor din familia de limbaje
C, inclusiv C, C++, C#, Java, JavaScript, Perl, Python și multe altele. Aceste
proprietăți fac din JSON un limbaj ideal pentru schimbul de date.
  JSON este construit pe două structuri:

• O colecție de perechi nume/valoare. În diferite limbi, acest lucru este


realizat ca obiect, înregistrare, structură, dicționar, tabel hash, listă cu cheie sau
matrice asociativă.
• O listă ordonată de valori. În majoritatea limbilor, acest lucru este
realizat ca o matrice, vector, listă sau secvență. Acestea sunt structuri de date
universale. Practic, toate limbajele de programare moderne le suportă într-o formă
sau alta. Este logic ca un format de date care este interschimbabil cu limbaje de
programare să se bazeze și pe aceste structuri.

Pag. 6
Implementare

În urma conectării smartphone-ului la modulul ESP32 prin intermediul


aplicației “ProiectIA”, utilizatorul poate vedea datele din API-ul cu filmele
Marvel prin apăsarea butonului “Get Data”. În urma apelului metodei de primire a
datelor prin apăsarea butonului “Get Data”, aplicația trimite o notificare modulului
ESP32 de tipul “getData”, modulul fiind conectat în prealabil la internet. Modulul
porneste un request de tipul GET la linkul API-ului și prelucrează răspunsul astfel:
se deserializeaza JSON-ul primit, datele conținute sunt introduse în JSON-ul creat
pentru a fi trimis către aplicație, respectând parametrii impuși, se serializeaza
JSON-ul creat și este setată valoarea creată pentru a fi citită de aplicație. În urma
acestor pași, în aplicație va fi afișată o listă cu filme Marvel

Dacă utilizatorul vrea să afle informații în plus cu privire la vreun film din,
poate sa apese butonul “Details”. În urma apăsării acestui buton, aplicația trimite
iarăși o notificare modulului de tipul “getDetails”, numai că în plus vă trimite și
ID-ul episodului respectiv. Modulul va prelua ID-ul folosind funcția “TeamId” și
va trimite un request de tipul “GetDetails” la URL-ul API-ului, cu parametrul de
ID primit. De asemenea, dacă codul răspunsului este 200, înseamnă că request-ul a
fost îndeplinit cu succes iar modulul va trimite datele către aplicație urmând aceiași
pasi că la metoda de tip getData().

Concluzii
În urma realizarii acestui proiect, am aflat o nouă metoda foarte folositoare
de a extrage datele dintr-un API, utilizând un modul ESP32 și o conexiune WIFI.
Această metoda ajută la o gestionare mai buna a resurselor smartphone-ului
deoarece toate resursele alocate pentru extragerea de date provine din modulul
ESP32. O astfel de metodă de gestionare a datelor previne pe utilizatorul de
smartphone din a accesa baza de date care a fost folosită pentru acest proiect și
totodată din a o modifica, fiind un punct de plecare pentru continuarea de a
dezvolta aplicații de backend.
Pag. 7
Bibliografie
• https://www.espressif.com/sites/default/files/documentation/esp8685-
wroom01_datasheet_en.pdf
• https://en.wikipedia.org/wiki/ESP32
• https://www.bluetooth.com/learn-about-bluetooth/tech-overview/
• https://en.wikipedia.org/wiki/Wi-Fi
• https://www.json.org/json-en.html
• https://southpark.fandom.com/wiki/South_Park •
https://www.google.ro/imghp?hl=ro

Anexe (Codul complet)


#include <Arduino.h> 
#include <BluetoothSerial.h> 
#include <ArduinoJson.h> 
#include <WiFi.h> 
#include <HTTPClient.h> 
 
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) 
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it 
#endif 
 
#define btcServerName "ESP32_MarvelMovies" 
 
BluetoothSerial SerialBT; 
 
String data = ""; 
String teamId = ""; 
 
void handleAction(String action, DynamicJsonDocument doc) { 
  if (action == "getNetworks") { 
    teamId = doc["teamId"].as<const char*>(); 
    String ssid = doc["ssid"].as<const char*>(); 
    String password = doc["password"].as<const char*>(); 
    String id = doc["id"].as<const char*>(); 
 
    int n = WiFi.scanNetworks(); 

Pag. 8
    for (int i = 0; i < n; i++) { 
      DynamicJsonDocument networkDoc(1024); 
      networkDoc["ssid"] = WiFi.SSID(i); 
      networkDoc["strength"] = WiFi.RSSI(i); 
      networkDoc["encryption"] = WiFi.encryptionType(i); 
      networkDoc["teamId"] = teamId; 
 
      String response; 
      serializeJson(networkDoc, response); 
      SerialBT.println(response); 
    } 
  } 
  else if (action == "connect") { 
    String ssid = doc["ssid"]; 
    String password = doc["password"]; 
 
    WiFi.begin(ssid.c_str(), password.c_str()); 
    unsigned long startTime = millis(); 
 
    while (WiFi.status() != WL_CONNECTED && millis() ‐ startTime < 10000) { 
      delay(100); 
    } 
 
    DynamicJsonDocument responseDoc(1024); 
    responseDoc["ssid"] = ssid; 
    responseDoc["connected"] = WiFi.status() == WL_CONNECTED; 
    responseDoc["teamId"] = teamId; 
 
    String response; 
    serializeJson(responseDoc, response); 
    SerialBT.println(response); 
  } 
  else if (action == "getData" || action == "getDetails") { 
    HTTPClient http; 
 
    if (action == "getData") { 
      http.begin("http://proiectia.bogdanflorea.ro/api/marvel‐movies/movies"); 
    } 
    else if (action == "getDetails") { 
      String id = doc["id"]; 
      http.begin("http://proiectia.bogdanflorea.ro/api/marvel‐movies/movie?id=" + 
id); 
    } 
 
    int httpResponseCode = http.GET(); 
 

Pag. 9
    if (httpResponseCode > 0) { 
      String payload = http.getString(); 
      DynamicJsonDocument responseDoc(15000); 
      DeserializationError error = deserializeJson(responseDoc, payload); 
 
      if (!error) { 
        if (action == "getData") { 
          for (JsonVariant v : responseDoc.as<JsonArray>()) { 
            DynamicJsonDocument movieDoc(1024); 
            movieDoc["id"] = v["id"]; 
            movieDoc["name"] = v["title"]; 
            movieDoc["image"] = v["cover_url"]; 
            movieDoc["teamId"] = teamId; 
 
            String response; 
            serializeJson(movieDoc, response); 
            SerialBT.println(response); 
          } 
        } 
        else {  // getDetails 
          DynamicJsonDocument detailDoc(1024); 
          detailDoc["id"] = responseDoc["id"]; 
          detailDoc["name"] = responseDoc["title"]; 
          detailDoc["image"] = responseDoc["cover_url"]; 
          detailDoc["description"] = responseDoc["overview"]; 
          detailDoc["teamId"] = teamId; 
          detailDoc["release_date"] = responseDoc["release_date"]; 
          detailDoc["box_office"] = responseDoc["box_office"]; 
          detailDoc["duration"] = responseDoc["duration"]; 
          detailDoc["trailer_url"] = responseDoc["trailer_url"]; 
          detailDoc["directed_by"] = responseDoc["directed_by"]; 
          detailDoc["phase"] = responseDoc["phase"]; 
          detailDoc["saga"] = responseDoc["saga"]; 
          detailDoc["chronology"] = responseDoc["chronology"]; 
          detailDoc["post_credit_scenes"] = responseDoc["post_credit_scenes"]; 
          detailDoc["imdb_id"] = responseDoc["imdb_id"]; 
 
          String response; 
          serializeJson(detailDoc, response); 
          SerialBT.println(response); 
        } 
      } 
    } 
 
    http.end(); 
  } 

Pag. 10

 
void setup() { 
  Serial.begin(9600); 
  SerialBT.begin(btcServerName); 
 
  WiFi.mode(WIFI_MODE_STA); 
  WiFi.disconnect(); 

 
void loop() { 
  while (SerialBT.available() > 0) { 
    char received = SerialBT.read(); 
    if (received == '\n') { 
      DynamicJsonDocument doc(1024); 
      DeserializationError error = deserializeJson(doc, data); 
 
      if (!error) { 
        String action = doc["action"]; 
        handleAction(action, doc); 
      } 
 
      data = ""; 
    } 
    else { 
      data += received; 
    } 
  } 
 
  delay(20); 

 

Pag. 11

S-ar putea să vă placă și