# Datos de ubicación de la tienda ![Una vista general en sketchnote de esta lección](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.es.jpg) > Sketchnote por [Nitya Narasimhan](https://github.com/nitya). Haz clic en la imagen para una versión más grande. ## Cuestionario previo a la lección [Cuestionario previo a la lección](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## Introducción En la última lección, aprendiste cómo usar un sensor GPS para capturar datos de ubicación. Para usar estos datos y visualizar la ubicación de un camión cargado de alimentos y su recorrido, es necesario enviarlos a un servicio IoT en la nube y luego almacenarlos en algún lugar. En esta lección aprenderás sobre las diferentes formas de almacenar datos IoT y cómo guardar datos de tu servicio IoT utilizando código sin servidor. En esta lección cubriremos: * [Datos estructurados y no estructurados](../../../../../3-transport/lessons/2-store-location-data) * [Enviar datos GPS a un IoT Hub](../../../../../3-transport/lessons/2-store-location-data) * [Rutas calientes, templadas y frías](../../../../../3-transport/lessons/2-store-location-data) * [Manejar eventos GPS usando código sin servidor](../../../../../3-transport/lessons/2-store-location-data) * [Cuentas de almacenamiento de Azure](../../../../../3-transport/lessons/2-store-location-data) * [Conectar tu código sin servidor al almacenamiento](../../../../../3-transport/lessons/2-store-location-data) ## Datos estructurados y no estructurados Los sistemas informáticos manejan datos, y estos datos vienen en diferentes formas y tamaños. Pueden variar desde números individuales, grandes cantidades de texto, videos e imágenes, hasta datos IoT. Los datos generalmente se dividen en una de dos categorías: *estructurados* y *no estructurados*. * **Datos estructurados** son datos con una estructura bien definida y rígida que no cambia, y usualmente se mapean a tablas de datos con relaciones. Un ejemplo es la información de una persona, incluyendo su nombre, fecha de nacimiento y dirección. * **Datos no estructurados** son datos sin una estructura bien definida y rígida, incluyendo datos que pueden cambiar de estructura frecuentemente. Un ejemplo son documentos como textos escritos o hojas de cálculo. ✅ Investiga: ¿Puedes pensar en otros ejemplos de datos estructurados y no estructurados? > 💁 También existen datos semiestructurados que tienen estructura pero no encajan en tablas de datos fijas. Los datos IoT generalmente se consideran datos no estructurados. Imagina que estás añadiendo dispositivos IoT a una flota de vehículos para una gran granja comercial. Podrías querer usar diferentes dispositivos para diferentes tipos de vehículos. Por ejemplo: * Para vehículos agrícolas como tractores, necesitas datos GPS para asegurarte de que están trabajando en los campos correctos. * Para camiones de reparto que transportan alimentos a almacenes, necesitas datos GPS, así como datos de velocidad y aceleración para garantizar que el conductor maneje de forma segura, además de datos de identidad del conductor y de inicio/parada para cumplir con las leyes locales sobre horas de trabajo. * Para camiones refrigerados, también necesitas datos de temperatura para asegurarte de que los alimentos no se calienten o enfríen demasiado y se echen a perder durante el transporte. Estos datos pueden cambiar constantemente. Por ejemplo, si el dispositivo IoT está en la cabina de un camión, los datos que envía pueden cambiar según el remolque, por ejemplo, enviando datos de temperatura solo cuando se utiliza un remolque refrigerado. ✅ ¿Qué otros datos IoT podrían capturarse? Piensa en los tipos de cargas que los camiones pueden transportar, así como en datos de mantenimiento. Estos datos varían de un vehículo a otro, pero todos se envían al mismo servicio IoT para su procesamiento. El servicio IoT necesita ser capaz de procesar estos datos no estructurados, almacenándolos de una manera que permita buscarlos o analizarlos, pero que funcione con diferentes estructuras de datos. ### Almacenamiento SQL vs NoSQL Las bases de datos son servicios que permiten almacenar y consultar datos. Las bases de datos vienen en dos tipos: SQL y NoSQL. #### Bases de datos SQL Las primeras bases de datos fueron Sistemas de Gestión de Bases de Datos Relacionales (RDBMS), o bases de datos relacionales. También se conocen como bases de datos SQL debido al Lenguaje de Consulta Estructurado (SQL) utilizado para interactuar con ellas para agregar, eliminar, actualizar o consultar datos. Estas bases de datos consisten en un esquema: un conjunto bien definido de tablas de datos, similar a una hoja de cálculo. Cada tabla tiene múltiples columnas con nombres. Cuando insertas datos, agregas una fila a la tabla, colocando valores en cada una de las columnas. Esto mantiene los datos en una estructura muy rígida: aunque puedes dejar columnas vacías, si deseas agregar una nueva columna, debes hacerlo en la base de datos, rellenando valores para las filas existentes. Estas bases de datos son relacionales, en el sentido de que una tabla puede tener una relación con otra. ![Una base de datos relacional con el ID de la tabla de usuarios relacionado con la columna de ID de usuario de la tabla de compras, y el ID de la tabla de productos relacionado con el ID de producto de la tabla de compras](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.es.png) Por ejemplo, si almacenas los detalles personales de un usuario en una tabla, tendrías algún tipo de ID único interno por usuario que se utiliza en una fila de una tabla que contiene el nombre y la dirección del usuario. Si luego quisieras almacenar otros detalles sobre ese usuario, como sus compras, en otra tabla, tendrías una columna en la nueva tabla para el ID de ese usuario. Cuando buscas un usuario, puedes usar su ID para obtener sus detalles personales de una tabla y sus compras de otra. Las bases de datos SQL son ideales para almacenar datos estructurados y para cuando deseas asegurarte de que los datos coincidan con tu esquema. ✅ Si no has usado SQL antes, tómate un momento para leer sobre ello en la [página de SQL en Wikipedia](https://wikipedia.org/wiki/SQL). Algunas bases de datos SQL conocidas son Microsoft SQL Server, MySQL y PostgreSQL. ✅ Investiga: Lee sobre algunas de estas bases de datos SQL y sus capacidades. #### Bases de datos NoSQL Las bases de datos NoSQL se llaman NoSQL porque no tienen la misma estructura rígida de las bases de datos SQL. También se conocen como bases de datos de documentos, ya que pueden almacenar datos no estructurados como documentos. > 💁 A pesar de su nombre, algunas bases de datos NoSQL permiten usar SQL para consultar los datos. ![Documentos en carpetas en una base de datos NoSQL](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.es.png) Las bases de datos NoSQL no tienen un esquema predefinido que limite cómo se almacenan los datos; en cambio, puedes insertar cualquier dato no estructurado, generalmente utilizando documentos JSON. Estos documentos pueden organizarse en carpetas, similar a los archivos en tu computadora. Cada documento puede tener diferentes campos en comparación con otros documentos. Por ejemplo, si estuvieras almacenando datos IoT de tus vehículos agrícolas, algunos podrían tener campos para datos de acelerómetro y velocidad, mientras que otros podrían tener campos para la temperatura en el remolque. Si agregaras un nuevo tipo de camión, como uno con básculas integradas para rastrear el peso de los productos transportados, entonces tu dispositivo IoT podría agregar este nuevo campo y podría almacenarse sin cambios en la base de datos. Algunas bases de datos NoSQL conocidas incluyen Azure CosmosDB, MongoDB y CouchDB. ✅ Investiga: Lee sobre algunas de estas bases de datos NoSQL y sus capacidades. En esta lección, usarás almacenamiento NoSQL para guardar datos IoT. ## Enviar datos GPS a un IoT Hub En la última lección capturaste datos GPS de un sensor GPS conectado a tu dispositivo IoT. Para almacenar estos datos IoT en la nube, necesitas enviarlos a un servicio IoT. Una vez más, usarás Azure IoT Hub, el mismo servicio IoT en la nube que utilizaste en el proyecto anterior. ![Enviando telemetría GPS desde un dispositivo IoT a IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.es.png) ### Tarea - enviar datos GPS a un IoT Hub 1. Crea un nuevo IoT Hub utilizando el nivel gratuito. > ⚠️ Puedes consultar las [instrucciones para crear un IoT Hub del proyecto 2, lección 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) si es necesario. Recuerda crear un nuevo Grupo de Recursos. Nombra el nuevo Grupo de Recursos `gps-sensor` y el nuevo IoT Hub con un nombre único basado en `gps-sensor`, como `gps-sensor-`. > 💁 Si aún tienes tu IoT Hub del proyecto anterior, puedes reutilizarlo. Recuerda usar el nombre de este IoT Hub y el Grupo de Recursos en el que está al crear otros servicios. 1. Agrega un nuevo dispositivo al IoT Hub. Llama a este dispositivo `gps-sensor`. Obtén la cadena de conexión para el dispositivo. 1. Actualiza el código de tu dispositivo para enviar los datos GPS al nuevo IoT Hub utilizando la cadena de conexión del dispositivo obtenida en el paso anterior. > ⚠️ Puedes consultar las [instrucciones para conectar tu dispositivo a un IoT del proyecto 2, lección 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) si es necesario. 1. Cuando envíes los datos GPS, hazlo en formato JSON con el siguiente formato: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. Envía datos GPS cada minuto para no exceder tu asignación diaria de mensajes. Si estás utilizando el Wio Terminal, recuerda agregar todas las bibliotecas necesarias y configurar la hora utilizando un servidor NTP. Tu código también debe asegurarse de haber leído todos los datos del puerto serial antes de enviar la ubicación GPS, utilizando el código existente de la última lección. Usa el siguiente código para construir el documento JSON: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` Si estás utilizando un dispositivo IoT virtual, recuerda instalar todas las bibliotecas necesarias utilizando un entorno virtual. Para tanto el Raspberry Pi como el dispositivo IoT virtual, utiliza el código existente de la última lección para obtener los valores de latitud y longitud, luego envíalos en el formato JSON correcto con el siguiente código: ```python message_json = { "gps" : { "lat":lat, "lon":lon } } print("Sending telemetry", message_json) message = Message(json.dumps(message_json)) ``` > 💁 Puedes encontrar este código en la carpeta [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) o [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device). Ejecuta el código de tu dispositivo y asegúrate de que los mensajes estén fluyendo hacia IoT Hub utilizando el comando CLI `az iot hub monitor-events`. ## Rutas calientes, templadas y frías Los datos que fluyen desde un dispositivo IoT hacia la nube no siempre se procesan en tiempo real. Algunos datos necesitan procesamiento en tiempo real, otros pueden procesarse poco tiempo después, y otros pueden procesarse mucho más tarde. El flujo de datos hacia diferentes servicios que procesan los datos en diferentes momentos se conoce como rutas calientes, templadas y frías. ### Ruta caliente La ruta caliente se refiere a los datos que necesitan ser procesados en tiempo real o casi en tiempo real. Usarías datos de ruta caliente para alertas, como recibir notificaciones de que un vehículo se está acercando a un depósito o que la temperatura en un camión refrigerado es demasiado alta. Para usar datos de ruta caliente, tu código respondería a eventos tan pronto como sean recibidos por tus servicios en la nube. ### Ruta templada La ruta templada se refiere a los datos que pueden procesarse poco tiempo después de ser recibidos, por ejemplo, para informes o análisis a corto plazo. Usarías datos de ruta templada para informes diarios sobre el kilometraje de los vehículos, utilizando datos recopilados el día anterior. Los datos de ruta templada se almacenan una vez que son recibidos por el servicio en la nube dentro de algún tipo de almacenamiento que pueda ser accedido rápidamente. ### Ruta fría La ruta fría se refiere a datos históricos, almacenando datos a largo plazo para ser procesados cuando sea necesario. Por ejemplo, podrías usar la ruta fría para obtener informes anuales de kilometraje de vehículos o realizar análisis de rutas para encontrar la ruta más óptima y reducir costos de combustible. Los datos de ruta fría se almacenan en almacenes de datos: bases de datos diseñadas para almacenar grandes cantidades de datos que nunca cambiarán y que pueden ser consultados de manera rápida y sencilla. Normalmente tendrías un trabajo regular en tu aplicación en la nube que se ejecutaría a una hora regular cada día, semana o mes para mover datos del almacenamiento de ruta templada al almacén de datos. ✅ Piensa en los datos que has capturado hasta ahora en estas lecciones. ¿Son datos de ruta caliente, templada o fría? ## Manejar eventos GPS usando código sin servidor Una vez que los datos están fluyendo hacia tu IoT Hub, puedes escribir código sin servidor para escuchar eventos publicados en el punto de conexión compatible con Event-Hub. Esta es la ruta templada: estos datos serán almacenados y utilizados en la próxima lección para informes sobre el recorrido. ![Enviando telemetría GPS desde un dispositivo IoT a IoT Hub, luego a Azure Functions mediante un disparador de Event Hub](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.es.png) ### Tarea - manejar eventos GPS usando código sin servidor 1. Crea una aplicación de Azure Functions utilizando la CLI de Azure Functions. Usa el runtime de Python y créala en una carpeta llamada `gps-trigger`, utilizando el mismo nombre para el proyecto de la aplicación de Functions. Asegúrate de crear un entorno virtual para esto. > ⚠️ Puedes consultar las [instrucciones para crear un proyecto de Azure Functions del proyecto 2, lección 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) si es necesario. 1. Agrega un desencadenador de eventos de IoT Hub que utilice el endpoint compatible con Event Hub del IoT Hub. > ⚠️ Puedes consultar las [instrucciones para crear un desencadenador de eventos de IoT Hub del proyecto 2, lección 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) si es necesario. 1. Configura la cadena de conexión del endpoint compatible con Event Hub en el archivo `local.settings.json`, y utiliza la clave correspondiente en el archivo `function.json`. 1. Usa la aplicación Azurite como emulador de almacenamiento local. 1. Ejecuta tu aplicación de funciones para asegurarte de que está recibiendo eventos desde tu dispositivo GPS. Asegúrate de que tu dispositivo IoT también esté funcionando y enviando datos GPS. ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## Cuentas de Almacenamiento de Azure ![El logotipo de Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.es.png) Las Cuentas de Almacenamiento de Azure son un servicio de almacenamiento de propósito general que puede almacenar datos de diversas maneras. Puedes almacenar datos como blobs, en colas, en tablas o como archivos, y todo al mismo tiempo. ### Almacenamiento de blobs La palabra *Blob* significa objetos binarios grandes, pero se ha convertido en el término para cualquier dato no estructurado. Puedes almacenar cualquier dato en el almacenamiento de blobs, desde documentos JSON que contienen datos de IoT, hasta archivos de imágenes y películas. El almacenamiento de blobs tiene el concepto de *contenedores*, que son como carpetas nombradas donde puedes almacenar datos, similar a las tablas en una base de datos relacional. Estos contenedores pueden tener una o más carpetas para almacenar blobs, y cada carpeta puede contener otras carpetas, similar a cómo se almacenan los archivos en el disco duro de tu computadora. Usarás el almacenamiento de blobs en esta lección para almacenar datos de IoT. ✅ Investiga: Lee sobre el [Almacenamiento de Blobs de Azure](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) ### Almacenamiento de tablas El almacenamiento de tablas te permite almacenar datos semiestructurados. El almacenamiento de tablas es en realidad una base de datos NoSQL, por lo que no requiere un conjunto definido de tablas de antemano, pero está diseñado para almacenar datos en una o más tablas, con claves únicas para definir cada fila. ✅ Investiga: Lee sobre el [Almacenamiento de Tablas de Azure](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) ### Almacenamiento de colas El almacenamiento de colas te permite almacenar mensajes de hasta 64 KB de tamaño en una cola. Puedes agregar mensajes al final de la cola y leerlos desde el principio. Las colas almacenan mensajes indefinidamente mientras haya espacio de almacenamiento disponible, lo que permite que los mensajes se almacenen a largo plazo y se lean cuando sea necesario. Por ejemplo, si quisieras ejecutar un trabajo mensual para procesar datos GPS, podrías agregar mensajes a una cola todos los días durante un mes y luego, al final del mes, procesar todos los mensajes de la cola. ✅ Investiga: Lee sobre el [Almacenamiento de Colas de Azure](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) ### Almacenamiento de archivos El almacenamiento de archivos es el almacenamiento de archivos en la nube, y cualquier aplicación o dispositivo puede conectarse utilizando protocolos estándar de la industria. Puedes escribir archivos en el almacenamiento de archivos y luego montarlo como una unidad en tu PC o Mac. ✅ Investiga: Lee sobre el [Almacenamiento de Archivos de Azure](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) ## Conecta tu código sin servidor al almacenamiento Tu aplicación de funciones ahora necesita conectarse al almacenamiento de blobs para almacenar los mensajes del IoT Hub. Hay dos maneras de hacerlo: * Dentro del código de la función, conecta al almacenamiento de blobs utilizando el SDK de Python para blobs y escribe los datos como blobs. * Usa un enlace de salida de función para vincular el valor de retorno de la función al almacenamiento de blobs y que el blob se guarde automáticamente. En esta lección, usarás el SDK de Python para ver cómo interactuar con el almacenamiento de blobs. ![Enviando telemetría GPS desde un dispositivo IoT a IoT Hub, luego a Azure Functions a través de un desencadenador de Event Hub, y luego guardándolo en el almacenamiento de blobs](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.es.png) Los datos se guardarán como un blob JSON con el siguiente formato: ```json { "device_id": , "timestamp" :