# Съхраняване на данни за местоположение ![Скица на урока](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.bg.jpg) > Скица от [Nitya Narasimhan](https://github.com/nitya). Кликнете върху изображението за по-голяма версия. ## Тест преди лекцията [Тест преди лекцията](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## Въведение В последния урок научихте как да използвате GPS сензор за улавяне на данни за местоположение. За да използвате тези данни за визуализиране на местоположението на камион, натоварен с храна, и неговото пътуване, те трябва да бъдат изпратени до IoT услуга в облака и след това съхранени някъде. В този урок ще научите за различните начини за съхранение на IoT данни и как да съхранявате данни от вашата IoT услуга, използвайки безсървърен код. В този урок ще разгледаме: * [Структурирани и неструктурирани данни](../../../../../3-transport/lessons/2-store-location-data) * [Изпращане на GPS данни към IoT Hub](../../../../../3-transport/lessons/2-store-location-data) * [Горещи, топли и студени пътища](../../../../../3-transport/lessons/2-store-location-data) * [Обработка на GPS събития с безсървърен код](../../../../../3-transport/lessons/2-store-location-data) * [Azure Storage Accounts](../../../../../3-transport/lessons/2-store-location-data) * [Свързване на безсървърен код със съхранение](../../../../../3-transport/lessons/2-store-location-data) ## Структурирани и неструктурирани данни Компютърните системи работят с данни, които могат да бъдат в различни форми и размери. Те могат да варират от единични числа до големи количества текст, видеа, изображения и IoT данни. Данните обикновено се разделят на две категории - *структурирани* и *неструктурирани* данни. * **Структурирани данни** са данни с добре дефинирана, твърда структура, която не се променя, и обикновено се свързват с таблици с данни и техните взаимоотношения. Пример за това са личните данни на човек, включително име, дата на раждане и адрес. * **Неструктурирани данни** са данни без добре дефинирана, твърда структура, включително данни, които често променят структурата си. Пример за това са документи като текстови файлове или електронни таблици. ✅ Направете проучване: Можете ли да измислите други примери за структурирани и неструктурирани данни? > 💁 Съществуват и полуструктурирани данни, които са структурирани, но не се вписват в фиксирани таблици с данни. IoT данните обикновено се считат за неструктурирани данни. Представете си, че добавяте IoT устройства към автопарк от превозни средства за голяма търговска ферма. Може да искате да използвате различни устройства за различни видове превозни средства. Например: * За селскостопански машини като трактори искате GPS данни, за да се уверите, че работят на правилните полета. * За камиони за доставка на храна до складове искате GPS данни, както и данни за скорост и ускорение, за да се уверите, че шофьорът шофира безопасно, както и данни за идентификация на водача и старт/стоп, за да се гарантира спазването на местните закони за работното време. * За хладилни камиони искате и данни за температурата, за да се уверите, че храната не се нагрява или охлажда прекалено и не се разваля по време на транспортиране. Тези данни могат да се променят постоянно. Например, ако IoT устройството е в кабината на камион, данните, които изпраща, може да се променят в зависимост от ремаркето, например да изпраща данни за температурата само когато се използва хладилно ремарке. ✅ Какви други IoT данни могат да бъдат събрани? Помислете за видовете товари, които камионите могат да превозват, както и за данни за поддръжка. Тези данни варират от превозно средство до превозно средство, но всички те се изпращат към една и съща IoT услуга за обработка. IoT услугата трябва да може да обработва тези неструктурирани данни, като ги съхранява по начин, който позволява търсене или анализ, но работи с различни структури на данните. ### SQL срещу NoSQL съхранение Базите данни са услуги, които ви позволяват да съхранявате и извличате данни. Те се делят на два типа - SQL и NoSQL. #### SQL бази данни Първите бази данни са Релационни системи за управление на бази данни (RDBMS), известни също като SQL бази данни, поради използвания език за структурирани заявки (SQL). Тези бази данни имат схема - добре дефиниран набор от таблици с данни, подобни на електронна таблица. Всяка таблица има множество именувани колони. Когато добавяте данни, добавяте ред в таблицата, като поставяте стойности във всяка от колоните. Това поддържа данните в много твърда структура - въпреки че можете да оставите колони празни, ако искате да добавите нова колона, трябва да го направите в базата данни, като попълните стойности за съществуващите редове. Тези бази данни са релационни - една таблица може да има връзка с друга. ![Релационна база данни с ID на таблицата User, свързващ се с колоната user ID на таблицата purchases, и ID на таблицата products, свързващ се с колоната product ID на таблицата purchases](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.bg.png) Например, ако съхранявате лични данни на потребители в таблица, ще имате някакъв вътрешен уникален ID за всеки потребител, който се използва в ред в таблица, съдържаща името и адреса на потребителя. Ако искате да съхранявате други данни за този потребител, като например неговите покупки, в друга таблица, ще имате една колона в новата таблица за ID на потребителя. Когато търсите потребител, можете да използвате неговия ID, за да получите личните му данни от една таблица и покупките му от друга. SQL базите данни са идеални за съхранение на структурирани данни и когато искате да гарантирате, че данните съответстват на вашата схема. ✅ Ако не сте използвали SQL преди, отделете момент да прочетете за него на [страницата за SQL в Wikipedia](https://wikipedia.org/wiki/SQL). Някои известни SQL бази данни са Microsoft SQL Server, MySQL и PostgreSQL. ✅ Направете проучване: Прочетете за някои от тези SQL бази данни и техните възможности. #### NoSQL бази данни NoSQL базите данни се наричат така, защото нямат същата твърда структура като SQL базите данни. Те са известни също като документни бази данни, тъй като могат да съхраняват неструктурирани данни като документи. > 💁 Въпреки името си, някои NoSQL бази данни позволяват използването на SQL за извличане на данни. ![Документи в папки в NoSQL база данни](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.bg.png) NoSQL базите данни нямат предварително дефинирана схема, която ограничава начина на съхранение на данни. Вместо това можете да вмъквате всякакви неструктурирани данни, обикновено използвайки JSON документи. Тези документи могат да бъдат организирани в папки, подобно на файлове на вашия компютър. Всеки документ може да има различни полета от другите документи - например, ако съхранявате IoT данни от селскостопански превозни средства, някои може да имат полета за данни от акселерометър и скорост, а други - за температура в ремаркето. Ако добавите нов тип камион, например такъв с вградени везни за проследяване на теглото на превозваната продукция, вашето IoT устройство може да добави това ново поле и то може да бъде съхранено без промени в базата данни. Някои известни NoSQL бази данни включват Azure CosmosDB, MongoDB и CouchDB. ✅ Направете проучване: Прочетете за някои от тези NoSQL бази данни и техните възможности. В този урок ще използвате NoSQL съхранение за съхранение на IoT данни. ## Изпращане на GPS данни към IoT Hub В последния урок улавяхте GPS данни от GPS сензор, свързан с вашето IoT устройство. За да съхраните тези IoT данни в облака, трябва да ги изпратите към IoT услуга. Отново ще използвате Azure IoT Hub, същата IoT облачна услуга, която използвахте в предишния проект. ![Изпращане на GPS телеметрия от IoT устройство към IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.bg.png) ### Задача - изпращане на GPS данни към IoT Hub 1. Създайте нов IoT Hub, използвайки безплатния план. > ⚠️ Можете да се обърнете към [инструкциите за създаване на IoT Hub от проект 2, урок 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud), ако е необходимо. Не забравяйте да създадете нова Resource Group. Назовете новата Resource Group `gps-sensor`, а новия IoT Hub с уникално име, базирано на `gps-sensor`, например `gps-sensor-<вашето име>`. > 💁 Ако все още имате вашия IoT Hub от предишния проект, можете да го използвате повторно. Не забравяйте да използвате името на този IoT Hub и Resource Group, в която се намира, когато създавате други услуги. 1. Добавете ново устройство към IoT Hub. Наречете това устройство `gps-sensor`. Вземете connection string за устройството. 1. Актуализирайте кода на вашето устройство, за да изпраща GPS данни към новия IoT Hub, използвайки connection string от предишната стъпка. > ⚠️ Можете да се обърнете към [инструкциите за свързване на вашето устройство към IoT от проект 2, урок 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service), ако е необходимо. 1. Когато изпращате GPS данни, направете го във формат JSON, както следва: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. Изпращайте GPS данни всяка минута, за да не изчерпите дневната си квота за съобщения. Ако използвате Wio Terminal, не забравяйте да добавите всички необходими библиотеки и да настроите времето, използвайки NTP сървър. Вашият код също трябва да се увери, че е прочел всички данни от серийния порт, преди да изпрати GPS местоположението, използвайки съществуващия код от последния урок. Използвайте следния код, за да създадете JSON документа: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` Ако използвате виртуално IoT устройство, не забравяйте да инсталирате всички необходими библиотеки, използвайки виртуална среда. За Raspberry Pi и виртуалното IoT устройство използвайте съществуващия код от последния урок, за да получите стойностите за ширина и дължина, след което ги изпратете в правилния JSON формат със следния код: ```python message_json = { "gps" : { "lat":lat, "lon":lon } } print("Sending telemetry", message_json) message = Message(json.dumps(message_json)) ``` > 💁 Можете да намерите този код в папките [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) или [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device). Стартирайте кода на вашето устройство и се уверете, че съобщенията се изпращат към IoT Hub, използвайки CLI командата `az iot hub monitor-events`. ## Горещи, топли и студени пътища Данните, които се изпращат от IoT устройство към облака, не винаги се обработват в реално време. Някои данни изискват обработка в реално време, други могат да бъдат обработени малко по-късно, а трети могат да бъдат обработени много по-късно. Потокът от данни към различни услуги, които ги обработват в различни моменти, се нарича горещи, топли и студени пътища. ### Горещ път Горещият път се отнася до данни, които трябва да бъдат обработени в реално време или почти в реално време. Бихте използвали горещи данни за известия, като например, че превозно средство се приближава към депо или че температурата в хладилен камион е твърде висока. За да използвате горещи данни, вашият код трябва да реагира на събития веднага щом бъдат получени от вашите облачни услуги. ### Топъл път Топлият път се отнася до данни, които могат да бъдат обработени малко след като бъдат получени, например за отчети или краткосрочна аналитика. Бихте използвали топли данни за дневни отчети за пробега на превозни средства, използвайки данни, събрани предишния ден. Топлите данни се съхраняват веднага след като бъдат получени от облачната услуга в някакъв вид съхранение, което може да бъде бързо достъпно. ### Студен път Студеният път се отнася до исторически данни, които се съхраняват дългосрочно и могат да бъдат обработени, когато е необходимо. Например, можете да използвате студените данни за годишни отчети за пробега на превозни средства или за анализ на маршрути, за да намерите най-оптималния маршрут за намаляване на разходите за гориво. Студените данни се съхраняват в хранилища за данни - бази данни, предназначени за съхранение на големи количества данни, които никога няма да се променят и могат да бъдат извлечени бързо и лесно. Обикновено имате редовна задача във вашето облачно приложение, която се изпълнява в определено време всеки ден, седмица или месец, за да премести данни от топло съхранение в хранилището за данни. ✅ Помислете за данните, които сте събрали досега в тези уроци. Те горещи, топли или студени данни ли са? ## Обработка на GPS събития с безсървърен код След като данните започнат да се изпращат към вашия IoT Hub, можете да напишете безсървърен код, който да слуша събития, публикувани към Event-Hub съвместимия край. Това е топлият път - тези данни ще бъдат съхранени и използвани в следващия урок за отчитане на пътуването. ![Изпращане на GPS телеметрия от IoT устройство към IoT Hub, след това към Azure Functions чрез event hub trigger](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.bg.png) ### Задача - обработка на GPS събития с безсървърен код 1. Създайте Azure Functions приложение, използвайки Azure Functions CLI. Използвайте Python runtime и го създайте в папка, наречена `gps-trigger`, като използвате същото име за името на проекта за Functions App. Уверете се, че създавате виртуална среда, която да използвате за това. > ⚠️ Можете да се обърнете към [инструкциите за създаване на проект за Azure Functions от проект 2, урок 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application), ако е необходимо. 1. Добавете тригер за събития от IoT Hub, който използва съвместимата с Event Hub крайна точка на IoT Hub. > ⚠️ Можете да се обърнете към [инструкциите за създаване на тригер за събития от IoT Hub от проект 2, урок 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger), ако е необходимо. 1. Задайте низ за връзка към съвместимата с Event Hub крайна точка в файла `local.settings.json` и използвайте ключа за този запис във файла `function.json`. 1. Използвайте приложението Azurite като емулатор за локално съхранение. 1. Стартирайте приложението си с функции, за да се уверите, че получава събития от вашето GPS устройство. Уверете се, че вашето IoT устройство също работи и изпраща GPS данни. ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## Azure Storage Accounts ![Логото на Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.bg.png) Azure Storage Accounts е универсална услуга за съхранение, която може да съхранява данни по различни начини. Можете да съхранявате данни като блобове, в опашки, в таблици или като файлове, и всичко това едновременно. ### Блоб съхранение Думата *Blob* означава големи двоични обекти, но се е превърнала в термин за всякакви неструктурирани данни. Можете да съхранявате всякакви данни в блоб съхранение, от JSON документи, съдържащи IoT данни, до изображения и видео файлове. Блоб съхранението има концепцията за *контейнери*, наречени "кофи", в които можете да съхранявате данни, подобно на таблици в релационна база данни. Тези контейнери могат да имат една или повече папки за съхранение на блобове, а всяка папка може да съдържа други папки, подобно на начина, по който файловете се съхраняват на твърдия диск на вашия компютър. В този урок ще използвате блоб съхранение за съхранение на IoT данни. ✅ Направете проучване: Прочетете за [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) ### Таблично съхранение Табличното съхранение ви позволява да съхранявате полу-структурирани данни. Табличното съхранение всъщност е NoSQL база данни, така че не изисква предварително дефиниран набор от таблици, но е проектирано да съхранява данни в една или повече таблици с уникални ключове за дефиниране на всеки ред. ✅ Направете проучване: Прочетете за [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) ### Опашково съхранение Опашковото съхранение ви позволява да съхранявате съобщения с размер до 64KB в опашка. Можете да добавяте съобщения в края на опашката и да ги четете от началото. Опашките съхраняват съобщенията за неопределено време, докато има налично пространство за съхранение, което позволява съобщенията да се съхраняват дългосрочно и да се четат, когато е необходимо. Например, ако искате да изпълнявате месечна задача за обработка на GPS данни, можете да добавяте данни в опашката всеки ден за един месец, а след това в края на месеца да обработите всички съобщения от опашката. ✅ Направете проучване: Прочетете за [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) ### Файлово съхранение Файловото съхранение представлява съхранение на файлове в облака, като всяко приложение или устройство може да се свърже, използвайки стандартни протоколи. Можете да записвате файлове във файловото съхранение и след това да го монтирате като диск на вашия компютър или Mac. ✅ Направете проучване: Прочетете за [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) ## Свържете вашия безсървърен код със съхранението Вашето приложение с функции сега трябва да се свърже с блоб съхранението, за да съхранява съобщенията от IoT Hub. Има два начина да направите това: * Вътре в кода на функцията, свържете се с блоб съхранението, използвайки Python SDK за блоб съхранение, и запишете данните като блобове. * Използвайте изходно свързване на функция, за да свържете стойността на връщане на функцията с блоб съхранението и автоматично да запишете блоба. В този урок ще използвате Python SDK, за да видите как да взаимодействате с блоб съхранението. ![Изпращане на GPS телеметрия от IoT устройство към IoT Hub, след това към Azure Functions чрез тригер за събития от Event Hub, и след това записване в блоб съхранение](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.bg.png) Данните ще бъдат записани като JSON блоб със следния формат: ```json { "device_id": , "timestamp" :