# Lagra platsdata ![En sketchnote-översikt av denna lektion](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.sv.jpg) > Sketchnote av [Nitya Narasimhan](https://github.com/nitya). Klicka på bilden för en större version. ## Quiz före föreläsningen [Quiz före föreläsningen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## Introduktion I den senaste lektionen lärde du dig hur man använder en GPS-sensor för att fånga platsdata. För att använda dessa data för att visualisera platsen för en lastbil fullastad med mat och dess resa, behöver de skickas till en IoT-tjänst i molnet och sedan lagras någonstans. I denna lektion kommer du att lära dig om de olika sätten att lagra IoT-data och hur man lagrar data från din IoT-tjänst med serverlös kod. I denna lektion kommer vi att täcka: * [Strukturerad och ostrukturerad data](../../../../../3-transport/lessons/2-store-location-data) * [Skicka GPS-data till en IoT Hub](../../../../../3-transport/lessons/2-store-location-data) * [Varma, kalla och heta vägar](../../../../../3-transport/lessons/2-store-location-data) * [Hantera GPS-händelser med serverlös kod](../../../../../3-transport/lessons/2-store-location-data) * [Azure Storage-konton](../../../../../3-transport/lessons/2-store-location-data) * [Anslut din serverlösa kod till lagring](../../../../../3-transport/lessons/2-store-location-data) ## Strukturerad och ostrukturerad data Datorsystem hanterar data, och dessa data kommer i alla möjliga olika former och storlekar. De kan variera från enkla siffror till stora mängder text, videor och bilder, samt IoT-data. Data kan vanligtvis delas in i en av två kategorier - *strukturerad* data och *ostrukturerad* data. * **Strukturerad data** är data med en väldefinierad, rigid struktur som inte förändras och som vanligtvis motsvarar tabeller med data och relationer. Ett exempel är en persons uppgifter, inklusive deras namn, födelsedatum och adress. * **Ostrukturerad data** är data utan en väldefinierad, rigid struktur, inklusive data som kan ändra struktur ofta. Ett exempel är dokument som skrivna texter eller kalkylblad. ✅ Gör lite efterforskning: Kan du komma på några andra exempel på strukturerad och ostrukturerad data? > 💁 Det finns också semi-strukturerad data som är strukturerad men som inte passar in i fasta datatabeller. IoT-data anses vanligtvis vara ostrukturerad data. Föreställ dig att du lägger till IoT-enheter i en fordonsflotta för en stor kommersiell gård. Du kanske vill använda olika enheter för olika typer av fordon. Till exempel: * För jordbruksfordon som traktorer vill du ha GPS-data för att säkerställa att de arbetar på rätt fält. * För leveranslastbilar som transporterar mat till lager vill du ha GPS-data samt hastighets- och accelerationsdata för att säkerställa att föraren kör säkert, samt föraridentitet och start/stopp-data för att säkerställa att föraren följer lokala lagar om arbetstider. * För kylbilar vill du också ha temperaturdata för att säkerställa att maten inte blir för varm eller kall och förstörs under transporten. Dessa data kan förändras konstant. Till exempel, om IoT-enheten är i en lastbilshytt, kan de data den skickar förändras när släpet byts ut, till exempel genom att endast skicka temperaturdata när ett kylsläp används. ✅ Vilka andra IoT-data kan fångas? Tänk på vilka typer av laster lastbilar kan transportera, samt underhållsdata. Dessa data varierar från fordon till fordon, men allt skickas till samma IoT-tjänst för bearbetning. IoT-tjänsten måste kunna bearbeta dessa ostrukturerade data och lagra dem på ett sätt som gör det möjligt att söka eller analysera dem, men som fungerar med olika strukturer för dessa data. ### SQL vs NoSQL-lagring Databaser är tjänster som gör det möjligt att lagra och söka i data. Databaser finns i två typer - SQL och NoSQL. #### SQL-databaser De första databaserna var relationsdatabashanteringssystem (RDBMS), eller relationsdatabaser. Dessa är också kända som SQL-databaser efter Structured Query Language (SQL) som används för att interagera med dem för att lägga till, ta bort, uppdatera eller söka i data. Dessa databaser består av ett schema - en väldefinierad uppsättning datatabeller, liknande ett kalkylblad. Varje tabell har flera namngivna kolumner. När du lägger till data lägger du till en rad i tabellen och fyller i värden i varje kolumn. Detta håller data i en mycket rigid struktur - även om du kan lämna kolumner tomma, måste du lägga till en ny kolumn i databasen och fylla i värden för de befintliga raderna om du vill lägga till en ny kolumn. Dessa databaser är relationella - en tabell kan ha en relation till en annan. ![En relationsdatabas där ID:t i användartabellen relaterar till användar-ID-kolumnen i köp-tabellen, och ID:t i produkttabellen relaterar till produkt-ID:t i köp-tabellen](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.sv.png) Till exempel, om du lagrade en användares personliga uppgifter i en tabell, skulle du ha någon form av internt unikt ID per användare som används i en rad i en tabell som innehåller användarens namn och adress. Om du sedan ville lagra andra detaljer om den användaren, som deras köp, i en annan tabell, skulle du ha en kolumn i den nya tabellen för användarens ID. När du söker upp en användare kan du använda deras ID för att få deras personliga uppgifter från en tabell och deras köp från en annan. SQL-databaser är idealiska för att lagra strukturerad data och för när du vill säkerställa att data matchar ditt schema. ✅ Om du inte har använt SQL tidigare, ta en stund att läsa om det på [SQL-sidan på Wikipedia](https://wikipedia.org/wiki/SQL). Några välkända SQL-databaser är Microsoft SQL Server, MySQL och PostgreSQL. ✅ Gör lite efterforskning: Läs om några av dessa SQL-databaser och deras funktioner. #### NoSQL-databaser NoSQL-databaser kallas NoSQL eftersom de inte har samma rigida struktur som SQL-databaser. De är också kända som dokumentdatabaser eftersom de kan lagra ostrukturerad data som dokument. > 💁 Trots sitt namn tillåter vissa NoSQL-databaser att du använder SQL för att söka i data. ![Dokument i mappar i en NoSQL-databas](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.sv.png) NoSQL-databaser har inte ett fördefinierat schema som begränsar hur data lagras. Istället kan du lägga till vilken ostrukturerad data som helst, vanligtvis med JSON-dokument. Dessa dokument kan organiseras i mappar, liknande filer på din dator. Varje dokument kan ha olika fält jämfört med andra dokument - till exempel om du lagrade IoT-data från dina jordbruksfordon, kan vissa ha fält för accelerometer- och hastighetsdata, medan andra kan ha fält för temperaturen i släpet. Om du skulle lägga till en ny lastbilstyp, som en med inbyggda vågar för att spåra vikten av transporterat gods, kan din IoT-enhet lägga till detta nya fält och det kan lagras utan några ändringar i databasen. Några välkända NoSQL-databaser inkluderar Azure CosmosDB, MongoDB och CouchDB. ✅ Gör lite efterforskning: Läs om några av dessa NoSQL-databaser och deras funktioner. I denna lektion kommer du att använda NoSQL-lagring för att lagra IoT-data. ## Skicka GPS-data till en IoT Hub I den senaste lektionen fångade du GPS-data från en GPS-sensor ansluten till din IoT-enhet. För att lagra dessa IoT-data i molnet behöver du skicka dem till en IoT-tjänst. Återigen kommer du att använda Azure IoT Hub, samma IoT-molntjänst som du använde i det tidigare projektet. ![Skicka GPS-telemetri från en IoT-enhet till IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.sv.png) ### Uppgift - skicka GPS-data till en IoT Hub 1. Skapa en ny IoT Hub med gratisnivån. > ⚠️ Du kan hänvisa till [instruktionerna för att skapa en IoT Hub från projekt 2, lektion 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) om det behövs. Kom ihåg att skapa en ny resursgrupp. Namnge den nya resursgruppen `gps-sensor` och den nya IoT Hub med ett unikt namn baserat på `gps-sensor`, till exempel `gps-sensor-`. > 💁 Om du fortfarande har din IoT Hub från det tidigare projektet kan du återanvända den. Kom ihåg att använda namnet på denna IoT Hub och resursgruppen den finns i när du skapar andra tjänster. 1. Lägg till en ny enhet i IoT Hub. Kalla denna enhet `gps-sensor`. Hämta anslutningssträngen för enheten. 1. Uppdatera din enhetskod för att skicka GPS-data till den nya IoT Hub med hjälp av anslutningssträngen från föregående steg. > ⚠️ Du kan hänvisa till [instruktionerna för att ansluta din enhet till en IoT från projekt 2, lektion 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) om det behövs. 1. När du skickar GPS-data, gör det som JSON i följande format: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. Skicka GPS-data varje minut så att du inte överskrider din dagliga meddelandeallokering. Om du använder Wio Terminal, kom ihåg att lägga till alla nödvändiga bibliotek och ställa in tiden med en NTP-server. Din kod måste också säkerställa att den har läst all data från seriella porten innan den skickar GPS-positionen, med hjälp av den befintliga koden från den senaste lektionen. Använd följande kod för att skapa JSON-dokumentet: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` Om du använder en virtuell IoT-enhet, kom ihåg att installera alla nödvändiga bibliotek med en virtuell miljö. För både Raspberry Pi och virtuell IoT-enhet, använd den befintliga koden från den senaste lektionen för att få latitud- och longitudvärden, och skicka dem sedan i rätt JSON-format med följande kod: ```python message_json = { "gps" : { "lat":lat, "lon":lon } } print("Sending telemetry", message_json) message = Message(json.dumps(message_json)) ``` > 💁 Du kan hitta denna kod i mappen [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). Kör din enhetskod och säkerställ att meddelanden flödar in i IoT Hub med hjälp av kommandot `az iot hub monitor-events` i CLI. ## Varma, kalla och heta vägar Data som flödar från en IoT-enhet till molnet bearbetas inte alltid i realtid. Vissa data behöver bearbetas i realtid, andra data kan bearbetas en kort stund senare, och andra data kan bearbetas mycket senare. Flödet av data till olika tjänster som bearbetar data vid olika tidpunkter kallas heta, varma och kalla vägar. ### Het väg Den heta vägen avser data som behöver bearbetas i realtid eller nära realtid. Du skulle använda het väg-data för varningar, till exempel att få varningar om att ett fordon närmar sig en depå eller att temperaturen i en kylbil är för hög. För att använda het väg-data skulle din kod svara på händelser så snart de tas emot av dina molntjänster. ### Varm väg Den varma vägen avser data som kan bearbetas en kort stund efter att de tagits emot, till exempel för rapportering eller kortsiktig analys. Du skulle använda varm väg-data för dagliga rapporter om fordonsmätarställning, med data som samlats in föregående dag. Varm väg-data lagras när de tas emot av molntjänsten i någon form av lagring som kan nås snabbt. ### Kall väg Den kalla vägen avser historiska data, som lagras på lång sikt för att bearbetas vid behov. Till exempel kan du använda den kalla vägen för att få årliga rapporter om fordonsmätarställning eller köra analyser på rutter för att hitta den mest optimala rutten för att minska bränslekostnader. Kall väg-data lagras i datalager - databaser designade för att lagra stora mängder data som aldrig förändras och som kan sökas snabbt och enkelt. Du skulle normalt ha ett regelbundet jobb i din molnapplikation som körs vid en regelbunden tid varje dag, vecka eller månad för att flytta data från varm väg-lagring till datalagret. ✅ Tänk på de data du har fångat hittills i dessa lektioner. Är det het, varm eller kall väg-data? ## Hantera GPS-händelser med serverlös kod När data flödar in i din IoT Hub kan du skriva serverlös kod för att lyssna på händelser som publiceras till den Event-Hub-kompatibla slutpunkten. Detta är den varma vägen - dessa data kommer att lagras och användas i nästa lektion för att rapportera om resan. ![Skicka GPS-telemetri från en IoT-enhet till IoT Hub, sedan till Azure Functions via en event hub-trigger](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.sv.png) ### Uppgift - hantera GPS-händelser med serverlös kod 1. Skapa en Azure Functions-app med hjälp av Azure Functions CLI. Använd Python-runtime och skapa den i en mapp som heter `gps-trigger`, och använd samma namn för Functions App-projektet. Se till att skapa en virtuell miljö att använda för detta. > ⚠️ Du kan hänvisa till [instruktionerna för att skapa ett Azure Functions-projekt från projekt 2, lektion 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) om det behövs. 1. Lägg till en IoT Hub-händelseutlösare som använder IoT Hubs Event Hub-kompatibla slutpunkt. > ⚠️ Du kan hänvisa till [instruktionerna för att skapa en IoT Hub-händelseutlösare från projekt 2, lektion 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) om det behövs. 1. Ställ in anslutningssträngen för Event Hub-kompatibla slutpunkten i filen `local.settings.json` och använd nyckeln för den posten i filen `function.json`. 1. Använd Azurite-appen som en lokal lagringsemulator. 1. Kör din Functions-app för att säkerställa att den tar emot händelser från din GPS-enhet. Se till att din IoT-enhet också körs och skickar GPS-data. ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## Azure Storage-konton ![Azure Storage-logotypen](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.sv.png) Azure Storage-konton är en allmän lagringstjänst som kan lagra data på olika sätt. Du kan lagra data som blobbar, i köer, i tabeller eller som filer, och allt detta samtidigt. ### Blob-lagring Ordet *Blob* betyder binära stora objekt, men har blivit termen för ostrukturerad data. Du kan lagra vilken data som helst i blob-lagring, från JSON-dokument som innehåller IoT-data till bild- och filmfiler. Blob-lagring har konceptet *containers*, namngivna behållare där du kan lagra data, liknande tabeller i en relationsdatabas. Dessa behållare kan ha en eller flera mappar för att lagra blobbar, och varje mapp kan innehålla andra mappar, liknande hur filer lagras på din dators hårddisk. Du kommer att använda blob-lagring i denna lektion för att lagra IoT-data. ✅ Gör lite efterforskning: Läs om [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) ### Tabell-lagring Tabell-lagring låter dig lagra semi-strukturerad data. Tabell-lagring är faktiskt en NoSQL-databas, så det krävs inte en fördefinierad uppsättning tabeller, men den är designad för att lagra data i en eller flera tabeller, med unika nycklar för att definiera varje rad. ✅ Gör lite efterforskning: 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 låter dig lagra meddelanden på upp till 64 KB i storlek i en kö. Du kan lägga till meddelanden längst bak i kön och läsa dem från framsidan. Köer lagrar meddelanden på obestämd tid så länge det finns lagringsutrymme, vilket gör att meddelanden kan lagras långsiktigt och läsas när det behövs. Till exempel, om du vill köra ett månatligt jobb för att bearbeta GPS-data kan du lägga till det i en kö varje dag under en månad och sedan bearbeta alla meddelanden i slutet av månaden. ✅ Gör lite efterforskning: 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 är lagring av filer i molnet, och alla appar eller enheter kan ansluta med hjälp av standardprotokoll. Du kan skriva filer till fil-lagring och sedan montera det som en enhet på din PC eller Mac. ✅ Gör lite efterforskning: Läs om [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) ## Anslut din serverlösa kod till lagring Din Functions-app behöver nu ansluta till blob-lagring för att lagra meddelanden från IoT Hub. Det finns två sätt att göra detta: * Inuti funktionskoden, anslut till blob-lagring med hjälp av blob-lagringens Python SDK och skriv data som blobbar. * Använd en utdata-funktionsbindning för att binda returvärdet från funktionen till blob-lagring och låta blobben sparas automatiskt. I denna lektion kommer du att använda Python SDK för att se hur man interagerar med blob-lagring. ![Skicka GPS-telemetri från en IoT-enhet till IoT Hub, sedan till Azure Functions via en Event Hub-utlösare, och sedan spara det till blob-lagring](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.sv.png) Data kommer att sparas som en JSON-blob med följande format: ```json { "device_id": , "timestamp" :