Compartir a través de


HoloLens (1.ª generación) y Azure 313: Servicio IoT Hub

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.

resultado del curso

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

  1. Configure y pruebe holoLens. Si necesita compatibilidad con la configuración de HoloLens, asegúrese de visitar el artículo configuración de HoloLens.
  2. 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.

  1. Configure la máquina virtual Ubuntu mediante Hyper-V. Los siguientes recursos le ayudarán con el proceso.

    1. 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.
    2. 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.
    3. 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:

  1. 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.

    pestaña rendimiento

  2. Seleccione la iteración que desea exportar y haga clic en Exportar. Aparecerá una hoja.

    hoja de exportación

  3. En la hoja, haga clic en Archivo de Docker.

    selección de Docker

  4. Haga clic en Linux en el menú desplegable y, a continuación, haga clic en Descargar.

    Haga clic en Descargar.

  5. 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.

  1. En primer lugar, siga este vínculo a Azure Portal e inicie sesión con sus credenciales.

  2. Vaya a Crear un recurso y busque Container Registry.

    Container Registry

  3. Haga clic en Crear.

    Captura de pantalla que muestra dónde seleccionar Crear.

  4. Establezca los parámetros de configuración del servicio:

    1. Inserte un nombre para el proyecto, en este ejemplo se denomina IoTCRegistry.

    2. 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).

    3. Establezca la ubicación del servicio.

    4. Establezca Usuario administrador en Habilitar.

    5. Establezca SKU en Básico.

    Captura de pantalla que muestra dónde se establece la SKU en Básico.

  5. Haga clic en Crear y espere a que se creen los servicios.

  6. 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.

    Captura de pantalla que muestra dónde seleccionar Ir al recurso.

  7. En la página Container Registry Service , haga clic en Claves de acceso.

  8. Tome nota (puede usar el Bloc de notas) de los parámetros siguientes:

    1. Servidor de inicio de sesión
    2. Nombre de usuario
    3. Contraseña

    Captura de pantalla que muestra dónde ver los parámetros Servidor de inicio de sesión, Nombre de usuario y Contraseña.

Capítulo 3: El servicio IoT Hub

Ahora comenzará la creación y configuración del servicio IoT Hub.

  1. Si aún no ha iniciado sesión, inicie sesión en Azure Portal.

  2. 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.

Captura de pantalla que muestra la ventana Todo abierta. I O T Hub en los resultados de búsqueda y Crear un recurso en la esquina superior izquierda están círculos en rojo.

  1. 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.

    Captura de pantalla que muestra la página De información general de I O T Hub.

  2. Una vez que haya hecho clic en Crear, aparecerá un panel:

    1. 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.

    2. Seleccione una ubicación adecuada (use la misma ubicación en todos los servicios que cree en este curso).

    3. Inserte el nombre deseado para esta instancia de servicio.

  3. En la parte inferior de la página, haga clic en Siguiente: Tamaño y escala.

    Captura de pantalla que muestra la página Conceptos básicos del centro de E/S. El siguiente tamaño y escala se rodea en rojo en la parte inferior de la página.

  4. 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).

  5. Haga clic en Revisar y crear.

    Captura de pantalla que muestra la página Tamaño y escala del centro de E/S. El nivel F 1 Gratis está seleccionado en el campo Plan de tarifa y escalado. Revisar y crear se rodea en rojo en la parte inferior de la página.

  6. Revise la configuración y haga clic en Crear.

    Captura de pantalla que muestra la página Revisión y creación del centro de E/S. La creación se rodea en rojo en la parte inferior de la página.

  7. 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.

    Captura de pantalla que muestra una notificación implementación correcta. El botón Ir al recurso está en círculo rojo.

  8. Desplácese por el panel lateral de la izquierda hasta que vea Automático Administración de dispositivos, haga clic en IoT Edge.

    Captura de pantalla que muestra I O T Edge seleccionado en el menú en Automático Administración de dispositivos.

  9. En la ventana que aparece a la derecha, haga clic en Agregar dispositivo IoT Edge. Aparecerá una hoja a la derecha.

  10. 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.

    Captura de pantalla que muestra la página Agregar dispositivo. El dispositivo perimetral 0 1 se escribe en el campo Id. de dispositivo. La casilla Generar claves automáticamente está activada.

  11. 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).

    Captura de pantalla que muestra la página I O T Edge Devices (Dispositivos perimetrales de E/S). La casilla está activada junto a Dispositivo perimetral en la parte inferior de la página.

  12. En la página Detalles del dispositivo que aparece, realice una copia de la cadena de conexión (clave principal).

    Captura de pantalla que muestra la página Detalles del dispositivo. La clave principal de la cadena de conexión está en círculo rojo.

  13. Vuelva al panel de la izquierda y haga clic en Directivas de acceso compartido para abrirlo.

  14. En la página que aparece, haga clic en iothubowner y aparecerá una hoja a la derecha de la pantalla.

  15. 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.

    Captura de pantalla que muestra la página Directivas de acceso compartido, que se encuentra en Configuración. El propietario del centro de E/S está seleccionado en Directiva. En la ventana emergente, el cadena de conexión campo de clave principal se rodea en rojo.

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:

  1. Docker para Windows, le pedirá que cree una cuenta para poder descargarla.

    descarga de Docker para Windows

    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.

  2. Python 3.6.

    descargar python 3.6

  3. Visual Studio Code (también conocido como VS Code).

    descargar VS Code

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>
  1. 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
    
  2. 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.

  3. Una vez completado el comando, use el siguiente comando para instalar curl:

        sudo apt install curl
    
  4. 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
    
  5. 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
    
  6. 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 .

    1. 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Í>".<

    2. Sustituya la línea, incluidos los corchetes, con la cadena de conexión del dispositivo que anotó anteriormente.

  7. 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.

  8. 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.

  9. 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.

  10. 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
    
  11. 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
    
  12. 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.

  1. Abra VS Code.

  2. Haga clic en el botón Extensiones (cuadrado) de la barra izquierda de VS Code para abrir el panel Extensiones.

  3. Busque e instale las siguientes extensiones (como se muestra en la imagen siguiente):

    1. Azure IoT Edge
    2. Azure IoT Toolkit
    3. Docker

    Captura de pantalla que muestra la ventana de extensiones. Azure I O T Edge, Azure I O T Toolkit y Docker están en rojo.

  4. Una vez instaladas las extensiones, cierre y vuelva a abrir VS Code.

  5. Con VS Code abierto una vez más, vaya a Ver>terminal integrado.

  6. Ahora instalará Cookiecutter. En el terminal, ejecute el siguiente comando de Bash:

        pip install --upgrade --user cookiecutter
    

    [! HINT] Si tiene problemas con este comando:

    1. Reinicie VS Code o el equipo.
    2. 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. Captura de pantalla que muestra 1 powershell seleccionado en el menú desplegable.
    3. 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.
  7. 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.

  1. En VS Code, haga clic en Ver>paleta de comandos.

  2. En la paleta, busque y ejecute Azure IoT Edge: Nueva solución de IoT Edge.

  3. Vaya a una ubicación en la que quiera crear la solución. Presione la tecla Entrar para aceptar la ubicación.

  4. Asigne un nombre a la solución. Presione la tecla Entrar para confirmar el nombre proporcionado.

  5. 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.

  6. 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.

  7. 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-.

  8. 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.

  9. 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.

    Captura de pantalla que muestra el botón Explorar pestaña, que se parece a 2 fragmentos de papel apilados.

  10. 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.

    Captura de pantalla que muestra una ventana de comandos con el texto Nombre de usuario de Container Registry escrito en la línea 1 y contraseña del Registro de contenedor escrito en la línea 2.

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.

  1. Con VS Code abierto, vaya a la carpeta del módulo y busque el script denominado main.py. Haga doble clic para abrirlo.

  2. 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)
    
  3. 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
    
  4. Abra el archivo llamado deployment.template.json y sustituya su contenido siguiendo las siguientes directrices:

    1. 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.

    2. Las áreas que se verán diferentes a las suyas, pero que NO debe cambiar están resaltadas en amarillo.

    3. Las secciones que necesita eliminar son un rojo resaltado.

    4. Tenga cuidado de eliminar los corchetes correctos y también quitar las comas.

      Captura de pantalla que muestra las líneas de código de 12 a 15, 49 a 57 y la línea 67 en círculo en amarillo. Las líneas de código de 39 a 48 y la línea 66 están círculos en rojo.

    5. 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):

      Captura de pantalla que muestra la ventana de comandos con las líneas rojas en círculo eliminadas.

  5. 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" ]
    
    
  6. 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.

  7. 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.

  8. 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:

    Captura de pantalla que muestra la ventana Explorador. La carpeta del módulo de Python está abierta.

Capítulo 9: Empaquetar la solución como un contenedor

  1. 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>
    
  2. 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.

    Captura de pantalla que muestra la carpeta de configuración y el archivo dot de implementación jason en círculo en rojo.

  3. 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.

    copiar y abrir

  4. 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.

    dispositivo perimetral

  5. 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.

  6. 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.

    Captura de pantalla que muestra el menú contextual. La opción Crear implementación para un solo dispositivo está resaltada.

  7. 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.

    Captura de pantalla que muestra la ventana Explorador de archivos. El archivo dot jason de implementación está seleccionado y Select Edge Deployment Manifest (Seleccionar manifiesto de implementación perimetral) se encuentra en rojo.

  8. 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.

  9. 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.

  1. Si aún no ha iniciado sesión, inicie sesión en Azure Portal.

  2. 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.

  3. Una vez que haya aparecido, haga clic en Cuenta de almacenamiento: blob, archivo, tabla, cola de la lista.

    Captura de pantalla que muestra la ventana Nuevo. El almacenamiento se escribe en la barra de búsqueda. En Destacados, el blob de la cuenta de almacenamiento, el archivo, la tabla, la cola se encuentra en rojo.

  4. 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.

    Captura de pantalla que muestra la página Cuenta de almacenamiento. El botón Crear situado en la parte inferior de la página se rodea en rojo.

  5. Una vez que haya hecho clic en Crear, aparecerá un panel:

    1. Inserte el nombre deseado para esta instancia de servicio (debe estar en minúsculas).

    2. En Modelo de implementación, haga clic en Resource Manager.

    3. En Tipo de cuenta, con el menú desplegable, haga clic en Almacenamiento (uso general v1) .

    4. Haga clic en una ubicación adecuada.

    5. En el menú desplegable Replicación, haga clic en Almacenamiento con redundancia geográfica con acceso de lectura (RA-GRS).

    6. En Rendimiento, haga clic en Estándar.

    7. En la sección Transferencia segura necesaria , haga clic en Deshabilitado.

    8. En el menú desplegable Suscripción , haga clic en una suscripción adecuada.

    9. 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.

    10. Deje Redes virtuales como Deshabilitada, si se trata de una opción para usted.

    11. Haga clic en Crear.

      rellenar los detalles del almacenamiento

  6. Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.

  7. 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.

    nueva notificación de almacenamiento

  8. 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.

    Captura de pantalla que muestra la notificación Implementación correcta. El botón Ir al recurso está en círculo rojo.

  9. En la página de información general, a la derecha, haga clic en Tablas.

    Tablas

  10. 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.

    abrir tablas

  11. 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.

  12. Una vez creada la nueva tabla, podrá verla en la página Table Service (en la parte inferior).

    Captura de pantalla que muestra la página Table Service con una tabla enumerada.

  13. 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.

    Captura de pantalla que muestra la página Claves de acceso, que se encuentra en Configuración. El campo Nombre de la cuenta de almacenamiento y el campo Clave están círculos en rojo.

  14. 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 .

    Captura de pantalla que muestra la página Tablas, ubicada en Table Service. La U R L para la tabla de mensajes de I O T se rodea en rojo.

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.

  1. Abra Visual Studio (no Visual Studio Code).

  2. En el menú, haga clic en Ver>Cloud Explorer.

    abrir Cloud Explorer

  3. 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):

      buscar suscripción

  4. 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.

    abrir cuentas de almacenamiento

  5. 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.

  6. 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.

    agregar nueva tabla

  7. 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.

    partición y clave de fila

  8. Actualice los siguientes valores:

    • Nombre: PartitionKey, Valor: PK_IoTMessages

    • Nombre: RowKey, Valor: RK_1_IoTMessages

  9. 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.
  10. La tabla debe coincidir con la de la imagen siguiente:

    agregar valores correctos

    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.

  11. 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.

  1. Abra el Bloc de notas (presione la tecla Windows y escriba el Bloc de notas).

    abrir el Bloc de notas

  2. 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:

    Guardar JSON

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "9.2.0"
        }
        }
    }
    }
    
  3. Inicie sesión en Azure Portal.

  4. 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.

    búsqueda de la aplicación de funciones

  5. 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.

    instancia de function app

  6. Una vez que haya hecho clic en Crear, rellene lo siguiente:

    1. En Nombre de la aplicación, inserte el nombre deseado para esta instancia de Servicio.

    2. Seleccione una opción en Suscripción.

    3. 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.

    4. 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.

    5. Para el sistema operativo, haga clic en Windows, ya que es la plataforma prevista.

    6. Seleccione un plan de hospedaje (este tutorial usa un plan de consumo).

    7. Seleccione una ubicación (elija la misma ubicación que el almacenamiento que ha creado en el paso anterior).

    8. En la sección Almacenamiento , debe seleccionar el servicio de almacenamiento que creó en el paso anterior.

    9. No necesitará Application Insights en esta aplicación, así que no dude en dejarla desactivada.

    10. Haga clic en Crear.

      creación de una nueva instancia

  7. Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.

  8. Aparecerá una notificación en el portal una vez creada la instancia de servicio.

    nueva notificación

  9. Haga clic en la notificación una vez que la implementación se haya realizado correctamente (ha finalizado).

  10. Haga clic en el botón Ir al recurso de la notificación para explorar la nueva instancia de servicio.

    Captura de pantalla que muestra la ventana de notificación Implementación correcta. El botón Ir al recurso está en círculo rojo.

  11. En el lado izquierdo del nuevo panel, haga clic en el + icono (más) situado junto a Funciones, para crear una nueva función.

    Captura de pantalla que muestra la página Aplicaciones de funciones. En el menú de la izquierda junto a Funciones, el signo más se rodea en rojo.

  12. En el panel central, aparecerá la ventana Creación de funciones. Desplácese hacia abajo y haga clic en Función personalizada.

    Captura de pantalla que muestra la parte inferior de la ventana Creación de funciones. La función personalizada se rodea en rojo.

  13. Desplácese hacia abajo en la página siguiente hasta que encuentre IoT Hub (Centro de eventos) y haga clic en ella.

    Captura de pantalla que muestra el cuadro centro de eventos de I O T Hub en círculo rojo.

  14. En la hoja IoT Hub (Centro de eventos), establezca el lenguaje en C# y, a continuación, haga clic en nuevo.

    Captura de pantalla que muestra la página Nueva función. C sharp está seleccionado en el campo Idioma. El nuevo se encuentra en rojo junto a la opción de conexión del centro de eventos.

  15. 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.

    Captura de pantalla que muestra la pestaña Centro de E/S abierta. Los campos centro de E/S y Punto de conexión se encuentran en rojo.

  16. De nuevo en la hoja IoT Hub (Centro de eventos), haga clic en Crear.

    Captura de pantalla que muestra la página Nueva función. El botón Crear se rodea en rojo en la parte inferior de la página.

  17. Se le redirigirá al editor de funciones.

    Captura de pantalla que muestra la página del editor de funciones. La función está seleccionada en el menú de la izquierda.

  18. 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; }   
    }
    
  19. 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.

    Captura de pantalla que muestra el símbolo del sistema. Las líneas 15, 16, 19 y 21 están círculos en rojo.

  20. Con el código en contexto, haga clic en Guardar.

  21. A continuación, haga clic en el < icono (flecha), en el lado derecho de la página.

    Captura de pantalla que muestra la página Aplicaciones de funciones.

  22. Un panel se deslizará desde la derecha. En ese panel, haga clic en Cargar y aparecerá un explorador de archivos.

  23. 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.

    Captura de pantalla que muestra el botón cargar en círculo en rojo en Ver archivos. En el Explorador de archivos, se selecciona el punto de proyecto jason.

  24. 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.

    Captura de pantalla que muestra la página Aplicaciones de funciones. La integración en el menú izquierdo se rodea en rojo.

  25. 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.

    Captura de pantalla que muestra la página Aplicaciones de funciones. La prueba se realiza en la parte superior derecha y el botón Ejecutar de la esquina inferior izquierda están círculos en rojo.

  26. Inserte un mensaje en el cuerpo de la solicitud, como se muestra en la imagen anterior, y haga clic en Ejecutar.

  27. 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):

    resultado de salida

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 .

Captura de pantalla que muestra la pestaña Tabla de mensajes de E/S abierta en Microsoft Visual Studio.

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.

visualizar datos

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.

  1. Abra el Microsoft Store en Windows 10 y busque Power BI Desktop.

    Captura de pantalla que muestra la ventana de Microsoft Store. Power B I se introduce en la barra de búsqueda y Power B I Desktop está en rojo.

  2. Descargue la aplicación. Una vez que haya terminado de descargarse, ábralo.

  3. 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.

  4. Haga clic en Obtener datos y, a continuación, haga clic en Más....

    Captura de pantalla que muestra Power BI Desktop. Más se rodea en rojo en el menú desplegable Obtener datos.

  5. Haga clic en Azure, Azure Table Storage y, a continuación, haga clic en Conectar.

    Captura de pantalla que muestra la ventana Obtener datos. Azure Table Storage está seleccionado en la opción de menú de Azure. El botón Conectar de la esquina inferior derecha se rodea en rojo.

  6. 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.

    Captura de pantalla que muestra el cuadro de diálogo Azure Table Storage. Se escribe una U R L en el campo Nombre de cuenta o U R L.

  7. 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.

    Captura de pantalla que muestra la página clave de la cuenta de Azure Table Storage.

  8. Se mostrará un panel navegador, marque la casilla situada junto a la tabla y haga clic en Cargar.

    Captura de pantalla que muestra el panel Navegador. Se activa la casilla situada junto al archivo de mensaje de E/S.

  9. 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.

    Captura de pantalla que muestra el panel Campos. La consulta de edición se encuentra en círculo rojo en el menú de mensajes de I O T.

  10. 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.

    Captura de pantalla que muestra la ventana Editor de Power Query. En Contenido, el registro se encuentra en rojo.

  11. Haga clic en Into Table (En tabla), en la parte superior izquierda de la ventana.

    Captura de pantalla que muestra la pestaña Convertir en el Editor de Power Query. En la esquina superior izquierda, Into Table está círculo en rojo.

  12. Haga clic en Cerrar y aplicar.

    Captura de pantalla que muestra la pestaña inicio en el Editor de Power Query. Cerrar y Aplicar está círculo en rojo.

  13. 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 .

    Captura de pantalla que muestra el panel Campos. En Mensajes de E/S, se comprueba el nombre y el valor. Una ventana emergente con columnas Nombre y Valor se rodea en rojo.

  14. 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.

    Captura de pantalla que muestra Power BI Desktop. El disco azul de la esquina superior izquierda está círculo en rojo. El cuadro de diálogo Guardar como está abierto y el botón Guardar está círculo en rojo.

  15. 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.

    Captura de pantalla que muestra Publicar en círculo rojo. En el cuadro de diálogo Publicar en Power BI, mi área de trabajo está seleccionada en Seleccionar un destino.

    Captura de pantalla que muestra una notificación que indica que la publicación en Power BI se realizó correctamente.

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

  1. En holoLens, inicie sesión en Microsoft Store pulsando su icono en la lista de aplicaciones.

    Pantalla de Holo Lens que muestra un rojo en círculo alrededor del icono de Microsoft Store en una ventana de navegación.

  2. Busque y descargue la aplicación Power BI .

    Pantalla de Holo Lens que muestra la página de Microsoft Store. La herramienta de desplazamiento está seleccionada y se introduce power B en la barra de búsqueda.

  3. Inicie Power BI desde la lista de aplicaciones.

  4. Power BI puede pedirle que inicie sesión en su cuenta de Microsoft 365.

  5. 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.

    Pantalla de Holo Lens que muestra la página Microsoft Power BI. La herramienta de arrastre está seleccionada en la parte superior. El icono del área de trabajo, que se parece a una figura, se rodea en rojo. La tabla I O T Edge debajo de Informes está en círculo rojo.

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.

Pantalla de Holo Lens que muestra la página Microsoft Power BI.

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.