Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Los tutoriales de Mixed Reality Academy se han diseñado teniendo en cuenta HoloLens (1.ª generación) y los cascos envolventes de realidad mixta. Por lo tanto, creemos que es importante conservar estos tutoriales para los desarrolladores que sigan buscando instrucciones sobre el desarrollo para esos dispositivos. Estos tutoriales no se actualizarán con los conjuntos de herramientas o las interacciones más recientes que se usan para HoloLens 2. Se mantendrán para que sigan funcionando en los dispositivos compatibles. Habrá una nueva serie de tutoriales que se publicarán en el futuro que demostrarán cómo desarrollar para HoloLens 2. Este aviso se actualizará con un vínculo a esos tutoriales cuando se publiquen.
En este curso, aprenderá a implementar un servicio Azure IoT Hub en una máquina virtual que ejecute el sistema operativo Ubuntu 16.4. Después, se usará una aplicación de funciones de Azure para recibir mensajes de la máquina virtual Ubuntu y almacenar el resultado en una instancia de Azure Table Service. Después, podrá ver estos datos mediante Power BI en Microsoft HoloLens o casco envolvente (VR).
El contenido de este curso es aplicable a los dispositivos IoT Edge, aunque para este curso, el enfoque estará en un entorno de máquina virtual, de modo que no sea necesario acceder a un dispositivo perimetral físico.
Al completar este curso, aprenderá a:
- Implemente un módulo de IoT Edge en una máquina virtual (sistema operativo Ubuntu 16), que representará el dispositivo IoT.
- Agregue un modelo de Tensorflow de Azure Custom Vision al módulo Edge, con código que analizará las imágenes almacenadas en el contenedor.
- Configure el módulo para enviar el mensaje de resultado del análisis de nuevo al servicio IoT Hub.
- Use una aplicación de funciones de Azure para almacenar el mensaje dentro de una tabla de Azure.
- Configure Power BI para recopilar el mensaje almacenado y crear un informe.
- Visualizar los datos de mensajes de IoT en Power BI.
Los Servicios que usará incluyen:
Azure IoT Hub es un servicio de Microsoft Azure que permite a los desarrolladores conectarse, supervisar y administrar recursos de IoT. Para más información, visite la página del servicio Azure IoT Hub.
Azure Container Registry es un servicio de Microsoft Azure que permite a los desarrolladores almacenar imágenes de contenedor para varios tipos de contenedores. Para más información, visite la página azure Container Registry Service.
Azure Function App es un servicio de Microsoft Azure, que permite a los desarrolladores ejecutar pequeños fragmentos de código, "funciones", en Azure. Esto proporciona una manera de delegar el trabajo en la nube, en lugar de la aplicación local, lo que puede tener muchas ventajas. Azure Functions admite varios lenguajes de desarrollo, como C#, F#, Node.js, Java y PHP. Para más información, visite la página de Azure Functions.
Azure Storage: las tablas son un servicio de Microsoft Azure, que permite a los desarrolladores almacenar datos estructurados, no SQL, en la nube, lo que facilita su acceso a cualquier lugar. El servicio cuenta con un diseño sin esquema, lo que permite la evolución de las tablas según sea necesario y, por tanto, es muy flexible. Para más información, visite la página Tablas de Azure.
Este curso le enseñará a configurar y usar el servicio IoT Hub y, a continuación, visualizará una respuesta proporcionada por un dispositivo. Dependerá de aplicar estos conceptos a una configuración personalizada del servicio IoT Hub, que podría compilar.
Compatibilidad con dispositivos
Curso | HoloLens | Cascos envolventes |
---|---|---|
MR y Azure 313: Servicio IoT Hub | ✔️ | ✔️ |
Requisitos previos
Para conocer los requisitos previos más actualizados para desarrollar con Mixed Reality, incluido con Microsoft HoloLens, visite el artículo Instalación de las herramientas .
Nota:
Este tutorial está diseñado para desarrolladores que tienen experiencia básica con Python. Tenga en cuenta también que los requisitos previos y las instrucciones escritas de este documento representan lo que se ha probado y comprobado en el momento de redactarlo (julio de 2018). Puede usar el software más reciente, como se muestra en el artículo de instalación de las herramientas , aunque no debe suponerse que la información de este curso coincidirá perfectamente con lo que encontrará en el software más reciente que el que se muestra a continuación.
Se requiere el siguiente hardware y software:
Windows 10 Fall Creators Update (o posterior), modo de desarrollador habilitado
Advertencia
No se puede ejecutar una máquina virtual con Hyper-V en Windows 10 Home Edition.
SDK de Windows 10 (versión más reciente)
HoloLens, modo de desarrollador habilitado
Visual Studio 2017.15.4 (solo se usa para acceder a Azure Cloud Explorer)
Acceso a Internet para Azure y para el servicio IoT Hub. Para más información, siga este vínculo a la página del servicio IoT Hub.
Un modelo de Machine Learning. Si no tiene su propio modelo listo para usarse, puede usar el modelo proporcionado con este curso.
Software de Hyper-V habilitado en la máquina de desarrollo de Windows 10.
Una máquina virtual que ejecuta Ubuntu (16.4 o 18.4), que se ejecuta en la máquina de desarrollo o, como alternativa, puede usar un equipo independiente que ejecute Linux (Ubuntu 16.4 o 18.4). Puede encontrar más información sobre cómo crear una máquina virtual en Windows mediante Hyper-V en el capítulo "Antes de empezar".
Antes de comenzar
- Configure y pruebe holoLens. Si necesita compatibilidad con la configuración de HoloLens, asegúrese de visitar el artículo configuración de HoloLens.
- Es una buena idea realizar la calibración y la optimización del sensor al empezar a desarrollar una nueva aplicación de HoloLens (a veces puede ayudar a realizar esas tareas para cada usuario).
Para obtener ayuda sobre calibración, siga este vínculo al artículo Calibración de HoloLens.
Para obtener ayuda sobre la optimización del sensor, siga este vínculo al artículo Optimización de sensores de HoloLens.
Configure la máquina virtual Ubuntu mediante Hyper-V. Los siguientes recursos le ayudarán con el proceso.
- En primer lugar, siga este vínculo para descargar la ISO de Ubuntu 16.04.4 LTS (Xenial Xerus). Seleccione la imagen de escritorio de PC (AMD64) de 64 bits.
- Asegúrese de que Hyper-V está habilitado en la máquina Windows 10. Puede seguir este vínculo para obtener instrucciones sobre cómo instalar y habilitar Hyper-V en Windows 10.
- Inicie Hyper-V y cree una nueva máquina virtual Ubuntu. Puede seguir este vínculo para obtener una guía paso a paso sobre cómo crear una máquina virtual con Hyper-V. Cuando se le solicite que instale un sistema operativo desde un archivo de imagen de arranque, seleccione la ISO de Ubuntu que ha descargado anteriormente.
Nota:
No se recomienda usar la creación rápida de Hyper-V.
Capítulo 1: Recuperación del modelo de Custom Vision
Con este curso tendrá acceso a un modelo de Custom Vision pregenerado que detecta teclados y ratones de imágenes. Si lo usa, vaya al capítulo 2.
Sin embargo, puede seguir estos pasos si desea usar su propio modelo de Custom Vision:
En el proyecto de Custom Vision, vaya a la pestaña Rendimiento .
Advertencia
El modelo debe usar un dominio compacto para exportar el modelo. Puede cambiar el dominio de modelos en la configuración del proyecto.
Seleccione la iteración que desea exportar y haga clic en Exportar. Aparecerá una hoja.
En la hoja, haga clic en Archivo de Docker.
Haga clic en Linux en el menú desplegable y, a continuación, haga clic en Descargar.
Descomprima el contenido. Lo usará más adelante en este curso.
Capítulo 2: El servicio Container Registry
Container Registry Service es el repositorio que se usa para hospedar los contenedores.
El servicio IoT Hub que va a compilar y usar en este curso, hace referencia a Container Registry Service para obtener los contenedores que se van a implementar en el dispositivo perimetral.
En primer lugar, siga este vínculo a Azure Portal e inicie sesión con sus credenciales.
Vaya a Crear un recurso y busque Container Registry.
Haga clic en Crear.
Establezca los parámetros de configuración del servicio:
Inserte un nombre para el proyecto, en este ejemplo se denomina IoTCRegistry.
Elija un grupo de recursos o cree uno nuevo. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar, la facturación de una colección de recursos de Azure. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).
Establezca la ubicación del servicio.
Establezca Usuario administrador en Habilitar.
Establezca SKU en Básico.
Haga clic en Crear y espere a que se creen los servicios.
Una vez que la notificación aparezca informando de la creación correcta de Container Registry, haga clic en Ir al recurso para que se le redirija a la página Servicio.
En la página Container Registry Service , haga clic en Claves de acceso.
Tome nota (puede usar el Bloc de notas) de los parámetros siguientes:
- Servidor de inicio de sesión
- Nombre de usuario
- Contraseña
Capítulo 3: El servicio IoT Hub
Ahora comenzará la creación y configuración del servicio IoT Hub.
Si aún no ha iniciado sesión, inicie sesión en Azure Portal.
Una vez que haya iniciado sesión, haga clic en Crear un recurso en la esquina superior izquierda y busque IoT Hub y haga clic en Entrar.
La nueva página proporcionará una descripción del servicio de cuenta de almacenamiento. En la parte inferior izquierda de este símbolo del sistema, haga clic en el botón Crear para crear una instancia de este servicio.
Una vez que haya hecho clic en Crear, aparecerá un panel:
Elija un grupo de recursos o cree uno nuevo. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar la facturación de una colección de recursos de Azure. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).
Si desea obtener más información sobre los grupos de recursos de Azure, siga este vínculo sobre cómo administrar un grupo de recursos.
Seleccione una ubicación adecuada (use la misma ubicación en todos los servicios que cree en este curso).
Inserte el nombre deseado para esta instancia de servicio.
En la parte inferior de la página, haga clic en Siguiente: Tamaño y escala.
En esta página, seleccione el plan de tarifa y escalado (si se trata de la primera instancia de servicio de IoT Hub, debería estar disponible un nivel gratuito).
Haga clic en Revisar y crear.
Revise la configuración y haga clic en Crear.
Una vez que la notificación aparezca informando de la creación correcta del servicio IoT Hub , haga clic en Ir al recurso para que se le redirija a la página Servicio.
Desplácese por el panel lateral de la izquierda hasta que vea Automático Administración de dispositivos, haga clic en IoT Edge.
En la ventana que aparece a la derecha, haga clic en Agregar dispositivo IoT Edge. Aparecerá una hoja a la derecha.
En la hoja, proporcione al nuevo dispositivo un identificador de dispositivo (un nombre que prefiera). A continuación, haga clic en Guardar. Las claves principales y secundarias se generarán automáticamente, si tiene la opción Generar automáticamente.
Volverá a la sección Dispositivos IoT Edge, donde se mostrará el nuevo dispositivo. Haga clic en el nuevo dispositivo (que se describe en rojo en la imagen siguiente).
En la página Detalles del dispositivo que aparece, realice una copia de la cadena de conexión (clave principal).
Vuelva al panel de la izquierda y haga clic en Directivas de acceso compartido para abrirlo.
En la página que aparece, haga clic en iothubowner y aparecerá una hoja a la derecha de la pantalla.
Tome nota (en el Bloc de notas) de la cadena de conexión (clave principal) para usarlo más adelante al establecer la cadena de conexión en el dispositivo.
Capítulo 4: Configuración del entorno de desarrollo
Para crear e implementar módulos para IoT Hub Edge, necesitará los siguientes componentes instalados en la máquina de desarrollo que ejecuta Windows 10:
Docker para Windows, le pedirá que cree una cuenta para poder descargarla.
Importante
Docker requiere Que Windows 10 PRO, Enterprise 14393 o Windows Server 2016 RTM se ejecuten. Si ejecuta otras versiones de Windows 10, puede intentar instalar Docker mediante docker Toolbox.
Después de instalar el software mencionado anteriormente, deberá reiniciar la máquina.
Capítulo 5: Configuración del entorno de Ubuntu
Ahora puede pasar a configurar el dispositivo que ejecuta el sistema operativo Ubuntu. Siga estos pasos para instalar el software necesario para implementar los contenedores en la placa:
Importante
Siempre debe preceder a los comandos de terminal con sudo para ejecutarse como usuario administrador. Por ejemplo:
sudo docker \<option> \<command> \<argument>
Abra el terminal ubuntu y use el siguiente comando para instalar pip:
[! HINT] Puede abrir terminal muy fácilmente mediante el método abreviado de teclado: Ctrl + Alt + T.
sudo apt-get install python-pip
A lo largo de este capítulo, es posible que se le pida, por Terminal, permiso para usar el almacenamiento del dispositivo y para que usted escriba y/n (sí o no), escriba "y" y, a continuación, presione la tecla Entrar para aceptar.
Una vez completado el comando, use el siguiente comando para instalar curl:
sudo apt install curl
Una vez instalado pip y curl, use el siguiente comando para instalar el entorno de ejecución de IoT Edge, esto es necesario para implementar y controlar los módulos en la placa:
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > ./microsoft-prod.list sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/ sudo apt-get update sudo apt-get install moby-engine sudo apt-get install moby-cli sudo apt-get update sudo apt-get install iotedge
En este momento se le pedirá que abra el archivo de configuración en tiempo de ejecución para insertar la cadena de conexión del dispositivo, que anotó (en el Bloc de notas), al crear el servicio IoT Hub (en el paso 14, del capítulo 3). Ejecute la siguiente línea en el terminal para abrir ese archivo:
sudo nano /etc/iotedge/config.yaml
Se mostrará el archivo config.yaml , listo para editarlo:
Advertencia
Cuando se abre este archivo, puede resultar algo confuso. Estará editando el texto de este archivo, dentro del propio Terminal .
Use las teclas de dirección del teclado para desplazarse hacia abajo (deberá desplazarse hacia abajo un poco) para llegar a la línea que contiene":
"AGREGUE LA CADENA DE CONEXIÓN DEL DISPOSITIVO AQUÍ>".<
Sustituya la línea, incluidos los corchetes, con la cadena de conexión del dispositivo que anotó anteriormente.
Con la cadena de conexión en su lugar, en el teclado, presione las teclas Ctrl-X para guardar el archivo. Se le pedirá que confirme escribiendo Y. A continuación, presione la tecla Entrar para confirmar. Volverá al terminal normal.
Una vez que estos comandos se hayan ejecutado correctamente, habrá instalado el entorno de ejecución de IoT Edge. Una vez inicializado, el tiempo de ejecución se iniciará por sí mismo cada vez que el dispositivo esté encendido y se sentará en segundo plano, esperando a que los módulos se implementen desde el servicio IoT Hub.
Ejecute la siguiente línea de comandos para inicializar el entorno de ejecución de IoT Edge:
sudo systemctl restart iotedge
Importante
Si realiza cambios en el archivo .yaml o en la configuración anterior, deberá volver a ejecutar la línea de reinicio anterior en Terminal.
Para comprobar el estado del entorno de ejecución de IoT Edge , ejecute la siguiente línea de comandos. El tiempo de ejecución debe aparecer con el estado activo (en ejecución) en texto verde.
sudo systemctl status iotedge
Presione las teclas Ctrl-C para salir de la página de estado. Para comprobar que el entorno de ejecución de IoT Edge extrae correctamente los contenedores, escriba el siguiente comando:
sudo docker ps
Debería aparecer una lista con dos (2) contenedores. Estos son los módulos predeterminados creados automáticamente por el servicio IoT Hub (edgeAgent y edgeHub). Una vez que cree e implemente sus propios módulos, aparecerán en esta lista, debajo de los predeterminados.
Capítulo 6: Instalación de las extensiones
Importante
Los siguientes capítulos (6-9) se realizarán en la máquina Windows 10.
Abra VS Code.
Haga clic en el botón Extensiones (cuadrado) de la barra izquierda de VS Code para abrir el panel Extensiones.
Busque e instale las siguientes extensiones (como se muestra en la imagen siguiente):
- Azure IoT Edge
- Azure IoT Toolkit
- Docker
Una vez instaladas las extensiones, cierre y vuelva a abrir VS Code.
Con VS Code abierto una vez más, vaya a Ver>terminal integrado.
Ahora instalará Cookiecutter. En el terminal, ejecute el siguiente comando de Bash:
pip install --upgrade --user cookiecutter
[! HINT] Si tiene problemas con este comando:
- Reinicie VS Code o el equipo.
- Es posible que sea necesario cambiar el terminal de VS Code al que ha estado usando para instalar Python, es decir , PowerShell (especialmente en caso de que el entorno de Python ya esté instalado en el equipo). Con la terminal abierta, encontrará el menú desplegable en el lado derecho del terminal.
- Asegúrese de que la ruta de instalación de Python se agrega como Variable de entorno en la máquina. Cookiecutter debe formar parte de la misma ruta de acceso de ubicación. Siga este vínculo para obtener más información sobre las variables de entorno.
Una vez que Cookiecutter haya terminado de instalarse, debe reiniciar la máquina, de modo que Cookiecutter se reconozca como un comando, dentro del entorno del sistema.
Capítulo 7: Creación de la solución de contenedor
En este momento, debe crear el contenedor, con el módulo, para insertarlo en Container Registry. Una vez que haya insertado el contenedor, usará el servicio IoT Hub Edge para implementarlo en el dispositivo, que ejecuta el entorno de ejecución de IoT Edge.
En VS Code, haga clic en Ver>paleta de comandos.
En la paleta, busque y ejecute Azure IoT Edge: Nueva solución de IoT Edge.
Vaya a una ubicación en la que quiera crear la solución. Presione la tecla Entrar para aceptar la ubicación.
Asigne un nombre a la solución. Presione la tecla Entrar para confirmar el nombre proporcionado.
Ahora se le pedirá que elija el marco de plantilla de la solución. Haga clic en Módulo de Python. Presione la tecla Entrar para confirmar esta opción.
Asigne un nombre al módulo. Presione la tecla Entrar para confirmar el nombre del módulo. Asegúrese de tomar nota (con el Bloc de notas) del nombre del módulo, ya que se usa más adelante.
Observará que aparecerá una dirección del repositorio de imágenes de Docker precompilado en la paleta. Tendrá el siguiente aspecto:
localhost:5000/-EL NOMBRE DEL MÓDULO-.
Elimine localhost:5000 y, en su lugar, inserte la dirección del servidor de inicio de sesión de Container Registry, que anotó al crear el servicio Container Registry (en el paso 8, del capítulo 2). Presione la tecla Entrar para confirmar la dirección.
En este momento, se creará la solución que contiene la plantilla del módulo de Python y su estructura se mostrará en la pestaña Explorar, de VS Code, en el lado izquierdo de la pantalla. Si la pestaña Explorar no está abierta, puede abrirla haciendo clic en el botón superior, en la barra de la izquierda.
El último paso de este capítulo es hacer clic y abrir el archivo .env, desde la pestaña Explorar y agregar el nombre de usuario y la contraseña de Container Registry. Git omite este archivo, pero al compilar el contenedor, establecerá las credenciales para acceder al servicio Container Registry.
Capítulo 8: Edición de la solución de contenedor
Ahora completará la solución de contenedor mediante la actualización de los siguientes archivos:
- main.py script de Python.
- requirements.txt.
- deployment.template.json.
- Dockerfile.amd64
A continuación, creará la carpeta images , que usa el script de Python para comprobar si hay imágenes que coincidan con el modelo de Custom Vision. Por último, agregará el archivo labels.txt para ayudar a leer el modelo y el archivo model.pb, que es el modelo.
Con VS Code abierto, vaya a la carpeta del módulo y busque el script denominado main.py. Haga doble clic para abrirlo.
Elimine el contenido del archivo e inserte el código siguiente:
# Copyright (c) Microsoft. All rights reserved. # Licensed under the MIT license. See LICENSE file in the project root for # full license information. import random import sched, time import sys import iothub_client from iothub_client import IoTHubModuleClient, IoTHubClientError, IoTHubTransportProvider from iothub_client import IoTHubMessage, IoTHubMessageDispositionResult, IoTHubError import json import os import tensorflow as tf import os from PIL import Image import numpy as np import cv2 # messageTimeout - the maximum time in milliseconds until a message times out. # The timeout period starts at IoTHubModuleClient.send_event_async. # By default, messages do not expire. MESSAGE_TIMEOUT = 10000 # global counters RECEIVE_CALLBACKS = 0 SEND_CALLBACKS = 0 TEMPERATURE_THRESHOLD = 25 TWIN_CALLBACKS = 0 # Choose HTTP, AMQP or MQTT as transport protocol. Currently only MQTT is supported. PROTOCOL = IoTHubTransportProvider.MQTT # Callback received when the message that we're forwarding is processed. def send_confirmation_callback(message, result, user_context): global SEND_CALLBACKS print ( "Confirmation[%d] received for message with result = %s" % (user_context, result) ) map_properties = message.properties() key_value_pair = map_properties.get_internals() print ( " Properties: %s" % key_value_pair ) SEND_CALLBACKS += 1 print ( " Total calls confirmed: %d" % SEND_CALLBACKS ) def convert_to_opencv(image): # RGB -> BGR conversion is performed as well. r,g,b = np.array(image).T opencv_image = np.array([b,g,r]).transpose() return opencv_image def crop_center(img,cropx,cropy): h, w = img.shape[:2] startx = w//2-(cropx//2) starty = h//2-(cropy//2) return img[starty:starty+cropy, startx:startx+cropx] def resize_down_to_1600_max_dim(image): h, w = image.shape[:2] if (h < 1600 and w < 1600): return image new_size = (1600 * w // h, 1600) if (h > w) else (1600, 1600 * h // w) return cv2.resize(image, new_size, interpolation = cv2.INTER_LINEAR) def resize_to_256_square(image): h, w = image.shape[:2] return cv2.resize(image, (256, 256), interpolation = cv2.INTER_LINEAR) def update_orientation(image): exif_orientation_tag = 0x0112 if hasattr(image, '_getexif'): exif = image._getexif() if (exif != None and exif_orientation_tag in exif): orientation = exif.get(exif_orientation_tag, 1) # orientation is 1 based, shift to zero based and flip/transpose based on 0-based values orientation -= 1 if orientation >= 4: image = image.transpose(Image.TRANSPOSE) if orientation == 2 or orientation == 3 or orientation == 6 or orientation == 7: image = image.transpose(Image.FLIP_TOP_BOTTOM) if orientation == 1 or orientation == 2 or orientation == 5 or orientation == 6: image = image.transpose(Image.FLIP_LEFT_RIGHT) return image def analyse(hubManager): messages_sent = 0; while True: #def send_message(): print ("Load the model into the project") # These names are part of the model and cannot be changed. output_layer = 'loss:0' input_node = 'Placeholder:0' graph_def = tf.GraphDef() labels = [] labels_filename = "labels.txt" filename = "model.pb" # Import the TF graph with tf.gfile.FastGFile(filename, 'rb') as f: graph_def.ParseFromString(f.read()) tf.import_graph_def(graph_def, name='') # Create a list of labels with open(labels_filename, 'rt') as lf: for l in lf: labels.append(l.strip()) print ("Model loaded into the project") results_dic = dict() # create the JSON to be sent as a message json_message = '' # Iterate through images print ("List of images to analyse:") for file in os.listdir('images'): print(file) image = Image.open("images/" + file) # Update orientation based on EXIF tags, if the file has orientation info. image = update_orientation(image) # Convert to OpenCV format image = convert_to_opencv(image) # If the image has either w or h greater than 1600 we resize it down respecting # aspect ratio such that the largest dimension is 1600 image = resize_down_to_1600_max_dim(image) # We next get the largest center square h, w = image.shape[:2] min_dim = min(w,h) max_square_image = crop_center(image, min_dim, min_dim) # Resize that square down to 256x256 augmented_image = resize_to_256_square(max_square_image) # The compact models have a network size of 227x227, the model requires this size. network_input_size = 227 # Crop the center for the specified network_input_Size augmented_image = crop_center(augmented_image, network_input_size, network_input_size) try: with tf.Session() as sess: prob_tensor = sess.graph.get_tensor_by_name(output_layer) predictions, = sess.run(prob_tensor, {input_node: [augmented_image] }) except Exception as identifier: print ("Identifier error: ", identifier) print ("Print the highest probability label") highest_probability_index = np.argmax(predictions) print('FINAL RESULT! Classified as: ' + labels[highest_probability_index]) l = labels[highest_probability_index] results_dic[file] = l # Or you can print out all of the results mapping labels to probabilities. label_index = 0 for p in predictions: truncated_probablity = np.float64(round(p,8)) print (labels[label_index], truncated_probablity) label_index += 1 print("Results dictionary") print(results_dic) json_message = json.dumps(results_dic) print("Json result") print(json_message) # Initialize a new message message = IoTHubMessage(bytearray(json_message, 'utf8')) hubManager.send_event_to_output("output1", message, 0) messages_sent += 1 print("Message sent! - Total: " + str(messages_sent)) print('----------------------------') # This is the wait time before repeating the analysis # Currently set to 10 seconds time.sleep(10) class HubManager(object): def __init__( self, protocol=IoTHubTransportProvider.MQTT): self.client_protocol = protocol self.client = IoTHubModuleClient() self.client.create_from_environment(protocol) # set the time until a message times out self.client.set_option("messageTimeout", MESSAGE_TIMEOUT) # Forwards the message received onto the next stage in the process. def forward_event_to_output(self, outputQueueName, event, send_context): self.client.send_event_async( outputQueueName, event, send_confirmation_callback, send_context) def send_event_to_output(self, outputQueueName, event, send_context): self.client.send_event_async(outputQueueName, event, send_confirmation_callback, send_context) def main(protocol): try: hub_manager = HubManager(protocol) analyse(hub_manager) while True: time.sleep(1) except IoTHubError as iothub_error: print ( "Unexpected error %s from IoTHub" % iothub_error ) return except KeyboardInterrupt: print ( "IoTHubModuleClient sample stopped" ) if __name__ == '__main__': main(PROTOCOL)
Abra el archivo llamado requirements.txt y sustituya su contenido por lo siguiente:
azure-iothub-device-client==1.4.0.0b3 opencv-python==3.3.1.11 tensorflow==1.8.0 pillow==5.1.0
Abra el archivo llamado deployment.template.json y sustituya su contenido siguiendo las siguientes directrices:
Dado que tendrá su propia estructura JSON única y única, deberá editarla a mano (en lugar de copiar un ejemplo). Para facilitar esta tarea, use la imagen siguiente como guía.
Las áreas que se verán diferentes a las suyas, pero que NO debe cambiar están resaltadas en amarillo.
Las secciones que necesita eliminar son un rojo resaltado.
Tenga cuidado de eliminar los corchetes correctos y también quitar las comas.
El JSON completado debe tener un aspecto similar a la siguiente imagen (sin embargo, con sus diferencias únicas: nombre de usuario, contraseña, nombre de módulo o referencias de módulo):
Abra el archivo denominado Dockerfile.amd64 y sustituya su contenido por lo siguiente:
FROM ubuntu:xenial WORKDIR /app RUN apt-get update && \ apt-get install -y --no-install-recommends libcurl4-openssl-dev python-pip libboost-python-dev && \ rm -rf /var/lib/apt/lists/* RUN pip install --upgrade pip RUN pip install setuptools COPY requirements.txt ./ RUN pip install -r requirements.txt RUN pip install pillow RUN pip install numpy RUN apt-get update && apt-get install -y \ pkg-config \ python-dev \ python-opencv \ libopencv-dev \ libav-tools \ libjpeg-dev \ libpng-dev \ libtiff-dev \ libjasper-dev \ python-numpy \ python-pycurl \ python-opencv RUN pip install opencv-python RUN pip install tensorflow RUN pip install --upgrade tensorflow COPY . . RUN useradd -ms /bin/bash moduleuser USER moduleuser CMD [ "python", "-u", "./main.py" ]
Haga clic con el botón derecho en la carpeta debajo de los módulos (tendrá el nombre que proporcionó anteriormente; en el ejemplo más abajo, se denomina pythonmodule) y haga clic en Nueva carpeta. Asigne un nombre a las imágenes de carpeta.
Dentro de la carpeta , agregue algunas imágenes que contengan el mouse o el teclado. Estas serán las imágenes que analizará el modelo de Tensorflow.
Advertencia
Si usa su propio modelo, deberá cambiarlo para reflejar sus propios datos de modelos.
Ahora deberá recuperar los archivos labels.txt y model.pb de la carpeta del modelo, que descargó anteriormente (o creó a partir de su propio custom Vision Service), en el capítulo 1. Una vez que tenga los archivos, colóquelos dentro de la solución, junto con los demás archivos. El resultado final debe ser similar a la imagen siguiente:
Capítulo 9: Empaquetar la solución como un contenedor
Ya está listo para "empaquetar" los archivos como contenedor e insertarlos en Azure Container Registry. En VS Code, abra el terminal integrado (Ver>terminal integrado o Ctrl`+) y use la siguiente línea para iniciar sesión en Docker (sustituya los valores del comando por las credenciales de Azure Container Registry (ACR)):
docker login -u <ACR username> -p <ACR password> <ACR login server>
Haga clic con el botón derecho en el archivo deployment.template.json y haga clic en Compilar solución de IoT Edge. Este proceso de compilación tarda bastante tiempo (dependiendo del dispositivo), por lo que debe prepararse para esperar. Una vez finalizado el proceso de compilación, se habrá creado un archivo deployment.json dentro de una nueva carpeta denominada config.
Vuelva a abrir la paleta de comandos y busque Azure: Iniciar sesión. Siga las indicaciones con las credenciales de la cuenta de Azure; VS Code le proporcionará una opción para Copiar y abrir, que copiará el código del dispositivo que necesitará pronto y abrirá el explorador web predeterminado. Cuando se le pregunte, pegue el código del dispositivo para autenticar la máquina.
Una vez que haya iniciado sesión, verá, en la parte inferior del panel Explorar , una nueva sección denominada Dispositivos de Azure IoT Hub. Haga clic en esta sección para expandirla.
Si el dispositivo no está aquí, tendrá que hacer clic con el botón derecho en Dispositivos de Azure IoT Hub y, a continuación, hacer clic en Establecer cadena de conexión de IoT Hub. A continuación, verá que la paleta de comandos (en la parte superior de VS Code), le pedirá que escriba la cadena de conexión. Esta es la cadena de conexión que anotó al final del capítulo 3. Presione la tecla Entrar , una vez que haya copiado la cadena en.
El dispositivo debe cargarse y aparecer. Haga clic con el botón derecho en el nombre del dispositivo y, a continuación, haga clic en Crear implementación para un único dispositivo.
Recibirá un mensaje de Explorador de archivos, donde puede ir a la carpeta config y, a continuación, seleccionará el archivo deployment.json. Con ese archivo seleccionado, haga clic en el botón Seleccionar manifiesto de implementación perimetral.
En este momento, ha proporcionado el servicio IoT Hub con el manifiesto para que implemente el contenedor, como módulo, desde Azure Container Registry, y lo implemente de forma eficaz en el dispositivo.
Para ver los mensajes enviados desde el dispositivo a IoT Hub, haga clic con el botón derecho de nuevo en el nombre del dispositivo en la sección Dispositivos de Azure IoT Hub, en el panel Explorador y haga clic en Iniciar el mensaje D2C de supervisión. Los mensajes enviados desde el dispositivo deben aparecer en el terminal de VS. Tenga paciencia, ya que esto puede tardar algún tiempo. Consulte el capítulo siguiente para la depuración y compruebe si la implementación se realizó correctamente.
Este módulo ahora iterará entre las imágenes de la carpeta images y las analizará, con cada iteración. Obviamente, esto es simplemente una demostración de cómo obtener el modelo de aprendizaje automático básico para trabajar en un entorno de dispositivo IoT Edge.
Para expandir la funcionalidad de este ejemplo, puede continuar de varias maneras. Una manera podría incluir código en el contenedor, que captura fotos de una cámara web que está conectada al dispositivo y guarda las imágenes en la carpeta images.
Otra manera podría ser copiar las imágenes desde el dispositivo IoT en el contenedor. Una manera práctica de hacerlo es ejecutar el siguiente comando en el terminal de dispositivo IoT (quizás una pequeña aplicación podría realizar el trabajo, si desea automatizar el proceso). Para probar este comando, ejecutándolo manualmente desde la ubicación de la carpeta donde se almacenan los archivos:
sudo docker cp <filename> <modulename>:/app/images/<a name of your choice>
Capítulo 10: Depuración del entorno de ejecución de IoT Edge
A continuación se muestra una lista de líneas de comandos y sugerencias para ayudarle a supervisar y depurar la actividad de mensajería del entorno de ejecución de IoT Edge desde el dispositivo Ubuntu.
Para comprobar el estado del entorno de ejecución de IoT Edge , ejecute la siguiente línea de comandos:
sudo systemctl status iotedge
Nota:
No olvide presionar Ctrl + C para terminar de ver el estado.
Enumere los contenedores que están implementados actualmente. Si el servicio IoT Hub ha implementado correctamente los contenedores, se mostrarán ejecutando la siguiente línea de comandos:
sudo iotedge list
Or
sudo docker ps
Nota:
Lo anterior es una buena manera de comprobar si el módulo se ha implementado correctamente, ya que aparecerá en la lista; De lo contrario, solo verá edgeHub y edgeAgent.
Para mostrar los registros de código de un contenedor, ejecute la siguiente línea de comandos:
journalctl -u iotedge
Comandos útiles para administrar el entorno de ejecución de IoT Edge:
Para eliminar todos los contenedores del host:
sudo docker rm -f $(sudo docker ps -aq)
Para detener el entorno de ejecución de IoT Edge:
sudo systemctl stop iotedge
Capítulo 11: Creación de Table Service
Vuelva a Azure Portal, donde creará un servicio De tablas de Azure mediante la creación de un recurso de Storage.
Si aún no ha iniciado sesión, inicie sesión en Azure Portal.
Una vez que haya iniciado sesión, haga clic en Crear un recurso, en la esquina superior izquierda y busque Cuenta de almacenamiento y presione la tecla Entrar para iniciar la búsqueda.
Una vez que haya aparecido, haga clic en Cuenta de almacenamiento: blob, archivo, tabla, cola de la lista.
La nueva página proporcionará una descripción del servicio de cuenta de almacenamiento. En la parte inferior izquierda de este símbolo del sistema, haga clic en el botón Crear para crear una instancia de este servicio.
Una vez que haya hecho clic en Crear, aparecerá un panel:
Inserte el nombre deseado para esta instancia de servicio (debe estar en minúsculas).
En Modelo de implementación, haga clic en Resource Manager.
En Tipo de cuenta, con el menú desplegable, haga clic en Almacenamiento (uso general v1) .
Haga clic en una ubicación adecuada.
En el menú desplegable Replicación, haga clic en Almacenamiento con redundancia geográfica con acceso de lectura (RA-GRS).
En Rendimiento, haga clic en Estándar.
En la sección Transferencia segura necesaria , haga clic en Deshabilitado.
En el menú desplegable Suscripción , haga clic en una suscripción adecuada.
Elija un grupo de recursos o cree uno nuevo. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar, la facturación de una colección de recursos de Azure. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).
Si desea obtener más información sobre los grupos de recursos de Azure, siga este vínculo sobre cómo administrar un grupo de recursos.
Deje Redes virtuales como Deshabilitada, si se trata de una opción para usted.
Haga clic en Crear.
Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.
Aparecerá una notificación en el portal una vez creada la instancia de servicio. Haga clic en las notificaciones para explorar la nueva instancia de servicio.
Haga clic en el botón Ir al recurso de la notificación y se le llevará a la nueva página de información general de la instancia del servicio de almacenamiento.
En la página de información general, a la derecha, haga clic en Tablas.
El panel de la derecha cambiará para mostrar la información de Table Service , donde debe agregar una nueva tabla. Para ello, haga clic en el botón + Tabla en la esquina superior izquierda.
Se mostrará una nueva página, donde debe escribir un nombre de tabla. Este es el nombre que usará para hacer referencia a los datos de la aplicación en capítulos posteriores (creación de function App y Power BI). Inserte IoTMessages como el nombre (puede elegir el suyo propio, solo tiene que recordarlo cuando se use más adelante en este documento) y haga clic en Aceptar.
Una vez creada la nueva tabla, podrá verla en la página Table Service (en la parte inferior).
Ahora haga clic en Claves de acceso y realice una copia del nombre y la clave de la cuenta de almacenamiento (con el Bloc de notas), usará estos valores más adelante en este curso al crear la aplicación de funciones de Azure.
Con el panel de la izquierda de nuevo, desplácese hasta la sección Table Service y haga clic en Tablas (o Examinar tablas, en portales más recientes) y realice una copia de la dirección URL de la tabla (con el Bloc de notas). Usará este valor más adelante en este curso, al vincular la tabla a la aplicación de Power BI .
Capítulo 12: Finalización de la tabla de Azure
Ahora que se ha configurado la cuenta de almacenamiento de Table Service , es el momento de agregar datos a ella, que se usarán para almacenar y recuperar información. La edición de las tablas se puede realizar a través de Visual Studio.
Abra Visual Studio (no Visual Studio Code).
En el menú, haga clic en Ver>Cloud Explorer.
Cloud Explorer se abrirá como un elemento acoplado (sea paciente, ya que la carga puede tardar tiempo).
Advertencia
Si la suscripción que usó para crear las cuentas de almacenamiento no está visible, asegúrese de que tiene:
Ha iniciado sesión en la misma cuenta que usó para Azure Portal.
Seleccione la suscripción en la página Administración de cuentas (es posible que tenga que aplicar un filtro desde la configuración de la cuenta):
Se mostrarán los servicios en la nube de Azure. Busque Cuentas de almacenamiento y haga clic en la flecha situada a la izquierda para expandir las cuentas.
Una vez expandido, la cuenta de almacenamiento recién creada debe estar disponible. Haga clic en la flecha situada a la izquierda del almacenamiento y, una vez expandido, busque Tablas y haga clic en la flecha situada junto a ella para mostrar la tabla que creó en el último capítulo. Haga doble clic en la tabla.
La tabla se abrirá en el centro de la ventana de Visual Studio. Haga clic en el icono de tabla con el + (más) en él.
Aparecerá una ventana en la que se le pedirá que agregue entidad. Solo creará una entidad, aunque tendrá tres propiedades. Observará que ya se proporcionan PartitionKey y RowKey, ya que la tabla los usa para encontrar los datos.
Actualice los siguientes valores:
Nombre: PartitionKey, Valor: PK_IoTMessages
Nombre: RowKey, Valor: RK_1_IoTMessages
A continuación, haga clic en Agregar propiedad (en la parte inferior izquierda de la ventana Agregar entidad ) y agregue la siguiente propiedad:
- MessageContent, como una cadena, deje el valor vacío.
La tabla debe coincidir con la de la imagen siguiente:
Nota:
La razón por la que la entidad tiene el número 1 en la clave de fila es porque es posible que desee agregar más mensajes, si desea experimentar más con este curso.
Cuando haya terminado, haga clic en Aceptar. La tabla ya está lista para usarse.
Capítulo 13: Creación de una aplicación de funciones de Azure
Ahora es el momento de crear una aplicación de funciones de Azure, a la que llamará el servicio IoT Hub para almacenar los mensajes del dispositivo IoT Edge en Table Service, que creó en el capítulo anterior.
En primer lugar, debe crear un archivo que permita que la función de Azure cargue las bibliotecas que necesita.
Abra el Bloc de notas (presione la tecla Windows y escriba el Bloc de notas).
Con el Bloc de notas abierto, inserte la estructura JSON siguiente en ella. Una vez hecho esto, guárdelo en el escritorio como project.json. Este archivo define las bibliotecas que usará la función. Si ha usado NuGet, será familiar.
Advertencia
Es importante que la nomenclatura sea correcta; asegúrese de que NO tiene una extensión de archivo .txt . Consulte a continuación para obtener referencia:
{ "frameworks": { "net46":{ "dependencies": { "WindowsAzure.Storage": "9.2.0" } } } }
Inicie sesión en Azure Portal.
Una vez que haya iniciado sesión, haga clic en Crear un recurso en la esquina superior izquierda y busque Function App y presione la tecla Entrar para buscar. Haga clic en Function App en los resultados para abrir un nuevo panel.
El nuevo panel proporcionará una descripción de Function App Service. En la parte inferior izquierda de este panel, haga clic en el botón Crear para crear una asociación con este servicio.
Una vez que haya hecho clic en Crear, rellene lo siguiente:
En Nombre de la aplicación, inserte el nombre deseado para esta instancia de Servicio.
Seleccione una opción en Suscripción.
Seleccione el plan de tarifa adecuado para usted, si es la primera vez que se crea una instancia de Function App Service, debería estar disponible un nivel gratuito.
Elija un grupo de recursos o cree uno nuevo. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar, la facturación de una colección de recursos de Azure. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).
Si desea obtener más información sobre los grupos de recursos de Azure, siga este vínculo sobre cómo administrar un grupo de recursos.
Para el sistema operativo, haga clic en Windows, ya que es la plataforma prevista.
Seleccione un plan de hospedaje (este tutorial usa un plan de consumo).
Seleccione una ubicación (elija la misma ubicación que el almacenamiento que ha creado en el paso anterior).
En la sección Almacenamiento , debe seleccionar el servicio de almacenamiento que creó en el paso anterior.
No necesitará Application Insights en esta aplicación, así que no dude en dejarla desactivada.
Haga clic en Crear.
Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.
Aparecerá una notificación en el portal una vez creada la instancia de servicio.
Haga clic en la notificación una vez que la implementación se haya realizado correctamente (ha finalizado).
Haga clic en el botón Ir al recurso de la notificación para explorar la nueva instancia de servicio.
En el lado izquierdo del nuevo panel, haga clic en el + icono (más) situado junto a Funciones, para crear una nueva función.
En el panel central, aparecerá la ventana Creación de funciones. Desplácese hacia abajo y haga clic en Función personalizada.
Desplácese hacia abajo en la página siguiente hasta que encuentre IoT Hub (Centro de eventos) y haga clic en ella.
En la hoja IoT Hub (Centro de eventos), establezca el lenguaje en C# y, a continuación, haga clic en nuevo.
En la ventana que aparecerá, asegúrese de que IoT Hub está seleccionado y el nombre del campo ioT Hub corresponde al nombre del servicio ioT Hub que ha creado anteriormente (en el paso 8, del capítulo 3). A continuación, haga clic en el botón Seleccionar.
De nuevo en la hoja IoT Hub (Centro de eventos), haga clic en Crear.
Se le redirigirá al editor de funciones.
Elimine todo el código que contiene y reemplácelo por lo siguiente:
#r "Microsoft.WindowsAzure.Storage" #r "NewtonSoft.Json" using System; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Table; using Newtonsoft.Json; using System.Threading.Tasks; public static async Task Run(string myIoTHubMessage, TraceWriter log) { log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}"); //RowKey of the table object to be changed string tableName = "IoTMessages"; string tableURL = "https://iothubmrstorage.table.core.windows.net/IoTMessages"; // If you did not name your Storage Service as suggested in the course, change the name here with the one you chose. string storageAccountName = "iotedgestor"; string storageAccountKey = "<Insert your Storage Key here>"; string partitionKey = "PK_IoTMessages"; string rowKey = "RK_1_IoTMessages"; Microsoft.WindowsAzure.Storage.Auth.StorageCredentials storageCredentials = new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(storageAccountName, storageAccountKey); CloudStorageAccount storageAccount = new CloudStorageAccount(storageCredentials, true); // Create the table client. CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); // Get a reference to a table named "IoTMessages" CloudTable messageTable = tableClient.GetTableReference(tableName); //Retrieve the table object by its RowKey TableOperation operation = TableOperation.Retrieve<MessageEntity>(partitionKey, rowKey); TableResult result = await messageTable.ExecuteAsync(operation); //Create a MessageEntity so to set its parameters MessageEntity messageEntity = (MessageEntity)result.Result; messageEntity.MessageContent = myIoTHubMessage; messageEntity.PartitionKey = partitionKey; messageEntity.RowKey = rowKey; //Replace the table appropriate table Entity with the value of the MessageEntity Ccass structure. operation = TableOperation.Replace(messageEntity); // Execute the insert operation. await messageTable.ExecuteAsync(operation); } // This MessageEntity structure which will represent a Table Entity public class MessageEntity : TableEntity { public string Type { get; set; } public string MessageContent { get; set; } }
Cambie las siguientes variables para que se correspondan con los valores adecuados (valores de tabla y almacenamiento, del paso 11 y 13, respectivamente, del capítulo 11), que encontrará en la cuenta de almacenamiento:
- tableName, con el nombre de la tabla ubicada en la cuenta de almacenamiento.
- tableURL, con la dirección URL de la tabla ubicada en la cuenta de almacenamiento.
- storageAccountName, con el nombre del valor correspondiente al nombre de la cuenta de almacenamiento.
- storageAccountKey, con la clave que ha obtenido en el servicio de almacenamiento que ha creado anteriormente.
Con el código en contexto, haga clic en Guardar.
A continuación, haga clic en el < icono (flecha), en el lado derecho de la página.
Un panel se deslizará desde la derecha. En ese panel, haga clic en Cargar y aparecerá un explorador de archivos.
Vaya a y haga clic en el archivo project.json , que creó anteriormente en el Bloc de notas y, a continuación, haga clic en el botón Abrir . Este archivo define las bibliotecas que usará la función.
Cuando el archivo se haya cargado, aparecerá en el panel de la derecha. Al hacer clic en él, se abrirá en el editor de funciones. Debe tener exactamente el mismo aspecto que la siguiente imagen.
En este momento, sería bueno probar la funcionalidad de la función para almacenar el mensaje en la tabla. En la parte superior derecha de la ventana, haga clic en Probar.
Inserte un mensaje en el cuerpo de la solicitud, como se muestra en la imagen anterior, y haga clic en Ejecutar.
La función se ejecutará, mostrando el estado del resultado (observará el estado verde 202 Aceptado, encima de la ventana Salida , lo que significa que se ha realizado una llamada correcta):
Capítulo 14: Visualización de mensajes activos
Si ahora abre Visual Studio (no Visual Studio Code), puede visualizar el resultado del mensaje de prueba, ya que se almacenará en el área de cadena MessageContent .
Con Table Service y Function App en su lugar, los mensajes del dispositivo Ubuntu aparecerán en la tabla IoTMessages . Si aún no se está ejecutando, vuelva a iniciar el dispositivo y podrá ver los mensajes de resultado del dispositivo y el módulo, dentro de la tabla, mediante Visual Studio Cloud Explorer.
Capítulo 15: Configuración de Power BI
Para visualizar los datos del dispositivo IOT, configurará Power BI (versión de escritorio) para recopilar los datos de Table Service, que acaba de crear. La versión de HoloLens de Power BI usará esos datos para visualizar el resultado.
Abra el Microsoft Store en Windows 10 y busque Power BI Desktop.
Descargue la aplicación. Una vez que haya terminado de descargarse, ábralo.
Inicie sesión en Power BI con su cuenta de Microsoft 365. Es posible que se le redirija a un explorador para registrarse. Una vez que se haya registrado, vuelva a la aplicación de Power BI e inicie sesión de nuevo.
Haga clic en Obtener datos y, a continuación, haga clic en Más....
Haga clic en Azure, Azure Table Storage y, a continuación, haga clic en Conectar.
Se le pedirá que inserte la dirección URL de tabla que recopiló anteriormente (en el paso 13 del capítulo 11), al crear table Service. Después de insertar la dirección URL, elimine la parte de la ruta de acceso que hace referencia a la tabla "subcarpeta" (que era IoTMessages, en este curso). El resultado final debe ser como se muestra en la imagen siguiente. Después, haga clic en Aceptar.
Se le pedirá que inserte la clave de almacenamiento que anotó (en el paso 11 del capítulo 11) anteriormente al crear table Storage. A continuación, haga clic en Conectar.
Se mostrará un panel navegador, marque la casilla situada junto a la tabla y haga clic en Cargar.
La tabla se ha cargado ahora en Power BI, pero requiere una consulta para mostrar los valores en ella. Para ello, haga clic con el botón derecho en el nombre de la tabla ubicado en el panel CAMPOS situado en el lado derecho de la pantalla. A continuación, haga clic en Editar consulta.
Se abrirá un Editor de Power Query como una nueva ventana, mostrando la tabla. Haga clic en la palabra Registrar dentro de la columna Contenido de la tabla para visualizar el contenido almacenado.
Haga clic en Into Table (En tabla), en la parte superior izquierda de la ventana.
Haga clic en Cerrar y aplicar.
Una vez que haya terminado de cargar la consulta, en el panel CAMPOS, en el lado derecho de la pantalla, marque las casillas correspondientes a los parámetros Nombre y Valor, para visualizar el contenido de la columna MessageContent .
Haga clic en el icono de disco azul situado en la parte superior izquierda de la ventana para guardar el trabajo en una carpeta de su elección.
Ahora puede hacer clic en el botón Publicar para cargar la tabla en el área de trabajo. Cuando se le solicite, haga clic en Mi área de trabajo y haga clic en Seleccionar. Espere a que muestre el resultado correcto del envío.
Advertencia
El capítulo siguiente es específico de HoloLens. Power BI no está disponible actualmente como una aplicación inmersiva, pero puede ejecutar la versión de escritorio en el Portal de Windows Mixed Reality (también conocido como Cliff House), a través de la aplicación Escritorio.
Capítulo 16: Visualización de datos de Power BI en HoloLens
En holoLens, inicie sesión en Microsoft Store pulsando su icono en la lista de aplicaciones.
Busque y descargue la aplicación Power BI .
Inicie Power BI desde la lista de aplicaciones.
Power BI puede pedirle que inicie sesión en su cuenta de Microsoft 365.
Una vez dentro de la aplicación, el área de trabajo debe mostrarse de forma predeterminada como se muestra en la imagen siguiente. Si esto no sucede, simplemente haga clic en el icono del área de trabajo en el lado izquierdo de la ventana.
La aplicación de IoT Hub finalizó
Enhorabuena, ha creado correctamente un servicio IoT Hub con un dispositivo Virtual Machine Edge simulado. El dispositivo puede comunicar los resultados de un modelo de aprendizaje automático a Azure Table Service, facilitado por una aplicación de funciones de Azure, que se lee en Power BI y se visualiza dentro de Microsoft HoloLens.
Ejercicios extra
Ejercicio 1
Expanda la estructura de mensajería almacenada en la tabla y mostráela como gráfico. Es posible que quiera recopilar más datos y almacenarlos en la misma tabla para que se muestren más adelante.
Ejercicio 2
Cree un módulo adicional de "captura de cámara" que se va a implementar en la placa de IoT, de modo que pueda capturar imágenes a través de la cámara que se va a analizar.