# Lagre lokasjonsdata ![En sketchnote-oversikt over denne leksjonen](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.no.jpg) > Sketchnote av [Nitya Narasimhan](https://github.com/nitya). Klikk på bildet for en større versjon. ## Quiz før leksjonen [Quiz før leksjonen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## Introduksjon I forrige leksjon lærte du hvordan du bruker en GPS-sensor for å fange opp lokasjonsdata. For å bruke denne dataen til å visualisere lokasjonen til en lastebil med mat og dens reise, må dataen sendes til en IoT-tjeneste i skyen og deretter lagres et sted. I denne leksjonen vil du lære om de forskjellige måtene å lagre IoT-data på, og hvordan du kan lagre data fra din IoT-tjeneste ved hjelp av serverløs kode. I denne leksjonen dekker vi: * [Strukturert og ustrukturert 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åndtere GPS-hendelser med serverløs kode](../../../../../3-transport/lessons/2-store-location-data) * [Azure Storage Accounts](../../../../../3-transport/lessons/2-store-location-data) * [Koble serverløs kode til lagring](../../../../../3-transport/lessons/2-store-location-data) ## Strukturert og ustrukturert data Datasystemer håndterer data, og denne dataen kommer i mange forskjellige former og størrelser. Den kan variere fra enkeltstående tall, til store mengder tekst, til videoer og bilder, og til IoT-data. Data kan vanligvis deles inn i to kategorier - *strukturert* data og *ustrukturert* data. * **Strukturert data** er data med en veldefinert, rigid struktur som ikke endrer seg og vanligvis kan kartlegges til tabeller med relasjoner. Et eksempel er en persons detaljer, inkludert navn, fødselsdato og adresse. * **Ustrukturert data** er data uten en veldefinert, rigid struktur, inkludert data som kan endre struktur ofte. Et eksempel er dokumenter som skriftlige dokumenter eller regneark. ✅ Gjør litt research: Kan du komme på noen andre eksempler på strukturert og ustrukturert data? > 💁 Det finnes også semi-strukturert data som er strukturert, men som ikke passer inn i faste datatabeller. IoT-data regnes vanligvis som ustrukturert data. Tenk deg at du legger til IoT-enheter i en flåte av kjøretøy for en stor kommersiell gård. Du kan ønske å bruke forskjellige enheter for forskjellige typer kjøretøy. For eksempel: * For gårdskjøretøy som traktorer vil du ha GPS-data for å sikre at de arbeider på de riktige jordene. * For lastebiler som transporterer mat til lager vil du ha GPS-data samt hastighets- og akselerasjonsdata for å sikre at sjåføren kjører trygt, og sjåføridentitet og start/stopp-data for å sikre samsvar med lokale lover om arbeidstider. * For kjølebiler vil du også ha temperaturdata for å sikre at maten ikke blir for varm eller kald og ødelegges under transport. Denne dataen kan endre seg konstant. For eksempel, hvis IoT-enheten er i førerhuset på en lastebil, kan dataen den sender endre seg når tilhengeren byttes, for eksempel ved kun å sende temperaturdata når en kjøletilhenger brukes. ✅ Hvilken annen IoT-data kan fanges opp? Tenk på hvilke typer last lastebiler kan frakte, samt vedlikeholdsdata. Denne dataen varierer fra kjøretøy til kjøretøy, men alt sendes til den samme IoT-tjenesten for behandling. IoT-tjenesten må kunne behandle denne ustrukturerte dataen, lagre den på en måte som gjør det mulig å søke eller analysere, men som fungerer med forskjellige strukturer for denne dataen. ### SQL vs NoSQL lagring Databaser er tjenester som lar deg lagre og søke i data. Databaser kommer i to typer - SQL og NoSQL. #### SQL-databaser De første databasene var Relational Database Management Systems (RDBMS), eller relasjonsdatabaser. Disse er også kjent som SQL-databaser etter Structured Query Language (SQL) som brukes til å legge til, fjerne, oppdatere eller søke i data. Disse databasene består av et skjema - et veldefinert sett med datatabeller, likt et regneark. Hver tabell har flere navngitte kolonner. Når du legger inn data, legger du til en rad i tabellen, og setter verdier inn i hver av kolonnene. Dette holder dataen i en veldig rigid struktur - selv om du kan la kolonner stå tomme, må du legge til en ny kolonne i databasen og fylle verdier for eksisterende rader hvis du vil legge til en ny kolonne. Disse databasene er relasjonelle - i den forstand at én tabell kan ha en relasjon til en annen. ![En relasjonsdatabase med ID-en fra User-tabellen som relaterer til user ID-kolonnen i purchases-tabellen, og ID-en fra products-tabellen som relaterer til product ID i purchases-tabellen](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.no.png) For eksempel, hvis du lagrer en brukers personlige detaljer i en tabell, vil du ha en slags intern unik ID per bruker som brukes i en rad i en tabell som inneholder brukerens navn og adresse. Hvis du deretter vil lagre andre detaljer om den brukeren, som deres kjøp, i en annen tabell, vil du ha én kolonne i den nye tabellen for brukerens ID. Når du ser opp en bruker, kan du bruke deres ID for å hente deres personlige detaljer fra én tabell, og deres kjøp fra en annen. SQL-databaser er ideelle for å lagre strukturert data, og for når du vil sikre at dataen samsvarer med skjemaet ditt. ✅ Hvis du ikke har brukt SQL før, ta et øyeblikk til å lese om det på [SQL-siden på Wikipedia](https://wikipedia.org/wiki/SQL). Noen kjente SQL-databaser er Microsoft SQL Server, MySQL og PostgreSQL. ✅ Gjør litt research: Les om noen av disse SQL-databasene og deres funksjoner. #### NoSQL-databaser NoSQL-databaser kalles NoSQL fordi de ikke har den samme rigide strukturen som SQL-databaser. De er også kjent som dokumentdatabaser fordi de kan lagre ustrukturert data som dokumenter. > 💁 Til tross for navnet, lar noen NoSQL-databaser deg bruke SQL for å søke i dataen. ![Dokumenter i mapper i en NoSQL-database](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.no.png) NoSQL-databaser har ikke et forhåndsdefinert skjema som begrenser hvordan data lagres. I stedet kan du sette inn hvilken som helst ustrukturert data, vanligvis ved hjelp av JSON-dokumenter. Disse dokumentene kan organiseres i mapper, lik filer på datamaskinen din. Hvert dokument kan ha forskjellige felt fra andre dokumenter - for eksempel hvis du lagrer IoT-data fra gårdskjøretøyene dine, kan noen ha felt for akselerometer- og hastighetsdata, mens andre kan ha felt for temperaturen i tilhengeren. Hvis du skulle legge til en ny type lastebil, for eksempel en med innebygde vekter for å spore vekten av fraktet mat, kan IoT-enheten din legge til dette nye feltet, og det kan lagres uten endringer i databasen. Noen kjente NoSQL-databaser inkluderer Azure CosmosDB, MongoDB og CouchDB. ✅ Gjør litt research: Les om noen av disse NoSQL-databasene og deres funksjoner. I denne leksjonen vil du bruke NoSQL-lagring for å lagre IoT-data. ## Send GPS-data til en IoT Hub I forrige leksjon fanget du GPS-data fra en GPS-sensor koblet til din IoT-enhet. For å lagre denne IoT-dataen i skyen, må du sende den til en IoT-tjeneste. Nok en gang vil du bruke Azure IoT Hub, den samme IoT-sky-tjenesten du brukte i det forrige prosjektet. ![Sender GPS-telemetri fra en IoT-enhet til IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.no.png) ### Oppgave - send GPS-data til en IoT Hub 1. Opprett en ny IoT Hub ved hjelp av gratisnivået. > ⚠️ Du kan referere til [instruksjonene for å opprette en IoT Hub fra prosjekt 2, leksjon 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) hvis nødvendig. Husk å opprette en ny ressursgruppe. Navngi den nye ressursgruppen `gps-sensor`, og den nye IoT Hub et unikt navn basert på `gps-sensor`, for eksempel `gps-sensor-`. > 💁 Hvis du fortsatt har din IoT Hub fra det forrige prosjektet, kan du gjenbruke den. Husk å bruke navnet på denne IoT Hub og ressursgruppen den er i når du oppretter andre tjenester. 1. Legg til en ny enhet i IoT Hub. Kall denne enheten `gps-sensor`. Ta tak i tilkoblingsstrengen for enheten. 1. Oppdater enhetskoden din for å sende GPS-data til den nye IoT Hub ved hjelp av tilkoblingsstrengen fra forrige steg. > ⚠️ Du kan referere til [instruksjonene for å koble enheten din til IoT fra prosjekt 2, leksjon 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) hvis nødvendig. 1. Når du sender GPS-data, gjør det som JSON i følgende format: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. Send GPS-data hvert minutt slik at du ikke bruker opp din daglige meldingskvote. Hvis du bruker Wio Terminal, husk å legge til alle nødvendige biblioteker og sette tiden ved hjelp av en NTP-server. Koden din må også sikre at den har lest all data fra seriellporten før den sender GPS-lokasjonen, ved å bruke eksisterende kode fra forrige leksjon. Bruk følgende kode for å konstruere JSON-dokumentet: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` Hvis du bruker en virtuell IoT-enhet, husk å installere alle nødvendige biblioteker ved hjelp av et virtuelt miljø. For både Raspberry Pi og virtuell IoT-enhet, bruk eksisterende kode fra forrige leksjon for å hente bredde- og lengdegradverdier, og send dem i riktig 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 finner denne koden 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. Kjør enhetskoden din og sørg for at meldinger flyter inn i IoT Hub ved hjelp av `az iot hub monitor-events` CLI-kommandoen. ## Hot, warm og cold paths Data som flyter fra en IoT-enhet til skyen behandles ikke alltid i sanntid. Noen data trenger sanntidsbehandling, andre data kan behandles kort tid senere, og andre data kan behandles mye senere. Flyten av data til forskjellige tjenester som behandler dataen på forskjellige tidspunkter refereres til som hot, warm og cold paths. ### Hot path Hot path refererer til data som må behandles i sanntid eller nesten sanntid. Du vil bruke hot path-data for varsler, som å få beskjed om at et kjøretøy nærmer seg et lager, eller at temperaturen i en kjølebil er for høy. For å bruke hot path-data, vil koden din reagere på hendelser så snart de mottas av sky-tjenestene dine. ### Warm path Warm path refererer til data som kan behandles kort tid etter at den er mottatt, for eksempel for rapportering eller kortsiktig analyse. Du vil bruke warm path-data for daglige rapporter om kjøretøymileage, ved å bruke data samlet inn dagen før. Warm path-data lagres når den mottas av sky-tjenesten i en form for lagring som kan nås raskt. ### Cold path Cold path refererer til historisk data, som lagrer data for langtidsbruk som kan behandles når som helst. For eksempel kan du bruke cold path til å få årlige mileage-rapporter for kjøretøy, eller kjøre analyser på ruter for å finne den mest optimale ruten for å redusere drivstoffkostnader. Cold path-data lagres i datavarehus - databaser designet for å lagre store mengder data som aldri endres og kan søkes raskt og enkelt. Du vil normalt ha en regelmessig jobb i sky-applikasjonen din som kjører på et fast tidspunkt hver dag, uke eller måned for å flytte data fra warm path-lagring til datavarehuset. ✅ Tenk på dataen du har fanget så langt i disse leksjonene. Er det hot, warm eller cold path-data? ## Håndtere GPS-hendelser med serverløs kode Når data flyter inn i din IoT Hub, kan du skrive serverløs kode for å lytte etter hendelser publisert til Event-Hub-kompatible endepunktet. Dette er warm path - denne dataen vil bli lagret og brukt i neste leksjon for rapportering om reisen. ![Sender GPS-telemetri fra en IoT-enhet til IoT Hub, deretter til Azure Functions via en event hub trigger](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.no.png) ### Oppgave - håndtere GPS-hendelser med serverløs kode 1. Opprett en Azure Functions-app ved hjelp av Azure Functions CLI. Bruk Python-runtime, og opprett den i en mappe kalt `gps-trigger`, og bruk samme navn for Functions App-prosjektnavnet. Sørg for å opprette et virtuelt miljø for dette. > ⚠️ Du kan referere til [instruksjonene for å opprette et Azure Functions-prosjekt fra prosjekt 2, leksjon 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) hvis nødvendig. 1. Legg til en IoT Hub-hendelsesutløser som bruker IoT Hubs Event Hub-kompatible endepunkt. > ⚠️ Du kan se [instruksjonene for å opprette en IoT Hub-hendelsesutløser fra prosjekt 2, leksjon 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) hvis nødvendig. 1. Sett inn tilkoblingsstrengen for Event Hub-kompatible endepunkt i filen `local.settings.json`, og bruk nøkkelen for denne oppføringen i filen `function.json`. 1. Bruk Azurite-appen som en lokal lagringsemulator. 1. Kjør funksjonsappen din for å sikre at den mottar hendelser fra GPS-enheten din. Sørg for at IoT-enheten din også kjører og sender GPS-data. ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## Azure Storage Accounts ![Azure Storage-logoen](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.no.png) Azure Storage Accounts er en allsidig lagringstjeneste som kan lagre data på ulike måter. Du kan lagre data som blobber, i køer, i tabeller eller som filer, og alt dette samtidig. ### Blob-lagring Ordet *Blob* betyr binære store objekter, men har blitt et begrep for ustrukturert data. Du kan lagre hvilken som helst data i blob-lagring, fra JSON-dokumenter som inneholder IoT-data, til bilde- og filmfiler. Blob-lagring har konseptet *containere*, navngitte "bøtter" der du kan lagre data, lik tabeller i en relasjonsdatabase. Disse containerne kan ha én eller flere mapper for å lagre blobber, og hver mappe kan inneholde andre mapper, lik hvordan filer lagres på harddisken din. Du vil bruke blob-lagring i denne leksjonen for å lagre IoT-data. ✅ Gjør litt research: Les om [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) ### Tabell-lagring Tabell-lagring lar deg lagre semi-strukturert data. Tabell-lagring er faktisk en NoSQL-database, så den krever ikke et forhåndsdefinert sett med tabeller, men den er designet for å lagre data i én eller flere tabeller, med unike nøkler for å definere hver rad. ✅ Gjør litt research: Les om [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) ### Kø-lagring Kø-lagring lar deg lagre meldinger på opptil 64KB i størrelse i en kø. Du kan legge til meldinger bakerst i køen og lese dem fra fronten. Køer lagrer meldinger på ubestemt tid så lenge det er lagringsplass tilgjengelig, noe som gjør det mulig å lagre meldinger over lang tid og lese dem når det trengs. For eksempel, hvis du ønsker å kjøre en månedlig jobb for å behandle GPS-data, kan du legge dem til i en kø hver dag i en måned, og deretter behandle alle meldingene på slutten av måneden. ✅ Gjør litt research: Les 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 av filer i skyen, og alle apper eller enheter kan koble til ved hjelp av industristandardprotokoller. Du kan skrive filer til fil-lagring og deretter montere det som en disk på PC-en eller Mac-en din. ✅ Gjør litt research: Les om [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) ## Koble serverløs kode til lagring Funksjonsappen din må nå kobles til blob-lagring for å lagre meldingene fra IoT Hub. Det finnes to måter å gjøre dette på: * Inne i funksjonskoden, koble til blob-lagring ved hjelp av blob-lagringens Python SDK og skriv dataene som blobber. * Bruk en utdatafunksjonsbinding for å binde returverdien av funksjonen til blob-lagring og få blobben lagret automatisk. I denne leksjonen vil du bruke Python SDK for å se hvordan du kan interagere med blob-lagring. ![Sender GPS-telemetri fra en IoT-enhet til IoT Hub, deretter til Azure Functions via en Event Hub-utløser, og lagrer det deretter i blob-lagring](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.no.png) Dataene vil bli lagret som en JSON-blob med følgende format: ```json { "device_id": , "timestamp" :