# Stocarea datelor de locație ![O prezentare grafică a lecției](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.ro.jpg) > Prezentare grafică realizată de [Nitya Narasimhan](https://github.com/nitya). Click pe imagine pentru o versiune mai mare. ## Chestionar înainte de lecție [Chestionar înainte de lecție](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## Introducere În lecția anterioară, ai învățat cum să folosești un senzor GPS pentru a captura date de locație. Pentru a utiliza aceste date pentru a vizualiza locația unui camion încărcat cu alimente și traseul său, acestea trebuie trimise către un serviciu IoT în cloud și apoi stocate undeva. În această lecție vei învăța despre diferitele moduri de a stoca date IoT și cum să stochezi datele din serviciul tău IoT folosind cod serverless. În această lecție vom acoperi: * [Date structurate și nestructurate](../../../../../3-transport/lessons/2-store-location-data) * [Trimiterea datelor GPS către un IoT Hub](../../../../../3-transport/lessons/2-store-location-data) * [Căi fierbinți, calde și reci](../../../../../3-transport/lessons/2-store-location-data) * [Gestionarea evenimentelor GPS folosind cod serverless](../../../../../3-transport/lessons/2-store-location-data) * [Conturi de stocare Azure](../../../../../3-transport/lessons/2-store-location-data) * [Conectarea codului serverless la stocare](../../../../../3-transport/lessons/2-store-location-data) ## Date structurate și nestructurate Sistemele informatice lucrează cu date, iar aceste date vin în diverse forme și dimensiuni. Ele pot varia de la numere simple, la cantități mari de text, la videoclipuri și imagini, și la date IoT. Datele pot fi de obicei împărțite în una dintre cele două categorii - *date structurate* și *date nestructurate*. * **Date structurate** sunt date cu o structură bine definită, rigidă, care nu se schimbă și de obicei se potrivesc cu tabele de date cu relații. Un exemplu este detaliile unei persoane, inclusiv numele, data nașterii și adresa. * **Date nestructurate** sunt date fără o structură bine definită, rigidă, inclusiv date care pot schimba structura frecvent. Un exemplu este documentele, cum ar fi documentele scrise sau foile de calcul. ✅ Fă un pic de cercetare: Poți să te gândești la alte exemple de date structurate și nestructurate? > 💁 Există și date semi-structurate care sunt structurate, dar nu se potrivesc în tabele fixe de date. Datele IoT sunt de obicei considerate date nestructurate. Imaginează-ți că adaugi dispozitive IoT la o flotă de vehicule pentru o fermă comercială mare. Ai putea dori să folosești dispozitive diferite pentru diferite tipuri de vehicule. De exemplu: * Pentru vehiculele agricole, cum ar fi tractoarele, vrei date GPS pentru a te asigura că lucrează pe câmpurile corecte. * Pentru camioanele de livrare care transportă alimente către depozite, vrei date GPS, precum și date despre viteză și accelerație pentru a te asigura că șoferul conduce în siguranță, și date despre identitatea șoferului și pornire/oprire pentru a te asigura că respectă legile locale privind orele de lucru. * Pentru camioanele frigorifice, vrei și date despre temperatură pentru a te asigura că alimentele nu se încălzesc sau răcesc prea mult și nu se strică în timpul transportului. Aceste date pot varia constant. De exemplu, dacă dispozitivul IoT se află în cabina unui camion, datele pe care le trimite pot varia pe măsură ce remorca se schimbă, de exemplu trimițând date despre temperatură doar atunci când este utilizată o remorcă frigorifică. ✅ Ce alte date IoT ar putea fi capturate? Gândește-te la tipurile de încărcături pe care le pot transporta camioanele, precum și la datele de întreținere. Aceste date variază de la vehicul la vehicul, dar toate sunt trimise către același serviciu IoT pentru procesare. Serviciul IoT trebuie să fie capabil să proceseze aceste date nestructurate, stocându-le într-un mod care permite căutarea sau analiza, dar funcționează cu structuri diferite ale acestor date. ### Stocare SQL vs NoSQL Bazele de date sunt servicii care îți permit să stochezi și să interoghezi date. Bazele de date vin în două tipuri - SQL și NoSQL. #### Baze de date SQL Primele baze de date au fost Sisteme de Management al Bazelor de Date Relaționale (RDBMS), sau baze de date relaționale. Acestea sunt cunoscute și sub numele de baze de date SQL datorită limbajului Structured Query Language (SQL) utilizat pentru a interacționa cu ele pentru a adăuga, elimina, actualiza sau interoga date. Aceste baze de date constau într-un schemă - un set bine definit de tabele de date, similar cu o foaie de calcul. Fiecare tabel are mai multe coloane denumite. Când inserezi date, adaugi un rând în tabel, punând valori în fiecare dintre coloane. Acest lucru păstrează datele într-o structură foarte rigidă - deși poți lăsa coloanele goale, dacă vrei să adaugi o nouă coloană trebuie să faci acest lucru în baza de date, populând valori pentru rândurile existente. Aceste baze de date sunt relaționale - în sensul că un tabel poate avea o relație cu altul. ![O bază de date relațională cu ID-ul tabelului User care se referă la coloana user ID din tabelul purchases, și ID-ul tabelului products care se referă la coloana product ID din tabelul purchases](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.ro.png) De exemplu, dacă stochezi detaliile personale ale unui utilizator într-un tabel, ai avea un fel de ID unic intern pentru fiecare utilizator care este utilizat într-un rând dintr-un tabel care conține numele și adresa utilizatorului. Dacă apoi vrei să stochezi alte detalii despre acel utilizator, cum ar fi achizițiile sale, într-un alt tabel, ai avea o coloană în noul tabel pentru ID-ul utilizatorului. Când cauți un utilizator, poți folosi ID-ul său pentru a obține detaliile personale dintr-un tabel și achizițiile sale din altul. Baze de date SQL sunt ideale pentru stocarea datelor structurate și pentru atunci când vrei să te asiguri că datele se potrivesc cu schema ta. ✅ Dacă nu ai folosit SQL înainte, ia un moment să citești despre el pe [pagina SQL de pe Wikipedia](https://wikipedia.org/wiki/SQL). Unele baze de date SQL cunoscute sunt Microsoft SQL Server, MySQL și PostgreSQL. ✅ Fă un pic de cercetare: Citește despre unele dintre aceste baze de date SQL și capacitățile lor. #### Baze de date NoSQL Baze de date NoSQL sunt numite NoSQL deoarece nu au aceeași structură rigidă ca bazele de date SQL. Ele sunt cunoscute și sub numele de baze de date de documente, deoarece pot stoca date nestructurate, cum ar fi documente. > 💁 În ciuda numelui lor, unele baze de date NoSQL îți permit să folosești SQL pentru a interoga datele. ![Documente în foldere într-o bază de date NoSQL](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.ro.png) Baze de date NoSQL nu au o schemă predefinită care limitează modul în care sunt stocate datele, în schimb poți insera orice date nestructurate, de obicei folosind documente JSON. Aceste documente pot fi organizate în foldere, similar cu fișierele de pe computerul tău. Fiecare document poate avea câmpuri diferite față de alte documente - de exemplu, dacă stocai date IoT de la vehiculele tale agricole, unele ar putea avea câmpuri pentru datele accelerometrului și vitezei, altele ar putea avea câmpuri pentru temperatura din remorcă. Dacă ai adăuga un nou tip de camion, cum ar fi unul cu cântare integrate pentru a urmări greutatea produselor transportate, atunci dispozitivul tău IoT ar putea adăuga acest nou câmp și ar putea fi stocat fără modificări ale bazei de date. Unele baze de date NoSQL cunoscute includ Azure CosmosDB, MongoDB și CouchDB. ✅ Fă un pic de cercetare: Citește despre unele dintre aceste baze de date NoSQL și capacitățile lor. În această lecție, vei folosi stocarea NoSQL pentru a stoca date IoT. ## Trimiterea datelor GPS către un IoT Hub În lecția anterioară, ai capturat date GPS de la un senzor GPS conectat la dispozitivul tău IoT. Pentru a stoca aceste date IoT în cloud, trebuie să le trimiți către un serviciu IoT. Din nou, vei folosi Azure IoT Hub, același serviciu IoT în cloud pe care l-ai utilizat în proiectul anterior. ![Trimiterea telemetriei GPS de la un dispozitiv IoT către IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.ro.png) ### Sarcină - trimite date GPS către un IoT Hub 1. Creează un nou IoT Hub folosind nivelul gratuit. > ⚠️ Poți consulta [instrucțiunile pentru crearea unui IoT Hub din proiectul 2, lecția 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) dacă este necesar. Amintește-ți să creezi un nou Grup de Resurse. Denumește noul Grup de Resurse `gps-sensor`, iar noul IoT Hub un nume unic bazat pe `gps-sensor`, cum ar fi `gps-sensor-`. > 💁 Dacă încă ai IoT Hub-ul din proiectul anterior, îl poți reutiliza. Amintește-ți să folosești numele acestui IoT Hub și Grupul de Resurse în care se află atunci când creezi alte servicii. 1. Adaugă un nou dispozitiv la IoT Hub. Denumește acest dispozitiv `gps-sensor`. Obține șirul de conexiune pentru dispozitiv. 1. Actualizează codul dispozitivului tău pentru a trimite datele GPS către noul IoT Hub folosind șirul de conexiune al dispozitivului din pasul anterior. > ⚠️ Poți consulta [instrucțiunile pentru conectarea dispozitivului tău la un IoT din proiectul 2, lecția 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) dacă este necesar. 1. Când trimiți datele GPS, fă-o sub formă de JSON în următorul format: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. Trimite date GPS la fiecare minut pentru a nu depăși alocarea zilnică de mesaje. Dacă folosești Wio Terminal, amintește-ți să adaugi toate bibliotecile necesare și să setezi ora folosind un server NTP. Codul tău va trebui, de asemenea, să se asigure că a citit toate datele de pe portul serial înainte de a trimite locația GPS, folosind codul existent din lecția anterioară. Folosește următorul cod pentru a construi documentul JSON: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` Dacă folosești un dispozitiv IoT virtual, amintește-ți să instalezi toate bibliotecile necesare folosind un mediu virtual. Pentru Raspberry Pi și dispozitivul IoT virtual, folosește codul existent din lecția anterioară pentru a obține valorile de latitudine și longitudine, apoi trimite-le în formatul JSON corect cu următorul cod: ```python message_json = { "gps" : { "lat":lat, "lon":lon } } print("Sending telemetry", message_json) message = Message(json.dumps(message_json)) ``` > 💁 Poți găsi acest cod în folderul [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) sau [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device). Rulează codul dispozitivului tău și asigură-te că mesajele ajung în IoT Hub folosind comanda CLI `az iot hub monitor-events`. ## Căi fierbinți, calde și reci Datele care curg de la un dispozitiv IoT către cloud nu sunt întotdeauna procesate în timp real. Unele date necesită procesare în timp real, altele pot fi procesate puțin mai târziu, iar altele pot fi procesate mult mai târziu. Fluxul de date către diferite servicii care procesează datele la momente diferite este denumit căi fierbinți, calde și reci. ### Calea fierbinte Calea fierbinte se referă la datele care trebuie procesate în timp real sau aproape de timp real. Ai folosi datele din calea fierbinte pentru alerte, cum ar fi primirea de notificări că un vehicul se apropie de un depozit sau că temperatura dintr-un camion frigorific este prea mare. Pentru a utiliza datele din calea fierbinte, codul tău ar răspunde la evenimente imediat ce sunt primite de serviciile tale cloud. ### Calea caldă Calea caldă se referă la datele care pot fi procesate la scurt timp după ce au fost primite, de exemplu pentru rapoarte sau analize pe termen scurt. Ai folosi datele din calea caldă pentru rapoarte zilnice despre kilometrajul vehiculelor, folosind datele colectate în ziua precedentă. Datele din calea caldă sunt stocate imediat ce sunt primite de serviciul cloud într-un tip de stocare care poate fi accesat rapid. ### Calea rece Calea rece se referă la datele istorice, stocând datele pe termen lung pentru a fi procesate ori de câte ori este nevoie. De exemplu, ai putea folosi calea rece pentru a obține rapoarte anuale despre kilometrajul vehiculelor sau pentru a rula analize pe trasee pentru a găsi ruta cea mai optimă pentru reducerea costurilor de combustibil. Datele din calea rece sunt stocate în depozite de date - baze de date concepute pentru stocarea unor cantități mari de date care nu se vor schimba și pot fi interogate rapid și ușor. De obicei, ai avea un job regulat în aplicația ta cloud care ar rula la un moment regulat în fiecare zi, săptămână sau lună pentru a muta datele din stocarea căii calde în depozitul de date. ✅ Gândește-te la datele pe care le-ai capturat până acum în aceste lecții. Sunt date din calea fierbinte, caldă sau rece? ## Gestionarea evenimentelor GPS folosind cod serverless Odată ce datele ajung în IoT Hub, poți scrie cod serverless pentru a asculta evenimentele publicate pe endpoint-ul compatibil Event-Hub. Aceasta este calea caldă - aceste date vor fi stocate și utilizate în lecția următoare pentru raportarea traseului. ![Trimiterea telemetriei GPS de la un dispozitiv IoT către IoT Hub, apoi către Azure Functions printr-un trigger Event Hub](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.ro.png) ### Sarcină - gestionează evenimentele GPS folosind cod serverless 1. Creează o aplicație Azure Functions folosind CLI-ul Azure Functions. Folosește runtime-ul Python și creează-o într-un folder numit `gps-trigger`, folosind același nume pentru proiectul aplicației Functions. Asigură-te că creezi un mediu virtual pentru aceasta. > ⚠️ Poți consulta [instrucțiunile pentru crearea unui proiect Azure Functions din proiectul 2, lecția 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) dacă este necesar. 1. Adaugă un declanșator de eveniment IoT Hub care utilizează punctul final compatibil Event Hub al IoT Hub. > ⚠️ Poți consulta [instrucțiunile pentru crearea unui declanșator de eveniment IoT Hub din proiectul 2, lecția 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) dacă este necesar. 1. Setează șirul de conexiune al punctului final compatibil Event Hub în fișierul `local.settings.json` și folosește cheia pentru acea intrare în fișierul `function.json`. 1. Folosește aplicația Azurite ca emulator de stocare locală. 1. Rulează aplicația de funcții pentru a te asigura că primește evenimente de la dispozitivul tău GPS. Asigură-te că dispozitivul IoT este de asemenea activ și trimite date GPS. ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## Conturi de stocare Azure ![Logo-ul Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.ro.png) Conturile de stocare Azure reprezintă un serviciu de stocare generală care poate stoca date în diverse moduri. Poți stoca date sub formă de blob-uri, în cozi, în tabele sau ca fișiere, toate în același timp. ### Stocare de tip Blob Cuvântul *Blob* înseamnă obiecte binare mari, dar a devenit termenul pentru orice date nestructurate. Poți stoca orice date în stocarea de tip blob, de la documente JSON care conțin date IoT, la fișiere de imagini și filme. Stocarea de tip blob are conceptul de *containere*, niște "buckets" denumite în care poți stoca date, similar cu tabelele dintr-o bază de date relațională. Aceste containere pot avea unul sau mai multe foldere pentru a stoca blob-uri, iar fiecare folder poate conține alte foldere, similar cu modul în care fișierele sunt stocate pe hard disk-ul computerului tău. Vei folosi stocarea de tip blob în această lecție pentru a stoca date IoT. ✅ Fă niște cercetări: Citește despre [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) ### Stocare de tip Tabel Stocarea de tip tabel îți permite să stochezi date semi-structurate. Stocarea de tip tabel este de fapt o bază de date NoSQL, deci nu necesită un set definit de tabele în prealabil, dar este concepută pentru a stoca date în unul sau mai multe tabele, cu chei unice pentru a defini fiecare rând. ✅ Fă niște cercetări: Citește despre [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) ### Stocare de tip Cozi Stocarea de tip cozi îți permite să stochezi mesaje de până la 64KB în dimensiune într-o coadă. Poți adăuga mesaje la sfârșitul cozii și să le citești de la început. Cozile stochează mesaje pe termen nelimitat, atâta timp cât există spațiu de stocare, permițând astfel stocarea mesajelor pe termen lung, apoi citirea lor atunci când este necesar. De exemplu, dacă dorești să rulezi o sarcină lunară pentru procesarea datelor GPS, poți adăuga mesaje în coadă în fiecare zi timp de o lună, apoi, la sfârșitul lunii, să procesezi toate mesajele din coadă. ✅ Fă niște cercetări: Citește despre [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) ### Stocare de tip Fișiere Stocarea de tip fișiere reprezintă stocarea fișierelor în cloud, iar orice aplicații sau dispozitive se pot conecta folosind protocoale standard din industrie. Poți scrie fișiere în stocarea de tip fișiere, apoi să o montezi ca un drive pe PC-ul sau Mac-ul tău. ✅ Fă niște cercetări: Citește despre [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) ## Conectează codul serverless la stocare Aplicația ta de funcții trebuie acum să se conecteze la stocarea de tip blob pentru a stoca mesajele de la IoT Hub. Există 2 moduri de a face acest lucru: * În interiorul codului funcției, conectează-te la stocarea de tip blob folosind SDK-ul Python pentru blob-uri și scrie datele ca blob-uri. * Folosește o legătură de ieșire a funcției pentru a lega valoarea returnată a funcției la stocarea de tip blob și pentru a salva automat blob-ul. În această lecție, vei folosi SDK-ul Python pentru a vedea cum să interacționezi cu stocarea de tip blob. ![Trimiterea telemetriei GPS de la un dispozitiv IoT la IoT Hub, apoi la Azure Functions printr-un declanșator Event Hub, apoi salvarea acesteia în stocarea de tip blob](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.ro.png) Datele vor fi salvate ca un blob JSON cu următorul format: ```json { "device_id": , "timestamp" :