# Зберігання даних про місцезнаходження ![Скетчнот із оглядом цього уроку](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.uk.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](../../../../../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 таблиці користувачів пов'язаний зі стовпцем ID користувача таблиці покупок, а ID таблиці продуктів пов'язаний зі стовпцем ID продукту таблиці покупок](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.uk.png) Наприклад, якщо ви зберігаєте особисті дані користувачів у таблиці, у вас буде якийсь внутрішній унікальний ID для кожного користувача, який використовується в рядку таблиці, що містить ім'я та адресу користувача. Якщо ви хочете зберігати інші дані про цього користувача, наприклад, його покупки, в іншій таблиці, у вас буде один стовпець у новій таблиці для ID цього користувача. Коли ви шукаєте користувача, ви можете використовувати його ID, щоб отримати його особисті дані з однієї таблиці та його покупки з іншої. SQL-бази даних ідеально підходять для зберігання структурованих даних і для випадків, коли ви хочете забезпечити відповідність даних вашій схемі. ✅ Якщо ви раніше не використовували SQL, знайдіть час, щоб ознайомитися з ним на [сторінці SQL у Вікіпедії](https://wikipedia.org/wiki/SQL). Деякі відомі SQL-бази даних — це Microsoft SQL Server, MySQL і PostgreSQL. ✅ Проведіть дослідження: Ознайомтеся з деякими з цих SQL-баз даних та їх можливостями. #### NoSQL-бази даних NoSQL-бази даних називаються NoSQL, тому що вони не мають такої ж жорсткої структури, як SQL-бази даних. Їх також називають документними базами даних, оскільки вони можуть зберігати неструктуровані дані, такі як документи. > 💁 Незважаючи на свою назву, деякі NoSQL-бази даних дозволяють використовувати SQL для запитів до даних. ![Документи у папках у NoSQL-базі даних](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.uk.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.uk.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), якщо це необхідно. Не забудьте створити нову групу ресурсів. Назвіть нову групу ресурсів `gps-sensor`, а новий IoT Hub — унікальним ім'ям на основі `gps-sensor`, наприклад, `gps-sensor-<ваше ім'я>`. > 💁 Якщо у вас все ще є ваш IoT Hub з попереднього проєкту, ви можете повторно використовувати його. Не забудьте використовувати ім'я цього IoT Hub і групи ресурсів, у якій він знаходиться, під час створення інших сервісів. 1. Додайте новий пристрій до IoT Hub. Назвіть цей пристрій `gps-sensor`. Отримайте рядок підключення для пристрою. 1. Оновіть код вашого пристрою, щоб відправляти GPS-дані до нового IoT Hub, використовуючи рядок підключення пристрою з попереднього кроку. > ⚠️ Ви можете звернутися до [інструкцій із підключення вашого пристрою до 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](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.uk.png) ### Зав > ⚠️ Ви можете звернутися до [інструкцій зі створення проекту 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 ![Логотип Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.uk.png) Облікові записи сховища Azure — це універсальна служба зберігання даних, яка може зберігати дані різними способами. Ви можете зберігати дані як блоби, у чергах, у таблицях або як файли, і все це одночасно. ### Зберігання блобів Слово *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) ### Зберігання черг Зберігання черг дозволяє зберігати повідомлення розміром до 64 КБ у черзі. Ви можете додавати повідомлення в кінець черги і читати їх з початку. Черги зберігають повідомлення необмежений час, поки є місце для зберігання, що дозволяє зберігати повідомлення довгостроково, а потім читати їх, коли це необхідно. Наприклад, якщо ви хочете запускати щомісячну задачу для обробки 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.uk.png) Дані будуть збережені як JSON-блоб у наступному форматі: ```json { "device_id": , "timestamp" :