# Gem lokationsdata ![En sketchnote-oversigt over denne lektion](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.da.jpg) > Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. ## Quiz før lektionen [Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## Introduktion I den sidste lektion lærte du, hvordan man bruger en GPS-sensor til at indfange lokationsdata. For at bruge disse data til at visualisere placeringen af en lastbil fyldt med mad og dens rejse, skal dataene sendes til en IoT-tjeneste i skyen og derefter gemmes et sted. I denne lektion vil du lære om de forskellige måder at gemme IoT-data på og lære, hvordan man gemmer data fra din IoT-tjeneste ved hjælp af serverløs kode. I denne lektion dækker vi: * [Strukturerede og ustrukturerede data](../../../../../3-transport/lessons/2-store-location-data) * [Send GPS-data til en IoT Hub](../../../../../3-transport/lessons/2-store-location-data) * [Hot, warm og cold paths](../../../../../3-transport/lessons/2-store-location-data) * [Håndter GPS-hændelser med serverløs kode](../../../../../3-transport/lessons/2-store-location-data) * [Azure Storage Accounts](../../../../../3-transport/lessons/2-store-location-data) * [Forbind din serverløse kode til lager](../../../../../3-transport/lessons/2-store-location-data) ## Strukturerede og ustrukturerede data Computersystemer arbejder med data, og disse data kommer i mange forskellige former og størrelser. De kan variere fra enkelte tal til store mængder tekst, videoer og billeder samt IoT-data. Data kan normalt opdeles i en af to kategorier - *strukturerede* data og *ustrukturerede* data. * **Strukturerede data** er data med en veldefineret, fast struktur, der ikke ændrer sig og som normalt kan mappes til tabeller med relationer. Et eksempel er en persons oplysninger, herunder deres navn, fødselsdato og adresse. * **Ustrukturerede data** er data uden en veldefineret, fast struktur, herunder data, der ofte kan ændre struktur. Et eksempel er dokumenter som skrevne tekster eller regneark. ✅ Lav lidt research: Kan du komme i tanke om andre eksempler på strukturerede og ustrukturerede data? > 💁 Der findes også semi-strukturerede data, som er strukturerede, men som ikke passer ind i faste datatabeller. IoT-data betragtes normalt som ustrukturerede data. Forestil dig, at du tilføjede IoT-enheder til en flåde af køretøjer for en stor kommerciel gård. Du vil måske bruge forskellige enheder til forskellige typer køretøjer. For eksempel: * For landbrugskøretøjer som traktorer ønsker du GPS-data for at sikre, at de arbejder på de rigtige marker. * For leveringslastbiler, der transporterer mad til lagre, ønsker du GPS-data samt hastigheds- og accelerationsdata for at sikre, at chaufføren kører sikkert, samt føreridentitet og start/stop-data for at sikre overholdelse af lokale arbejdstidslove. * For kølebiler ønsker du også temperaturdata for at sikre, at maden ikke bliver for varm eller kold og dermed ødelægges under transport. Disse data kan ændre sig konstant. For eksempel, hvis IoT-enheden er i en lastbilskabine, kan de data, den sender, ændre sig, når traileren skiftes, for eksempel kun at sende temperaturdata, når en køletrailer bruges. ✅ Hvilke andre IoT-data kunne indfanges? Tænk på de typer last, som lastbiler kan transportere, samt vedligeholdelsesdata. Disse data varierer fra køretøj til køretøj, men de sendes alle til den samme IoT-tjeneste til behandling. IoT-tjenesten skal kunne behandle disse ustrukturerede data og gemme dem på en måde, der gør det muligt at søge eller analysere dem, men som også fungerer med forskellige strukturer af disse data. ### SQL vs NoSQL-lagring Databaser er tjenester, der giver dig mulighed for at gemme og forespørge data. Databaser findes i to typer - SQL og NoSQL. #### SQL-databaser De første databaser var Relationelle Database Management Systemer (RDBMS), eller relationelle databaser. Disse er også kendt som SQL-databaser efter Structured Query Language (SQL), der bruges til at interagere med dem for at tilføje, fjerne, opdatere eller forespørge data. Disse databaser består af et skema - et veldefineret sæt tabeller, der minder om et regneark. Hver tabel har flere navngivne kolonner. Når du indsætter data, tilføjer du en række til tabellen og placerer værdier i hver af kolonnerne. Dette holder dataene i en meget fast struktur - selvom du kan lade kolonner stå tomme, skal du tilføje en ny kolonne til databasen og udfylde værdier for de eksisterende rækker, hvis du vil tilføje en ny kolonne. Disse databaser er relationelle - en tabel kan have en relation til en anden. ![En relationel database med ID'et fra User-tabellen, der relaterer til user ID-kolonnen i purchases-tabellen, og ID'et fra products-tabellen, der relaterer til product ID i purchases-tabellen](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.da.png) For eksempel, hvis du gemte en brugers personlige oplysninger i en tabel, ville du have en slags intern unik ID pr. bruger, der bruges i en række i en tabel, der indeholder brugerens navn og adresse. Hvis du derefter ville gemme andre detaljer om den bruger, såsom deres køb, i en anden tabel, ville du have en kolonne i den nye tabel for den brugers ID. Når du slår en bruger op, kan du bruge deres ID til at få deres personlige oplysninger fra én tabel og deres køb fra en anden. SQL-databaser er ideelle til at gemme strukturerede data og til, når du vil sikre, at dataene matcher dit skema. ✅ Hvis du ikke har brugt SQL før, så tag et øjeblik til at læse om det på [SQL-siden på Wikipedia](https://wikipedia.org/wiki/SQL). Nogle kendte SQL-databaser er Microsoft SQL Server, MySQL og PostgreSQL. ✅ Lav lidt research: Læs om nogle af disse SQL-databaser og deres funktioner. #### NoSQL-databaser NoSQL-databaser kaldes NoSQL, fordi de ikke har den samme faste struktur som SQL-databaser. De er også kendt som dokumentdatabaser, da de kan gemme ustrukturerede data som dokumenter. > 💁 På trods af deres navn tillader nogle NoSQL-databaser, at du bruger SQL til at forespørge data. ![Dokumenter i mapper i en NoSQL-database](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.da.png) NoSQL-databaser har ikke et foruddefineret skema, der begrænser, hvordan data gemmes. I stedet kan du indsætte enhver form for ustrukturerede data, normalt ved hjælp af JSON-dokumenter. Disse dokumenter kan organiseres i mapper, ligesom filer på din computer. Hvert dokument kan have forskellige felter fra andre dokumenter - for eksempel, hvis du gemte IoT-data fra dine landbrugskøretøjer, kunne nogle have felter for accelerometer- og hastighedsdata, mens andre kunne have felter for temperaturen i traileren. Hvis du tilføjede en ny lastbiltype, såsom en med indbyggede vægte til at spore vægten af den transporterede last, kunne din IoT-enhed tilføje dette nye felt, og det kunne gemmes uden ændringer i databasen. Nogle kendte NoSQL-databaser inkluderer Azure CosmosDB, MongoDB og CouchDB. ✅ Lav lidt research: Læs om nogle af disse NoSQL-databaser og deres funktioner. I denne lektion vil du bruge NoSQL-lagring til at gemme IoT-data. ## Send GPS-data til en IoT Hub I den sidste lektion indfangede du GPS-data fra en GPS-sensor, der var forbundet til din IoT-enhed. For at gemme disse IoT-data i skyen skal du sende dem til en IoT-tjeneste. Igen vil du bruge Azure IoT Hub, den samme IoT-skytjeneste, som du brugte i det forrige projekt. ![Afsendelse af GPS-telemetri fra en IoT-enhed til IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.da.png) ### Opgave - send GPS-data til en IoT Hub 1. Opret en ny IoT Hub ved hjælp af den gratis version. > ⚠️ Du kan henvise til [instruktionerne for at oprette en IoT Hub fra projekt 2, lektion 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud), hvis det er nødvendigt. Husk at oprette en ny Ressourcegruppe. Navngiv den nye Ressourcegruppe `gps-sensor`, og giv den nye IoT Hub et unikt navn baseret på `gps-sensor`, såsom `gps-sensor-`. > 💁 Hvis du stadig har din IoT Hub fra det forrige projekt, kan du genbruge den. Husk at bruge navnet på denne IoT Hub og Ressourcegruppen, den er i, når du opretter andre tjenester. 1. Tilføj en ny enhed til IoT Hub. Kald denne enhed `gps-sensor`. Tag forbindelsesstrengen for enheden. 1. Opdater din enhedskode til at sende GPS-dataene til den nye IoT Hub ved hjælp af forbindelsesstrengen fra det forrige trin. > ⚠️ Du kan henvise til [instruktionerne for at forbinde din enhed til en IoT-tjeneste fra projekt 2, lektion 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service), hvis det er nødvendigt. 1. Når du sender GPS-dataene, skal du gøre det som JSON i følgende format: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. Send GPS-data hvert minut, så du ikke bruger din daglige meddelelsesallokering. Hvis du bruger Wio Terminal, skal du huske at tilføje alle nødvendige biblioteker og indstille tiden ved hjælp af en NTP-server. Din kode skal også sikre, at den har læst alle data fra den serielle port, før den sender GPS-positionen, ved at bruge den eksisterende kode fra den sidste lektion. Brug følgende kode til at konstruere JSON-dokumentet: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` Hvis du bruger en Virtuel IoT-enhed, skal du huske at installere alle nødvendige biblioteker ved hjælp af et virtuelt miljø. For både Raspberry Pi og Virtuel IoT-enhed skal du bruge den eksisterende kode fra den sidste lektion til at få bredde- og længdegradsdataene og derefter sende dem i det korrekte JSON-format med følgende kode: ```python message_json = { "gps" : { "lat":lat, "lon":lon } } print("Sending telemetry", message_json) message = Message(json.dumps(message_json)) ``` > 💁 Du kan finde denne kode i [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) eller [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device)-mappen. Kør din enhedskode, og sørg for, at meddelelser flyder ind i IoT Hub ved hjælp af `az iot hub monitor-events` CLI-kommandoen. ## Hot, warm og cold paths Data, der flyder fra en IoT-enhed til skyen, behandles ikke altid i realtid. Nogle data skal behandles i realtid, andre kan behandles kort tid senere, og andre kan behandles meget senere. Flowet af data til forskellige tjenester, der behandler dataene på forskellige tidspunkter, kaldes hot, warm og cold paths. ### Hot path Hot path refererer til data, der skal behandles i realtid eller næsten realtid. Du ville bruge hot path-data til alarmer, såsom at få besked om, at et køretøj nærmer sig et depot, eller at temperaturen i en kølebil er for høj. For at bruge hot path-data ville din kode reagere på hændelser, så snart de modtages af dine skytjenester. ### Warm path Warm path refererer til data, der kan behandles kort tid efter modtagelse, for eksempel til rapportering eller kortsigtet analyse. Du ville bruge warm path-data til daglige rapporter om køretøjers kilometertal ved hjælp af data indsamlet dagen før. Warm path-data gemmes, så snart de modtages af skytjenesten, i en form for lager, der hurtigt kan tilgås. ### Cold path Cold path refererer til historiske data, der gemmes på lang sigt og kan behandles, når det er nødvendigt. For eksempel kunne du bruge cold path til at få årlige kilometerrapporter for køretøjer eller køre analyser på ruter for at finde den mest optimale rute for at reducere brændstofomkostninger. Cold path-data gemmes i datalagre - databaser designet til at gemme store mængder data, der aldrig ændres, og som kan forespørges hurtigt og nemt. Du vil normalt have en regelmæssig opgave i din skyapplikation, der kører på et fast tidspunkt hver dag, uge eller måned for at flytte data fra warm path-lager til datalageret. ✅ Tænk over de data, du har indsamlet indtil videre i disse lektioner. Er det hot, warm eller cold path-data? ## Håndter GPS-hændelser med serverløs kode Når data flyder ind i din IoT Hub, kan du skrive noget serverløs kode til at lytte efter hændelser, der offentliggøres til den Event-Hub-kompatible endpoint. Dette er warm path - disse data vil blive gemt og brugt i den næste lektion til rapportering om rejsen. ![Afsendelse af GPS-telemetri fra en IoT-enhed til IoT Hub og derefter til Azure Functions via en event hub-trigger](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.da.png) ### Opgave - håndter GPS-hændelser med serverløs kode 1. Opret en Azure Functions-app ved hjælp af Azure Functions CLI. Brug Python-runtime, og opret den i en mappe kaldet `gps-trigger`, og brug det samme navn til Functions App-projektnavnet. Sørg for at oprette et virtuelt miljø til dette. > ⚠️ Du kan henvise til [instruktionerne for at oprette et Azure Functions-projekt fra projekt 2, lektion 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application), hvis det er nødvendigt. 1. Tilføj en IoT Hub-hændelsesudløser, der bruger IoT Hubs Event Hub-kompatible endpoint. > ⚠️ Du kan finde vejledningen til at oprette en IoT Hub-hændelsesudløser fra projekt 2, lektion 5 [her](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger), hvis det er nødvendigt. 1. Angiv forbindelsesstrengen for Event Hub-kompatible endpoint i filen `local.settings.json`, og brug nøglen for denne post i filen `function.json`. 1. Brug Azurite-appen som en lokal lageremulator. 1. Kør din Functions-app for at sikre, at den modtager hændelser fra din GPS-enhed. Sørg for, at din IoT-enhed også kører og sender GPS-data. ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## Azure Storage-konti ![Azure Storage-logoet](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.da.png) Azure Storage-konti er en alsidig lagringstjeneste, der kan gemme data på forskellige måder. Du kan gemme data som blobs, i køer, i tabeller eller som filer – og alt dette på samme tid. ### Blob-lagring Ordet *Blob* betyder binære store objekter, men bruges som betegnelse for enhver ustruktureret data. Du kan gemme enhver form for data i blob-lagring, fra JSON-dokumenter med IoT-data til billed- og videofiler. Blob-lagring har konceptet *containers*, navngivne "spande", hvor du kan gemme data, svarende til tabeller i en relationsdatabase. Disse containere kan have en eller flere mapper til at gemme blobs, og hver mappe kan indeholde andre mapper, ligesom filer gemmes på din computers harddisk. Du vil bruge blob-lagring i denne lektion til at gemme IoT-data. ✅ Undersøg: Læs om [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) ### Tabel-lagring Tabel-lagring giver dig mulighed for at gemme semi-struktureret data. Tabel-lagring er faktisk en NoSQL-database, så det kræver ikke et foruddefineret sæt tabeller, men det er designet til at gemme data i en eller flere tabeller med unikke nøgler til at definere hver række. ✅ Undersøg: Læs om [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) ### Kø-lagring Kø-lagring giver dig mulighed for at gemme beskeder på op til 64 KB i størrelse i en kø. Du kan tilføje beskeder til bagenden af køen og læse dem fra fronten. Køer gemmer beskeder på ubestemt tid, så længe der stadig er lagerplads, hvilket gør det muligt at gemme beskeder langvarigt og læse dem, når det er nødvendigt. For eksempel, hvis du ville køre en månedlig opgave for at behandle GPS-data, kunne du tilføje dem til en kø hver dag i en måned og derefter behandle alle beskederne i slutningen af måneden. ✅ Undersøg: Læs om [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) ### Fil-lagring Fil-lagring er lagring af filer i skyen, og enhver app eller enhed kan oprette forbindelse ved hjælp af standardprotokoller. Du kan skrive filer til fil-lagring og derefter montere det som et drev på din PC eller Mac. ✅ Undersøg: Læs om [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) ## Forbind din serverløse kode til lagring Din Functions-app skal nu forbindes til blob-lagring for at gemme beskederne fra IoT Hub. Der er to måder at gøre dette på: * Inde i funktionskoden, forbind til blob-lagring ved hjælp af blob-lagringens Python SDK og skriv data som blobs. * Brug en output-funktionsbinding til at binde returværdien af funktionen til blob-lagring og få blobben gemt automatisk. I denne lektion vil du bruge Python SDK til at se, hvordan man interagerer med blob-lagring. ![Sender GPS-telemetri fra en IoT-enhed til IoT Hub, derefter til Azure Functions via en Event Hub-trigger, og gemmer det i blob-lagring](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.da.png) Dataene vil blive gemt som en JSON-blob med følgende format: ```json { "device_id": , "timestamp" :