Realidad mixta y Azure (313): Servicio IoT HubMR and Azure 313: IoT Hub Service

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.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Por lo tanto, creemos que es importante conservar estos tutoriales para los desarrolladores que sigan buscando instrucciones sobre el desarrollo para esos dispositivos.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Estos tutoriales no se actualizarán con los conjuntos de herramientas o las interacciones más recientes que se usan para HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Se mantendrán para que sigan funcionando en los dispositivos compatibles.They will be maintained to continue working on the supported devices. Habrá una nueva serie de tutoriales que se publicarán en el futuro que mostrarán cómo desarrollar para HoloLens 2.There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. Este aviso se actualizará con un vínculo a esos tutoriales cuando se publiquen.This notice will be updated with a link to those tutorials when they are posted.

resultado del curso

En este curso, aprenderá a implementar un servicio de Azure IOT Hub en una máquina virtual que ejecuta el sistema operativo Ubuntu 16,4.In this course, you will learn how to implement an Azure IoT Hub Service on a virtual machine running the Ubuntu 16.4 operating system. A continuación, se usará una function App de Azure para recibir mensajes de la máquina virtual de Ubuntu y almacenar el resultado en un servicio tabla de Azure.An Azure Function App will then be used to receive messages from your Ubuntu VM, and store the result within an Azure Table Service. A continuación, podrá ver estos datos con Power BI en el casco de Microsoft HoloLens o envolvente (VR).You will then be able to view this data using Power BI on Microsoft HoloLens or immersive (VR) headset.

El contenido de este curso es aplicable a los dispositivos IOT Edge, aunque para este curso, el foco estará en un entorno de máquina virtual, de modo que el acceso a un dispositivo perimetral físico no sea necesario.The content of this course is applicable to IoT Edge devices, though for the purpose of this course, the focus will be on a virtual machine environment, so that access to a physical Edge device is not necessary.

Al completar este curso, aprenderá a:By completing this course, you will learn to:

  • Implemente un módulo de IOT Edge en una máquina virtual (sistema operativo Ubuntu 16), que representará el dispositivo de IOT.Deploy an IoT Edge module to a Virtual Machine (Ubuntu 16 OS), which will represent your IoT device.
  • Agregue un modelo Tensorflow de Azure Custom Vision al módulo Edge, con código que analizará las imágenes almacenadas en el contenedor.Add an Azure Custom Vision Tensorflow Model to the Edge module, with code that will analyze images stored in the container.
  • Configure el módulo para enviar el mensaje de resultado del análisis de vuelta a su servicio de IOT Hub.Set up the module to send the analysis result message back to your IoT Hub Service.
  • Use una function App de Azure para almacenar el mensaje en una tabla de Azure.Use an Azure Function App to store the message within an Azure Table.
  • Configure Power BI para recopilar el mensaje almacenado y crear un informe.Set up Power BI to collect the stored message and create a report.
  • Visualice los datos de los mensajes de IoT en Power BI.Visualize your IoT message data within Power BI.

Los servicios que usará incluyen:The Services you will use include:

  • Azure IOT Hub es un servicio de Microsoft Azure que permite a los desarrolladores conectarse, supervisar y administrar recursos de IOT.Azure IoT Hub is a Microsoft Azure Service which allows developers to connect, monitor, and manage, IoT assets. Para obtener más información, visite la página servicio de Azure IOT Hub.For more information, visit the Azure IoT Hub Service page.

  • Azure Container Registry es un servicio de Microsoft Azure que permite a los desarrolladores almacenar imágenes de contenedor para varios tipos de contenedores.Azure Container Registry is a Microsoft Azure Service which allows developers to store container images, for various types of containers. Para obtener más información, visite la página servicio de Azure Container Registry.For more information, visit the Azure Container Registry Service page.

  • Azure function App es un servicio Microsoft Azure, que permite a los desarrolladores ejecutar pequeños fragmentos de código, "funciones", en Azure.Azure Function App is a Microsoft Azure Service, which allows developers to run small pieces of code, 'functions', in Azure. Esto proporciona una manera de delegar el trabajo en la nube, en lugar de la aplicación local, que puede tener muchas ventajas.This provides a way to delegate work to the cloud, rather than your local application, which can have many benefits. Azure Functions admite varios lenguajes de desarrollo, incluidos C # , F # , Node.js, Java y php.Azure Functions supports several development languages, including C#, F#, Node.js, Java, and PHP. Para obtener más información, visite la página Azure Functions.For more information, visit the Azure Functions page.

  • Azure Storage: tables es un servicio de Microsoft Azure, que permite a los desarrolladores almacenar datos estructurados que no son de SQL en la nube, lo que hace que sea fácilmente accesible en cualquier lugar.Azure Storage: Tables is a Microsoft Azure Service, which allows developers to store structured, non-SQL, data in the cloud, making it easily accessible anywhere. El servicio ofrece un diseño sin esquemas, lo que permite la evolución de las tablas según sea necesario y, por tanto, es muy flexible.The Service boasts a schema-less design, allowing for the evolution of tables as needed, and thus is very flexible. Para obtener más información, visite la página tablas de Azure .For more information, visit the Azure Tables page

Este curso le enseñará cómo configurar y usar el servicio de IoT Hub y, a continuación, visualizar una respuesta proporcionada por un dispositivo.This course will teach you how to setup and use the IoT Hub Service, and then visualize a response provided by a device. Dependerá de que aplique estos conceptos a una configuración personalizada del servicio de IoT Hub, que podría estar compilando.It will be up to you to apply these concepts to a custom IoT Hub Service setup, which you might be building.

Compatibilidad con dispositivosDevice support

CursoCourse HoloLensHoloLens Cascos envolventesImmersive headsets
Realidad mixta y Azure (313): Servicio IoT HubMR and Azure 313: IoT Hub Service ✔️✔️ ✔️✔️

Requisitos previosPrerequisites

Para obtener los requisitos previos más actualizados para el desarrollo con la realidad mixta, incluido con Microsoft HoloLens, visite el artículo instalar las herramientas .For the most up-to-date prerequisites for developing with mixed reality, including with the Microsoft HoloLens, visit the Install the tools article.

Nota

Este tutorial está diseñado para desarrolladores que tienen experiencia básica con Python.This tutorial is designed for developers who have basic experience with Python. Tenga en cuenta también que los requisitos previos y las instrucciones escritas dentro de este documento representan lo que se ha probado y comprobado en el momento de la escritura (2018 de julio).Please also be aware that the prerequisites and written instructions within this document represent what has been tested and verified at the time of writing (July 2018). Puede usar el software más reciente, como se indica en el artículo instalar las herramientas , aunque no se debe suponer que la información de este curso se ajusta perfectamente a lo que encontrará en el software más reciente que el que se indica a continuación.You are free to use the latest software, as listed within the install the tools article, though it should not be assumed that the information in this course will perfectly match what you will find in newer software than that listed below.

Se requiere el siguiente hardware y software:The following hardware and software is required:

Antes de comenzarBefore you start

  1. Configure y pruebe su HoloLens.Set up and test your HoloLens. Si necesita ayuda para configurar HoloLens, asegúrese de visitar el artículo de configuración de hololens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  2. Es una buena idea realizar la calibración y el ajuste del sensor al empezar a desarrollar una nueva aplicación de HoloLens (a veces puede ayudar a realizar esas tareas para cada usuario).It is a good idea to perform Calibration and Sensor Tuning when beginning developing a new HoloLens app (sometimes it can help to perform those tasks for each user).

Para obtener ayuda sobre la calibración, siga este vínculo al artículo sobre la calibración de HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Para obtener ayuda sobre la optimización de sensores, siga este vínculo al artículo sobre la optimización del sensor de HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

  1. Configure la máquina virtual de Ubuntu con Hyper-V.Set up your Ubuntu Virtual Machine using Hyper-V. Los siguientes recursos le ayudarán en el proceso.The following resources will help you with the process.

    1. En primer lugar, siga este vínculo para descargar el ISO de Ubuntu 16.04.4 lts (Xenial Xerus).First, follow this link to download the Ubuntu 16.04.4 LTS (Xenial Xerus) ISO. Seleccione la imagen de escritorio de PC de 64 bits (amd64).Select the 64-bit PC (AMD64) desktop image.
    2. Asegúrese de que Hyper-V está habilitado en el equipo con Windows 10.Make sure Hyper-V is enabled on your Windows 10 machine. Puede seguir este vínculo para obtener instrucciones sobre la instalación y habilitación de Hyper-V en Windows 10.You can follow this link for guidance on installing and enabling Hyper-V on Windows 10.
    3. Inicie Hyper-V y cree una nueva máquina virtual de Ubuntu.Start Hyper-V and create a new Ubuntu VM. Puede seguir este vínculo para obtener una Guía paso a paso sobre cómo crear una máquina virtual con Hyper-V.You can follow this link for a step by step guide on how to create a VM with Hyper-V. Cuando se le solicite "instalar un sistema operativo desde un archivo de imagen de arranque", seleccione el ISO de Ubuntu que ha descargado anteriormente.When requested to "Install an operating system from a bootable image file", select the Ubuntu ISO you have download earlier.

    Nota

    No se sugiere el uso de creación rápida de Hyper-V .Using Hyper-V Quick Create is not suggested.

Capítulo 1: recuperar el modelo de Custom VisionChapter 1 - Retrieve the Custom Vision model

Con este curso, tendrá acceso a un modelo de Custom Vision predefinido que detecta teclados y ratones de las imágenes.With this course you will have access to a pre-built Custom Vision model that detects keyboards and mice from images. Si usa esto, continúe con el capítulo 2.If you use this, proceed to Chapter 2.

Sin embargo, puede seguir estos pasos si desea usar su propio modelo de Custom Vision:However, you can follow these steps if you wish to use your own Custom Vision model:

  1. En el proyecto de Custom Vision , vaya a la pestaña rendimiento .In your Custom Vision Project go to the Performance tab.

    Advertencia

    El modelo debe usar un dominio compacto para exportar el modelo.Your model must use a compact domain, to export the model. Puede cambiar el dominio de modelos en la configuración del proyecto.You can change your models domain in the settings for your project.

    pestaña rendimiento

  2. Seleccione la iteración que desea exportar y haga clic en exportar.Select the Iteration you want to export and click on Export. Aparecerá una hoja.A blade will appear.

    exportar hoja

  3. En la hoja, haga clic en archivo de Docker.In the blade click Docker File.

    seleccionar Docker

  4. Haga clic en Linux en el menú desplegable y, a continuación, haga clic en Descargar.Click Linux in the drop-down menu and then click on Download.

    Haga clic en descargar

  5. Descomprima el contenido.Unzip the content. La usará más adelante en este curso.You will use it later in this course.

Capítulo 2: servicio de Container RegistryChapter 2 - The Container Registry Service

El servicio Container Registry es el repositorio que se usa para hospedar los contenedores.The Container Registry Service is the repository used to host your containers.

El servicio IOT Hub que se va a compilar y usar en este curso hace referencia a Container Registry servicio para obtener los contenedores que se van a implementar en el dispositivo perimetral.The IoT Hub Service that you will build and use in this course, refers to Container Registry Service to obtain the containers to deploy in your Edge Device.

  1. En primer lugar, siga este vínculo a Azure portale inicie sesión con sus credenciales.First, follow this link to the Azure Portal, and login with your credentials.

  2. Vaya a crear un recurso y busque Container Registry.Go to Create a resource and look for Container Registry.

    registro de contenedor

  3. Haga clic en Crear.Click on Create.

  4. Establezca los parámetros de instalación del servicio:Set the Service setup parameters:

    1. Inserte un nombre para el proyecto, en este ejemplo, llamado IoTCRegistry.Insert a name for your project, In this example its called IoTCRegistry.

    2. Elija un grupo de recursos o cree uno nuevo.Choose a Resource Group or create a new one. 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.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

    3. Establezca la ubicación del servicio.Set the location of the Service.

    4. Establezca el usuario administrador en Habilitar.Set Admin user to Enable.

    5. Establezca SKU en básico.Set SKU to Basic.

  5. Haga clic en crear y espere a que se creen los servicios.Click Create and wait for the Services to be created.

  6. Cuando aparezca la notificación que le informa de la creación correcta de la Container Registry, haga clic en ir al recurso para redirigirlo a la página del servicio.Once the notification pops up informing you of the successful creation of the Container Registry, click on Go to resource to be redirected to your Service page.

  7. En la página servicio de Container Registry , haga clic en claves de acceso.In the Container Registry Service page, click on Access keys.

  8. Tome nota (puede utilizar el Bloc de notas) de los siguientes parámetros:Take note (you could use your Notepad) of the following parameters:

    1. Servidor de inicio de sesiónLogin Server
    2. Nombre de usuarioUsername
    3. ContraseñaPassword

Capítulo 3: servicio de IoT HubChapter 3 - The IoT Hub Service

Ahora comenzará la creación y configuración del servicio de IOT Hub.Now you will begin the creation and setup of your IoT Hub Service.

  1. Si aún no ha iniciado sesión, inicie sesión en Azure portal.If not already signed in, log into the Azure Portal.

  2. Una vez iniciada la sesión, haga clic en crear un recurso en la esquina superior izquierda y busque IOT Hub y haga clic en entrar.Once logged in, click on Create a resource in the top left corner, and search for IoT Hub, and click Enter.

búsqueda de la cuenta de almacenamiento

  1. La nueva página proporcionará una descripción del servicio de la cuenta de almacenamiento .The new page will provide a description of the Storage account Service. En la parte inferior izquierda de este mensaje, haga clic en el botón crear para crear una instancia de este servicio.At the bottom left of this prompt, click the Create button, to create an instance of this Service.

    Crear instancia de almacenamiento

  2. Una vez que haya hecho clic en crear, aparecerá un panel:Once you have clicked on Create, a panel will appear:

    1. Elija un grupo de recursos o cree uno nuevo.Choose a Resource Group or create a new one. 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.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      Si desea leer más sobre los grupos de recursos de Azure, siga este vínculo sobre cómo administrar un grupo de recursos.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    2. Seleccione una Ubicación adecuada (use la misma ubicación en todos los servicios que cree en este curso).Select an appropriate Location (Use the same location across all the Services you create in this course).

    3. Inserte el nombre que desee para esta instancia de servicio.Insert your desired Name for this Service instance.

  3. En la parte inferior de la página, haga clic en siguiente: tamaño y escala.On the bottom of the page click on Next: Size and scale.

    Crear instancia de almacenamiento

  4. En esta página, seleccione el nivel de precios y de escala (si se trata de la primera instancia de servicio de IOT Hub, debe estar disponible un nivel gratis).In this page, select your Pricing and scale tier (if this is your first IoT Hub Service instance, a free tier should be available to you).

  5. Haga clic en revisar y crear.Click on Review + Create.

    Crear instancia de almacenamiento

  6. Revise la configuración y haga clic en crear.Review your settings and click on Create.

    Crear instancia de almacenamiento

  7. Cuando aparezca la notificación que le informa de la creación correcta del servicio de IOT Hub , haga clic en ir al recurso para redirigirlo a la página del servicio.Once the notification pops up informing you of the successful creation of the IoT Hub Service, click on Go to resource to be redirected to your Service page.

    Crear instancia de almacenamiento

  8. Desplácese por el panel lateral de la izquierda hasta que vea Administración automática de dispositivos, haga clic en IOT Edge.Scroll the side panel on the left until you see Automatic Device Management, the click on IoT Edge.

    Crear instancia de almacenamiento

  9. En la ventana que aparece a la derecha, haga clic en agregar IOT Edge dispositivo.In the window that appears to the right, click on Add IoT Edge Device. Aparecerá una hoja a la derecha.A blade will appear to the right.

  10. En la hoja, proporcione a su nuevo dispositivo un identificador de dispositivo (el nombre que prefiera).In the blade, provide your new device a Device ID (a name of your choice). A continuación, haga clic en Guardar.Then, click Save. Las claves principal y secundaria se generarán automáticamente, si se ha generado automáticamente una marca.The Primary and Secondary Keys will auto generate, if you have Auto Generate ticked.

    Crear instancia de almacenamiento

  11. Volverá a la sección dispositivos IOT Edge , donde se mostrará el nuevo dispositivo.You will navigate back to the IoT Edge Devices section, where your new device will be listed. Haga clic en el nuevo dispositivo (descrito en rojo en la siguiente imagen).Click on your new device (outlined in red in the below image).

    Crear instancia de almacenamiento

  12. En la página detalles del dispositivo que aparece, realice una copia de la cadena de conexión (clave principal).On the Device Details page that appears, take a copy of the Connection String (primary key).

    Crear instancia de almacenamiento

  13. Vuelva al panel de la izquierda y haga clic en directivas de acceso compartido para abrirlo.Go back to the panel on the left, and click Shared access policies, to open it.

  14. En la página que aparece, haga clic en iothubowner y aparecerá una hoja a la derecha de la pantalla.On the page that appears, click iothubowner, and a blade will appear to the right of the screen.

  15. Tome nota (en el Bloc de notas) de la cadena de conexión (clave principal), para usarla más adelante al establecer la cadena de conexión en el dispositivo.Take note (on your Notepad) of the Connection string (primary key), for later use when setting the Connection String to your device.

    Crear instancia de almacenamiento

Capítulo 4: configurar el entorno de desarrolloChapter 4 - Setting up the development environment

Para crear e implementar módulos para IOT Hub Edge, necesitará los siguientes componentes instalados en el equipo de desarrollo que ejecuta Windows 10:In order to create and deploy modules for IoT Hub Edge, you will require the following components installed on your development machine running Windows 10:

  1. Docker para Windows, le pedirá que cree una cuenta para poder descargar.Docker for Windows, it will ask you to create an account to be able to download.

    descarga de Docker para Windowsdownload docker for windows

    Importante

    Docker requiere Windows 10 Pro, Enterprise 14393 o Windows Server 2016 RTM para ejecutarse.Docker requires Windows 10 PRO, Enterprise 14393, or Windows Server 2016 RTM, to run. Si está ejecutando otras versiones de Windows 10, puede intentar instalar Docker con el cuadro de herramientas de Docker.If you are running other versions of Windows 10, you can try installing Docker using the Docker Toolbox.

  2. Python 3,6.Python 3.6.

    descargar Python 3,6download python 3.6

  3. Visual Studio Code (también conocido como vs Code).Visual Studio Code (also known as VS Code).

    descargar VS Codedownload VS Code

Después de instalar el software mencionado anteriormente, deberá reiniciar el equipo.After installing the software mentioned above, you will need to restart your machine.

Capítulo 5: configuración del entorno de UbuntuChapter 5 - Setting up the Ubuntu environment

Ahora puede continuar con la configuración del dispositivo que ejecuta el sistema operativo Ubuntu.Now you can move on to setting up your device running Ubuntu OS. Siga los pasos que se indican a continuación para instalar el software necesario para implementar los contenedores en el panel:Follow the steps below, to install the necessary software, to deploy your containers on your board:

Importante

Siempre debe preceder los comandos de terminal con sudo para que se ejecute como usuario administrador.You should always precede the terminal commands with sudo to run as admin user. es decir,i.e:

sudo docker \<option> \<command> \<argument>
  1. Abra el terminal Ubuntu y use el siguiente comando para instalar PIP:Open the Ubuntu Terminal, and use the following command to install pip:

    [! SUGERENCIA] puede abrir terminal fácilmente mediante el método abreviado de teclado: Ctrl + Alt + T.[!HINT] You can open Terminal very easily through using the keyboard shortcut: Ctrl + Alt + T.

        sudo apt-get install python-pip
    
  2. En este capítulo, es posible que el terminal le solicite permiso para usar el almacenamiento del dispositivo y que escriba y /n (sí o no), escriba ' y ' y, a continuación, presione la tecla entrar para aceptar.Throughout this Chapter, you may be prompted, by Terminal, for permission to use your device storage, and for you to input y/n (yes or no), type 'y', and then press the Enter key, to accept.

  3. Una vez que se haya completado el comando, use el siguiente comando para instalar rizo:Once that command has completed, use the following command to install curl:

        sudo apt install curl
    
  4. Una vez instalados PIP y doblez , use el siguiente comando para instalar el IOT Edge en tiempo de ejecución, que es necesario para implementar y controlar los módulos en el panel:Once pip and curl are installed, use the following command to install the IoT Edge runtime, this is necessary to deploy and control the modules on your board:

        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 de IOT Hub (en el paso 14, del capítulo 3).At this point you will be prompted to open up the runtime config file, to insert the Device Connection String, that you noted down (in your Notepad), when creating the IoT Hub Service (at step 14, of Chapter 3). Ejecute la siguiente línea en el terminal para abrir el archivo:Run the following line on the terminal to open that file:

        sudo nano /etc/iotedge/config.yaml
    
  6. El archivo config. yaml se mostrará, listo para su edición:The config.yaml file will be displayed, ready for you to edit:

    Advertencia

    Cuando se abre este archivo, puede ser algo confuso.When this file opens, it may be somewhat confusing. Modificará el texto de este archivo, dentro del propio terminal .You will be text editing this file, within the Terminal itself.

    1. Use las teclas de flecha del teclado para desplazarse hacia abajo (tendrá que desplazarse hacia abajo) para llegar a la línea que contiene ":Use the arrow keys on your keyboard to scroll down (you will need to scroll down a little way), to reach the line containing":

      "<ADD DEVICE CONNECTION STRING HERE>"."<ADD DEVICE CONNECTION STRING HERE>".

    2. Línea de sustitución, incluidos los corchetes, con la cadena de conexión del dispositivo que anotó anteriormente.Substitute line, including the brackets, with the Device Connection String you have noted earlier.

  7. Con la cadena de conexión en su lugar, en el teclado, presione las teclas Ctrl + X para guardar el archivo.With your Connection String in place, on your keyboard, press the Ctrl-X keys to save the file. Le pedirá que confirme si escribe Y. A continuación, presione la tecla entrar para confirmar.It will ask you to confirm by typing Y. Then, press the Enter key, to confirm. Regresará al terminal normal.You will go back to the regular Terminal.

  8. Una vez que estos comandos se ejecuten correctamente, habrá instalado el tiempo de ejecución de IOT Edge.Once these commands have all run successfully, you will have installed the IoT Edge Runtime. Una vez inicializado, el tiempo de ejecución se iniciará por sí mismo cada vez que se encienda el dispositivo y permanecerá en segundo plano, esperando a que los módulos se implementen desde el servicio de IOT Hub.Once initialized, the runtime will start on its own every time the device is powered up, and will sit in the background, waiting for modules to be deployed from the IoT Hub Service.

  9. Ejecute la siguiente línea de comandos para inicializar el tiempo de ejecución de IOT Edge:Run the following command line to initialize the IoT Edge Runtime:

        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.If you make changes to your .yaml file, or the above setup, you will need to run the above restart line again, within Terminal.

  10. Para comprobar el estado del tiempo de ejecución de IOT Edge , ejecute la siguiente línea de comandos.Check the IoT Edge Runtime status by running the following command line. El tiempo de ejecución debe aparecer con el estado activo (en ejecución) en texto verde.The runtime should appear with the status active (running) in green text.

        sudo systemctl status iotedge
    
  11. Presione las teclas Ctrl + C para salir de la página Estado.Press the Ctrl-C keys, to exit the status page. Para comprobar que el tiempo de ejecución de IOT Edge está extrayendo los contenedores, escriba el comando siguiente:You can verify that the IoT Edge Runtime is pulling the containers correctly by typing the following command:

        sudo docker ps
    
  12. Debe aparecer una lista con dos (2) contenedores.A list with two (2) containers should appear. Estos son los módulos predeterminados que crea automáticamente el servicio IoT Hub (edgeAgent y edgeHub).These are the default modules that are automatically created by the IoT Hub Service (edgeAgent and edgeHub). Una vez que cree e implemente sus propios módulos, aparecerán en esta lista, debajo de los valores predeterminados.Once you create and deploy your own modules, they will appear in this list, underneath the default ones.

Capítulo 6: instalación de las extensionesChapter 6 - Install the extensions

Importante

Los siguientes capítulos (6-9) se realizarán en el equipo con Windows 10.The next few Chapters (6-9) are to be performed on your Windows 10 machine.

  1. Abra vs Code.Open VS Code.

  2. Haga clic en el botón extensiones (cuadrado) de la barra izquierda de vs code para abrir el Panel extensiones.Click on the Extensions (square) button on the left bar of VS Code, to open the Extensions panel.

  3. Busque e instale las extensiones siguientes (como se muestra en la imagen siguiente):Search for, and install, the following extensions (as shown in the image below):

    1. Azure IoT EdgeAzure IoT Edge
    2. Azure IoT ToolkitAzure IoT Toolkit
    3. DockerDocker

    Creación de un contenedor

  4. Una vez instaladas las extensiones, cierre y vuelva a abrir VS Code.Once the extensions are installed, close and re-open VS Code.

  5. Con vs Code abierto una vez más, vaya a Ver > terminal integrado.With VS Code open once more, navigate to View > Integrated terminal.

  6. Ahora va a instalar Cookiecutter.You will now install Cookiecutter. En el terminal, ejecute el siguiente comando de Bash:In the terminal run the following bash command:

        pip install --upgrade --user cookiecutter
    

    [! SUGERENCIA] Si tiene problemas con este comando:[!HINT] If you have trouble with this command:

    1. Reinicie VS Code y/o el equipo.Restart VS Code, and/ or your computer.
    2. Puede que sea necesario cambiar el terminal de vs Code por el 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).It might be necessary to switch the VS Code Terminal to the one you have been using to install Python, i.e. Powershell (especially in case the Python environment was already installed on your machine). Con el terminal abierto, encontrará el menú desplegable en el lado derecho del terminal.With the Terminal open, you will find the drop down menu on the right side of the Terminal. Creación de un contenedorCreate your container
    3. Asegúrese de que la ruta de instalación de Python se agrega como variable de entorno en la máquina.Make sure the Python installation path is added as Environment Variable on your machine. Cookiecutter debe formar parte de la misma ruta de acceso de ubicación.Cookiecutter should be part of the same location path. Siga este vínculo para obtener más información sobre las variables de entorno.Please follow this link for more information on Environment Variables,
  7. Una vez que Cookiecutter haya finalizado la instalación, debe reiniciar el equipo para que Cookiecutter se reconozca como un comando, dentro del entorno del sistema.Once Cookiecutter has finished installing, you should restart your machine, so that Cookiecutter is recognized as a command, within your System's environment.

Capítulo 7: creación de la solución de contenedorChapter 7 - Create your container solution

En este punto, debe crear el contenedor, con el módulo, que se va a insertar en el Container Registry.At this point, you need to create the container, with the module, to be pushed into the Container Registry. Una vez que haya insertado el contenedor, usará el servicio IOT Hub Edge para implementarlo en el dispositivo, que ejecuta el tiempo de ejecución de IOT Edge.Once you have pushed your container, you will use the IoT Hub Edge Service to deploy it to your device, which is running the IoT Edge runtime.

  1. En vs Code, haga clic en Ver > paleta de comandos.From VS Code, click View > Command palette.

  2. En la paleta, busque y ejecute Azure IOT Edge: nueva solución de IOT Edge.In the palette, search and run Azure IoT Edge: New Iot Edge Solution.

  3. Vaya a la ubicación en la que desea crear la solución.Browse into a location where you want to create your solution. Presione la tecla entrar para aceptar la ubicación.Press the Enter key, to accept the location.

  4. Asigne un nombre a la solución.Give a name to your solution. Presione la tecla entrar para confirmar el nombre proporcionado.Press the Enter key, to confirm your provided name.

  5. Ahora se le pedirá que elija el marco de trabajo de la plantilla de la solución.Now you will be prompted to choose the template framework for your solution. Haga clic en módulo de Python.Click Python Module. Presione la tecla entrar para confirmar esta opción.Press the Enter key, to confirm this choice.

  6. Asigne un nombre al módulo.Give a name to your module. Presione la tecla entrar para confirmar el nombre del módulo.Press the Enter key, to confirm the name of your module. Asegúrese de tomar nota (con el Bloc de notas) del nombre del módulo, tal y como se usa más adelante.Make sure to take a note (with your Notepad) of the module name, as it is used later.

  7. Observará que aparecerá una dirección de repositorio de imagen de Docker pregenerada en la paleta.You will notice a pre-built Docker Image Repository address will appear on the palette. Tendrá el siguiente aspecto:It will look like:

    localhost: 5000/-el nombre del módulo:.localhost:5000/-THE NAME OF YOUR MODULE-.

  8. Elimine localhost: 5000 y, en su lugar, inserte la Container Registry dirección del servidor de inicio de sesión , que anotó al crear el servicio Container Registry (en el paso 8 del capítulo 2).Delete localhost:5000, and in its place insert the Container Registry Login Server address, which you noted when creating the Container Registry Service (in step 8, of Chapter 2). Presione la tecla entrar para confirmar la dirección.Press the Enter key, to confirm the address.

  9. En este momento, se creará la solución que contiene la plantilla para el módulo de Python y su estructura se mostrará en la pestaña explorar, de vs Code, en el lado izquierdo de la pantalla.At this point, the solution containing the template for your Python module will be created and its structure will be displayed in the Explore Tab, of VS Code, on the left side of the screen. Si la pestaña explorar no está abierta, puede abrirla haciendo clic en el botón de nivel superior, en la barra de la izquierda.If the Explore Tab is not open, you can open it by clicking the top-most button, in the bar on the left.

    Creación de un contenedor

  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 .The last step for this Chapter, is to click and open the .env file, from within the Explore Tab, and add your Container Registry username and password. Git omite este archivo, pero al compilar el contenedor, establecerá las credenciales para tener acceso al servicio Container Registry.This file is ignored by git, but on building the container, will set the credentials to access the Container Registry Service.

    Creación de un contenedor

Capítulo 8: edición de la solución de contenedorChapter 8 - Editing your container solution

Ahora completará la solución de contenedor mediante la actualización de los siguientes archivos:You will now complete the container solution, by updating the following files:

  • script de Python Main . py .main.py python script.
  • requirements.txt.requirements.txt.
  • deployment.template.js.deployment.template.json.
  • Dockerfile. AMD64Dockerfile.amd64

A continuación, creará la carpeta images , usada por el script de Python para comprobar que las imágenes coinciden con el modelo de Custom Vision.You will then create the images folder, used by the python script to check for images to match against your Custom Vision model. Por último, agregará el archivo labels.txt , para ayudar a leer el modelo y el archivo Model. PB , que es el modelo.Lastly, you will add the labels.txt file, to help read your model, and the model.pb file, which is your model.

  1. Con VS Code abierto, vaya a la carpeta del módulo y busque el script denominado Main . py.With VS Code open, navigate to your module folder, and look for the script called main.py. Haga doble clic para abrirlo.Double-click to open it.

  2. Elimine el contenido del archivo e inserte el código siguiente:Delete the content of the file and insert the following code:

    # 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:Open the file called requirements.txt, and substitute its content with the following:

    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.jsen y sustituya su contenido por la siguiente directriz:Open the file called deployment.template.json, and substitute its content following the below guideline:

    1. Dado que tendrá su propia estructura JSON, única, tendrá que editarla manualmente (en lugar de copiar un ejemplo).Because you will have your own, unique, JSON structure, you will need to edit it by hand (rather than copying an example). Para facilitar esta tarea, use la imagen siguiente como guía.To make this easy, use the below image as a guide.

    2. Las áreas que tendrán un aspecto distinto al suyo, pero que no debe cambiar, se resaltan en amarillo.Areas which will look different to yours, but which you should NOT change are highlighted yellow.

    3. Las secciones que debe eliminar se resaltan en rojo.Sections which you need to delete, are a highlighted red.

    4. Tenga cuidado de eliminar los corchetes correctos y, además, quite las comas.Be careful to delete the correct brackets, and also remove the commas.

      Creación de un contenedor

    5. El JSON completado debe parecerse a la imagen siguiente (sin embargo, con las diferencias únicas: nombre de usuario/contraseña/nombre de módulo/referencias de módulo):The completed JSON should look like the following image (though, with your unique differences: username/password/module name/module references):

      Creación de un contenedor

  5. Abra el archivo denominado Dockerfile. AMD64 y sustituya su contenido por lo siguiente:Open the file called Dockerfile.amd64, and substitute its content with the following:

    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 secundario en la carpeta situada debajo de módulos (tendrá el nombre que proporcionó anteriormente; en el ejemplo más abajo, se denomina pythonmodule) y haga clic en nueva carpeta.Right-click on the folder beneath modules (it will have the name you provided previously; in the example further down, it is called pythonmodule), and click on New Folder. Asigne a la carpeta el nombre images.Name the folder images.

  7. Dentro de la carpeta, agregue algunas imágenes que contengan el mouse o el teclado.Inside the folder, add some images containing mouse or keyboard. Serán las imágenes que se van a analizar con el modelo Tensorflow.Those will be the images that will be analyzed by the Tensorflow model.

    Advertencia

    Si usa su propio modelo, tendrá que cambiarlo para reflejar sus propios datos de modelos.If you are using your own model, you will need to change this to reflect your own models data.

  8. Ahora necesitará recuperar los archivos labels.txt y Model. PB de la carpeta del modelo, que antes descargó (o creó a partir de su propia Custom Vision Service), en el capítulo 1.You will now need to retrieve the labels.txt and model.pb files from the model folder, which you previous downloaded (or created from your own Custom Vision Service), in Chapter 1. Una vez que tenga los archivos, colóquelos dentro de la solución, junto con los demás archivos.Once you have the files, place them within your solution, alongside the other files. El resultado final debe ser similar a la imagen siguiente:The final result should look like the image below:

    Creación de un contenedor

Capítulo 9: empaquetar la solución como un contenedorChapter 9 - Package the solution as a container

  1. Ahora está listo para "empaquetar" los archivos como un contenedor e insertarlos en el Azure Container Registry.You are now ready to "package" your files as a container and push it to your 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 con las credenciales de su Azure Container Registry (ACR)):Within VS Code, open the Integrated Terminal (View > Integrated Terminal or Ctrl+`), and use the following line to login to Docker (substitute the values of the command with the credentials of your 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.js y haga clic en compilar IOT Edge solución.Right-click on the file deployment.template.json, and click Build IoT Edge Solution. Este proceso de compilación tarda bastante tiempo (dependiendo del dispositivo), por lo que debe estar preparado para esperar.This build process takes quite some time (depending on your device), so be prepared to wait. Una vez finalizado el proceso de compilación, se creará una deployment.jsen el archivo en una nueva carpeta denominada config.After the build process finishes, a deployment.json file will have been created inside a new folder called config.

    crear implementación

  3. Vuelva a abrir la paleta de comandos y busque Azure: Sign in.Open the Command Palette again, and search for Azure: Sign In. Siga las indicaciones con las credenciales de su 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.Follow the prompts using your Azure Account credentials; VS Code will provide you with an option to Copy and Open, which will copy the device code you will soon need, and open your default web browser. Cuando se le solicite, pegue el código del dispositivo para autenticar el equipo.When asked, paste the device code, to authenticate your machine.

    copiar y abrir

  4. Una vez que haya iniciado sesión, observará que, en la parte inferior del panel de exploración , se trata de una nueva sección denominada Azure IOT Hub dispositivos.Once signed in you will notice, on the bottom side of the Explore panel, a new section called Azure IoT Hub Devices. Haga clic en esta sección para expandirla.Click this section to expand it.

    dispositivo perimetral

  5. Si el dispositivo no está aquí, tendrá que hacer clic con el botón derecho en Azure IOT Hub dispositivos y, a continuación, hacer clic en establecer cadena de conexión de IOT Hub.If your device is not here, you will need to right-click Azure IoT Hub Devices, and then click Set IoT Hub Connection String. Después verá que la paleta de comandos (en la parte superior de vs Code) le pedirá que escriba la cadena de conexión.You will then see that the Command Palette (at the top of VS Code), will prompt you to input your Connection String. Esta es la cadena de conexión que anotó al final del capítulo 3.This is the Connection String you noted down at the end of Chapter 3. Presione la tecla entrar cuando haya copiado la cadena en.Press the Enter key, once you have copied the string in.

  6. El dispositivo debe cargarse y aparecer.Your device should load, and appear. 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.Right-click on the device name, and then click, Create Deployment for Single Device.

    crear implementación

  7. Obtendrá un mensaje del Explorador de archivos , donde puede ir a la carpeta config y seleccionar el deployment.jsen el archivo.You will get a File Explorer prompt, where you can navigate to the config folder, and then select the deployment.json file. Con ese archivo seleccionado, haga clic en el botón seleccionar manifiesto de implementación perimetral .With that file selected, click the Select Edge Deployment Manifest button.

    crear implementación

  8. Llegados a este punto, ha proporcionado su servicio de IOT Hub con el manifiesto para que implemente el contenedor, como un módulo, desde su Azure Container Registry, y lo implemente de forma eficaz en el dispositivo.At this point you have provided your IoT Hub Service with the manifest for it to deploy your container, as a module, from your Azure Container Registry, effectively deploying it to your device.

  9. Para ver los mensajes enviados desde el dispositivo a la IoT Hub, vuelva a hacer clic con el botón derecho en el nombre del dispositivo en la sección dispositivos Azure IOT Hub , en el panel Explorador y haga clic en iniciar supervisión del mensaje de D2C.To view the messages sent from your device to the IoT Hub, right-click again on your device name in the Azure IoT Hub Devices section, in the Explorer panel, and click on Start Monitoring D2C Message. Los mensajes enviados desde el dispositivo deben aparecer en el terminal de VS.The messages sent from your device should appear in the VS Terminal. Sea paciente, ya que esto puede tardar algún tiempo.Be patient, as this may take some time. Vea el capítulo siguiente para la depuración y comprobar si la implementación se realizó correctamente.See the next Chapter for debugging, and checking if deployment was successful.

Este módulo iterará ahora entre las imágenes de la carpeta images y las analizará con cada iteración.This module will now iterate between the images in the images folder and analyze them, with each iteration. Obviamente, esto es solo una demostración de cómo obtener el modelo de aprendizaje automático básico para trabajar en un entorno de dispositivo IoT Edge.This is obviously just a demonstration of how to get the basic machine learning model to work in an IoT Edge device environment.

Para expandir la funcionalidad de este ejemplo, puede continuar de varias maneras.To expand the functionality of this example, you could proceed in several ways. Una manera podría incluir código en el contenedor, que capture fotografías de una cámara web conectada al dispositivo y las guarde en la carpeta images.One way could be including some code in the container, that captures photos from a webcam that is connected to the device, and saves the images in the images folder.

Otra manera podría ser copiar las imágenes del dispositivo IoT en el contenedor.Another way could be copying the images from the IoT device into the container. Una manera práctica de hacerlo es ejecutar el siguiente comando en el terminal del dispositivo IoT (quizás una aplicación pequeña podría hacer el trabajo, si desea automatizar el proceso).A practical way to do that is to run the following command in the IoT device Terminal (perhaps a small app could do the job, if you wished to automate the process). Puede probar este comando si lo ejecuta manualmente desde la ubicación de la carpeta donde se almacenan los archivos:You can test this command by running it manually from the folder location where your files are stored:

    sudo docker cp <filename> <modulename>:/app/images/<a name of your choice>

Capítulo 10: depurar el tiempo de ejecución de IoT EdgeChapter 10 - Debugging the IoT Edge Runtime

A continuación se muestra una lista de líneas de comandos y sugerencias que le ayudarán a supervisar y depurar la actividad de mensajería del tiempo de ejecución de IOT Edge desde el dispositivo Ubuntu.The following are a list of command lines, and tips, to help you monitor and debug the messaging activity of the IoT Edge Runtime, from your Ubuntu device.

  • Para comprobar el estado del tiempo de ejecución de IOT Edge , ejecute la siguiente línea de comandos:Check the IoT Edge Runtime status by running the following command line:

        sudo systemctl status iotedge
    

    Nota

    Recuerde presionar Ctrl + C para terminar de ver el estado.Remember to press Ctrl + C, to finish viewing the status.

  • Enumerar los contenedores que están implementados actualmente.List the containers that are currently deployed. Si el servicio IOT Hub ha implementado los contenedores correctamente, se mostrarán ejecutando la siguiente línea de comandos:If the IoT Hub Service has deployed the containers successfully, they will be displayed by running the following command line:

        sudo iotedge list
    

    OrOr

        sudo docker ps
    

    Nota

    Lo anterior es una buena manera de comprobar si el módulo se ha implementado correctamente, tal y como aparecerá en la lista. de lo contrario, solo verá edgeHub y edgeAgent.The above is a good way to check whether your module has been deployed successfully, as it will appear in the list; you will otherwise only see the edgeHub and edgeAgent.

  • Para mostrar los registros de código de un contenedor, ejecute la siguiente línea de comandos:To display the code logs of a container, run the following command line:

        journalctl -u iotedge
    

Comandos útiles para administrar el tiempo de ejecución de IoT Edge:Useful commands to manage the IoT Edge Runtime:

  • Para eliminar todos los contenedores del host:To delete all containers in the host:

        sudo docker rm -f $(sudo docker ps -aq)
    
  • Para detener el tiempo de ejecución de IOT Edge:To stop the IoT Edge Runtime:

        sudo systemctl stop iotedge
    

Capítulo 11: creación de un servicio tablaChapter 11 - Create Table Service

Vuelva a Azure portal, donde creará un servicio de tablas de Azure, mediante la creación de un recurso de almacenamiento.Navigate back to your Azure Portal, where you will create an Azure Tables Service, by creating a Storage resource.

  1. Si aún no ha iniciado sesión, inicie sesión en Azure portal.If not already signed in, log into the Azure Portal.

  2. Una vez que haya iniciado sesión, haga clic en crear un recurso, en la esquina superior izquierda, busque la cuenta de almacenamiento y presione la tecla entrar para iniciar la búsqueda.Once logged in, click on Create a resource, in the top left corner, and search for Storage account, and press the Enter key, to start the search.

  3. Una vez que haya aparecido, haga clic en cuenta de almacenamiento: BLOB, archivo, tabla, cola en la lista.Once it has appeared, click Storage account - blob, file, table, queue from the list.

    búsqueda de la cuenta de almacenamiento

  4. La nueva página proporcionará una descripción del servicio de la cuenta de almacenamiento .The new page will provide a description of the Storage account Service. En la parte inferior izquierda de este mensaje, haga clic en el botón crear para crear una instancia de este servicio.At the bottom left of this prompt, click the Create button, to create an instance of this Service.

    Crear instancia de almacenamiento

  5. Una vez que haya hecho clic en crear, aparecerá un panel:Once you have clicked on Create, a panel will appear:

    1. Inserte el nombre que desee para esta instancia de servicio (debe estar todo en minúsculas).Insert your desired Name for this Service instance (must be all lowercase).

    2. En modelo de implementación, haga clic en Administrador de recursos.For Deployment model, click Resource manager.

    3. En tipo de cuenta, en el menú desplegable, haga clic en almacenamiento (uso general V1).For Account kind, using the dropdown menu, click Storage (general purpose v1).

    4. Haga clic en una Ubicación adecuada.Click an appropriate Location.

    5. En el menú desplegable replicación , haga clic en almacenamiento con redundancia geográfica con acceso de lectura (RA-grs).For the Replication dropdown menu, click Read-access-geo-redundant storage (RA-GRS).

    6. En rendimiento, haga clic en estándar.For Performance, click Standard.

    7. Dentro de la sección transferencia segura requerida , haga clic en deshabilitado.Within the Secure transfer required section, click Disabled.

    8. En el menú desplegable suscripción , haga clic en una suscripción adecuada.From the Subscription dropdown menu, click an appropriate subscription.

    9. Elija un grupo de recursos o cree uno nuevo.Choose a Resource Group or create a new one. 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.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      Si desea leer más sobre los grupos de recursos de Azure, siga este vínculo sobre cómo administrar un grupo de recursos.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    10. Deje redes virtuales como deshabilitadas si se trata de una opción.Leave Virtual networks as Disabled, if this is an option for you.

    11. Haga clic en Crear.Click Create.

      Rellene los detalles de almacenamiento

  6. Una vez que haya hecho clic en crear, tendrá que esperar a que se cree el servicio, lo que puede tardar un minuto.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  7. Una vez que se crea la instancia de servicio, aparecerá una notificación en el portal.A notification will appear in the Portal once the Service instance is created. Haga clic en las notificaciones para explorar la nueva instancia de servicio.Click on the notifications to explore your new Service instance.

    nueva notificación de almacenamiento

  8. Haga clic en el botón ir a recurso de la notificación y se le dirigirá a la página de información general de la nueva instancia del servicio de almacenamiento.Click the Go to resource button in the notification, and you will be taken to your new Storage Service instance overview page.

    ir al recurso

  9. En la página información general, en la parte derecha, haga clic en tablas.From the overview page, to the right-hand side, click Tables.

    tablas

  10. El panel de la derecha cambiará para mostrar la información del servicio tabla , en la que es necesario agregar una nueva tabla.The panel on the right will change to show the Table Service information, wherein you need to add a new table. Para ello, haga clic en el botón + tabla en la esquina superior izquierda.Do this by clicking the + Table button to the top-left corner.

    abrir tablas

  11. Se mostrará una nueva página, en la que es necesario escribir un nombre de tabla.A new page will be shown, wherein you need to enter a Table name. 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).This is the name you will use to refer to the data in your application in later Chapters (creating Function App, and Power BI). Inserte IoTMessages como nombre (puede elegir el suyo propio, simplemente Recuerde que cuando se usa más adelante en este documento) y haga clic en Aceptar.Insert IoTMessages as the name (you can choose your own, just remember it when used later in this document) and click OK.

  12. Una vez creada la nueva tabla, podrá verla en la página Table Service (en la parte inferior).Once the new table has been created, you will be able to see it within the Table Service page (at the bottom).

    nueva tabla creada

  13. Ahora, haga clic en claves de acceso y tome una copia del nombre y la clave de la cuenta de almacenamiento (con el Bloc de notas). estos valores se usarán más adelante en este curso, al crear el function App de Azure.Now click on Access keys and take a copy of the Storage account name and Key (using your Notepad), you will use these values later in this course, when creating the Azure Function App.

    nueva tabla creada

  14. Vuelva a usar el panel de la izquierda, desplácese hasta la sección Table Service y haga clic en tables ( examinar tablas, en portales más recientes) y realice una copia de la dirección URL de la tabla (con el Bloc de notas).Using the panel on the left again, scroll to the Table Service section, and click Tables (or Browse Tables, in newer Portals) and take a copy of the Table URL (using your Notepad). Usará este valor más adelante en este curso, al vincular la tabla a la aplicación Power BI .You will use this value later in this course, when linking your table to your Power BI application.

    nueva tabla creada

Capítulo 12: completar la tabla de AzureChapter 12 - Completing the Azure Table

Ahora que se ha configurado la cuenta de almacenamiento de Table Service , es el momento de agregar datos a ella, que se usará para almacenar y recuperar información.Now that your Table Service storage account has been setup, it is time to add data to it, which will be used to store and retrieve information. La edición de las tablas se puede realizar a través de Visual Studio.The editing of your Tables can be done through Visual Studio.

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

  2. En el menú, haga clic en Ver > Cloud Explorer.From the menu, click View > Cloud Explorer.

    Abra Cloud Explorer

  3. El Cloud Explorer se abrirá como un elemento acoplado (sea paciente, ya que la carga puede tardar tiempo).The Cloud Explorer will open as a docked item (be patient, as loading may take time).

    Advertencia

    Si la suscripción que usó para crear las cuentas de almacenamiento no es visible, asegúrese de que tiene:If the subscription you used to create your Storage Accounts is not visible, ensure that you have:

    • Ha iniciado sesión en la misma cuenta que la que usó para Azure portal.Logged in to the same account as the one you used for the Azure Portal.

    • Seleccionó su suscripción desde la página de administración de cuentas (puede que tenga que aplicar un filtro de la configuración de la cuenta):Selected your subscription from the Account Management page (you may need to apply a filter from your account settings):

      buscar suscripción

  4. Se mostrarán los servicios en la nube de Azure.Your Azure cloud Services will be shown. Busque cuentas de almacenamiento y haga clic en la flecha situada a la izquierda de ella para expandir sus cuentas.Find Storage Accounts and click the arrow to the left of that to expand your accounts.

    abrir cuentas de almacenamiento

  5. Una vez expandida, la cuenta de almacenamiento recién creada debe estar disponible.Once expanded, your newly created Storage account should be available. Haga clic en la flecha situada a la izquierda de su almacenamiento y, después, una vez expandida, busque tablas y haga clic en la flecha situada junto a ella para mostrar la tabla que ha creado en el último capítulo.Click the arrow to the left of your storage, and then once that is expanded, find Tables and click the arrow next to that, to reveal the Table you created in the last Chapter. Haga doble clic en la tabla.Double-click your Table.

  6. La tabla se abrirá en el centro de la ventana de Visual Studio.Your table will be opened in the center of your Visual Studio window. Haga clic en el icono de la tabla con el + signo (más).Click the table icon with the + (plus) on it.

    Agregar nueva tabla

  7. Aparecerá una ventana que le solicitará que agregue la entidad.A window will appear prompting for you to Add Entity. Solo creará una entidad, aunque tendrá tres propiedades.You will create only one entity, though it will have three properties. Observará que PartitionKey y RowKey ya se han proporcionado, ya que se usan en la tabla para buscar los datos.You will notice that PartitionKey and RowKey are already provided, as these are used by the table to find your data.

    partición y clave de fila

  8. Actualice los siguientes valores:Update the following values:

    • Nombre: PartitionKey, valor: PK_IoTMessagesName: PartitionKey, Value: PK_IoTMessages

    • Nombre: RowKey, valor: RK_1_IoTMessagesName: RowKey, Value: RK_1_IoTMessages

  9. A continuación, haga clic en Agregar propiedad (en la esquina inferior izquierda de la ventana Agregar entidad ) y agregue la siguiente propiedad:Then, click Add property (to the lower left of the Add Entity window) and add the following property:

    • MessageContent, como una cadena, deje el valor vacío.MessageContent, as a string, leave the Value empty.
  10. La tabla debe coincidir con la de la imagen siguiente:Your table should match the one in the image below:

    agregar valores correctos

    Nota

    La razón por la que la entidad tiene el número 1 en la clave de fila, es que es posible que desee agregar más mensajes, en caso de que desee experimentar con este curso.The reason why the entity has the number 1 in the row key, is because you might want to add more messages, should you desire to experiment further with this course.

  11. Cuando haya terminado, haga clic en Aceptar .Click OK when you are finished. La tabla ya está lista para usarse.Your table is now ready to be used.

Capítulo 13: creación de una Function App de AzureChapter 13 - Create an Azure Function App

Ahora es el momento de crear una function App de Azure, a la que llamará el servicio IOT Hub para almacenar los mensajes de dispositivo IOT Edge en el servicio tabla , que creó en el capítulo anterior.It is now time to create an Azure Function App, which will be called by the IoT Hub Service to store the IoT Edge device messages in the Table Service, which you created in the previous Chapter.

En primer lugar, debe crear un archivo que permita que la función de Azure cargue las bibliotecas que necesita.First, you need to create a file that will allow your Azure Function to load the libraries you need.

  1. Abra el Bloc de notas (Presione la tecla Windows y escriba Notepad).Open Notepad (press the Windows Key, and type notepad).

    abrir el Bloc de notas

  2. Con el Bloc de notas abierto, inserte la siguiente estructura JSON en él.With Notepad open, insert the JSON structure below into it. Una vez hecho esto, guárdelo en el escritorio como project.js.Once you have done that, save it on your desktop as project.json. Este archivo define las bibliotecas que utilizará la función.This file defines the libraries your function will use. Si ha usado NuGet, le resultará familiar.If you have used NuGet, it will look familiar.

    Advertencia

    Es importante que la nomenclatura sea correcta; Asegúrese de que no tiene una extensión de archivo. txt .It is important that the naming is correct; ensure it does NOT have a .txt file extension. Vea la siguiente referencia:See below for reference:

    Guardado de JSON

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "9.2.0"
        }
        }
    }
    }
    
  3. Inicie sesión en Azure Portal.Log in to the 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.Once you are logged in, click on Create a resource in the top left corner, and search for Function App, and press the Enter key, to search. Haga clic en function App de los resultados para abrir un nuevo panel.Click Function App from the results, to open a new panel.

    búsqueda de function App

  5. El nuevo panel proporcionará una descripción del servicio function App .The new panel will provide a description of the 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.At the bottom left of this panel, click the Create button, to create an association with this Service.

    instancia de la aplicación de función

  6. Una vez que haya hecho clic en crear, rellene lo siguiente:Once you have clicked on Create, fill in the following:

    1. En nombre de la aplicación, inserte el nombre que desee para esta instancia de servicio.For App name, insert your desired name for this Service instance.

    2. Seleccione una opción en Suscripción.Select a Subscription.

    3. Seleccione el plan de tarifa adecuado para usted; si es la primera vez que crea un servicio de function App, debe estar disponible un nivel gratis.Select the pricing tier appropriate for you, if this is the first time creating a Function App Service, a free tier should be available to you.

    4. Elija un grupo de recursos o cree uno nuevo.Choose a Resource Group or create a new one. 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.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos cursos) en un grupo de recursos común).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      Si desea leer más sobre los grupos de recursos de Azure, siga este vínculo sobre cómo administrar un grupo de recursos.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    5. En el caso de sistemas operativos, haga clic en Windows, ya que es la plataforma prevista.For OS, click Windows, as that is the intended platform.

    6. Seleccione un plan de hospedaje (este tutorial usa un plan de consumo.Select a Hosting Plan (this tutorial is using a Consumption Plan.

    7. Seleccione una Ubicación (elija la misma ubicación que el almacenamiento que ha creado en el paso anterior)Select a Location (choose the same location as the storage you have built in the previous step)

    8. En la sección almacenamiento , debe seleccionar el servicio de almacenamiento que creó en el paso anterior.For the Storage section, you must select the Storage Service you created in the previous step.

    9. No necesitará Application Insights en esta aplicación, así que no dude en dejarlo fuera de servicio.You will not need Application Insights in this app, so feel free to leave it Off.

    10. Haga clic en Crear.Click Create.

      crear nueva instancia

  7. Una vez que haya hecho clic en crear, tendrá que esperar a que se cree el servicio, lo que puede tardar un minuto.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  8. Una vez que se crea la instancia de servicio, aparecerá una notificación en el portal.A notification will appear in the Portal once the Service instance is created.

    nueva notificación

  9. Haga clic en la notificación, una vez que la implementación sea correcta (ha finalizado).Click on the notification, once deployment is successful (has finished).

  10. Haga clic en el botón ir a recurso de la notificación para explorar la nueva instancia de servicio.Click the Go to resource button in the notification to explore your new Service instance.

    ir al recurso

  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.In the left side of the new panel, click the + (plus) icon next to Functions, to create a new function.

    Agregar nueva función

  12. En el panel central, aparecerá la ventana de creación de la función .Within the central panel, the Function creation window will appear. Desplácese hacia abajo y haga clic en función personalizada.Scroll down further, and click on Custom function.

    función personalizada

  13. Desplácese hacia abajo en la página siguiente hasta que encuentre IOT Hub (centro de eventos) y haga clic en él.Scroll down the next page, until you find IoT Hub (Event Hub), then click on it.

    función personalizada

  14. En la hoja IOT Hub (centro de eventos) , establezca el idioma en C# y, a continuación, haga clic en nuevo.In the IoT Hub (Event Hub) blade, set the Language to C# and then click on new.

    función personalizada

  15. En la ventana que aparecerá, asegúrese de que está seleccionado IOT Hub y de que el nombre del campo de IOT Hub corresponde al nombre del servicio de IOT Hub que ha creado anteriormente (en el paso 8, del capítulo 3).In the window that will appear, make sure that IoT Hub is selected and the name of the IoT Hub field corresponds with the name of your IoT Hub Service that you have created previously (in step 8, of Chapter 3). A continuación, haga clic en el botón seleccionar .Then click the Select button.

    función personalizada

  16. De nuevo en la hoja IOT Hub (centro de eventos) , haga clic en crear.Back on the IoT Hub (Event Hub) blade, click on Create.

    función personalizada

  17. Se le redirigirá al editor de funciones.You will be redirected to the function editor.

    función personalizada

  18. Elimine todo el código que contiene y reemplácelo por lo siguiente:Delete all the code in it and replace it with the following:

    #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:Change the following variables, so that they correspond to the appropriate values (Table and Storage values, from step 11 and 13, respectively, of Chapter 11), that you will find in your Storage Account:

    • TableName, con el nombre de la tabla que se encuentra en la cuenta de almacenamiento.tableName, with the name of your Table located in your Storage Account.
    • tableURL, con la dirección URL de la tabla que se encuentra en la cuenta de almacenamiento.tableURL, with the URL of your Table located in your Storage Account.
    • storageAccountName, con el nombre del valor que corresponde al nombre de su cuenta de almacenamiento .storageAccountName, with the name of the value corresponding with the name of your Storage Account name.
    • storageAccountKey, con la clave que ha obtenido en el servicio de almacenamiento que ha creado anteriormente.storageAccountKey, with the Key you have obtained in the Storage Service you have created previously.

    función personalizada

  20. Con el código en su lugar, haga clic en Guardar.With the code in place, click Save.

  21. A continuación, haga clic en el < icono (flecha) situado en el lado derecho de la página.Next, click the < (arrow) icon, on the right-hand side of the page.

    función personalizada

  22. Un panel se deslizará hacia la derecha.A panel will slide in from the right. En ese panel, haga clic en cargar y aparecerá un Explorador de archivos .In that panel, click Upload, and a File Browser will appear.

  23. Vaya a, haga clic en el project.jsen el archivo que creó anteriormente en el Bloc de notas y, a continuación, haga clic en el botón abrir .Navigate to, and click, the project.json file, which you created in Notepad previously, and then click the Open button. Este archivo define las bibliotecas que utilizará la función.This file defines the libraries that your function will use.

    función personalizada

  24. Cuando se haya cargado el archivo, aparecerá en el panel de la derecha.When the file has uploaded, it will appear in the panel on the right. Al hacer clic en él se abrirá en el editor de funciones .Clicking it will open it within the Function editor. Debe tener exactamente el mismo aspecto que la siguiente imagen.It must look exactly the same as the next image.

    función personalizada

  25. En este momento, sería conveniente probar la funcionalidad de la función para almacenar el mensaje en la tabla.At this point it would be good to test the capability of your Function to store the message on your Table. En el lado superior derecho de la ventana, haga clic en prueba.On the top right side of the window, click on Test.

    función personalizada

  26. Inserte un mensaje en el cuerpo de la solicitud, tal como se muestra en la imagen anterior, y haga clic en Ejecutar.Insert a message on the Request body, as shown in the image above, and click on Run.

  27. La función se ejecutará y mostrará el estado del resultado (verá el estado verde 202 aceptado, encima de la ventana de salida , lo que significa que se trata de una llamada correcta):The function will run, displaying the result status (you will notice the green Status 202 Accepted, above the Output window, which means it was a successful call):

    resultado de salida

Capítulo 14: ver los mensajes activosChapter 14 - View active messages

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 la cadena MessageContent .If you now open Visual Studio (not Visual Studio Code), you can visualize your test message result, as it will be stored in the MessageContent string area.

función personalizada

Con el servicio tabla y Function App en su lugar, los mensajes del dispositivo Ubuntu aparecerán en la tabla IoTMessages .With the Table Service and Function App in place, your Ubuntu device messages will appear in your IoTMessages Table. Si aún no se está ejecutando, vuelva a iniciar el dispositivo y podrá ver los mensajes de resultado desde el dispositivo, y el módulo, dentro de la tabla, mediante el uso de Visual Studio Cloud Explorer.If not already running, start your device again, and you will be able to see the result messages from your device, and module, within your Table, through using Visual Studio Cloud Explorer.

visualizar datos

Capítulo 15: configuración de Power BIChapter 15 - Power BI Setup

Para visualizar los datos del dispositivo IOT, configurará Power BI (versión de escritorio) para recopilar los datos del servicio tabla , que acaba de crear.To visualize the data from your IOT device you will setup Power BI (desktop version), to collect the data from the Table Service, which you just created. La versión de HoloLens de Power BI usará los datos para visualizar el resultado.The HoloLens version of Power BI will then use that data to visualize the result.

  1. Abra el Microsoft Store en Windows 10 y busque Power BI Desktop.Open the Microsoft Store on Windows 10 and search for Power BI Desktop.

    Power BI

  2. Descargue la aplicación.Download the application. Una vez finalizada la descarga, ábrala.Once it has finished downloading, open it.

  3. Inicie sesión en Power BI con su cuenta de Microsoft 365.Log into Power BI with your Microsoft 365 account. Puede que se le redirija a un explorador para suscribirse.You may be redirected to a browser, to sign up. Una vez que se haya registrado, vuelva a la aplicación Power BI e inicie sesión de nuevo.Once you are signed up, go back to the Power BI app, and sign in again.

  4. Haga clic en obtener datos y, a continuación, haga clic en más....Click on Get Data and then click on More....

    Power BI

  5. Haga clic en Azure, Azure Table Storage y, a continuación, haga clic en conectar.Click Azure, Azure Table Storage, then click on Connect.

    Power BI

  6. Se le pedirá que inserte la dirección URL de la tabla que recopiló anteriormente (en el paso 13 del capítulo 11) al crear el servicio tabla.You will be prompted to insert the Table URL that you collected earlier (in step 13 of Chapter 11), while creating your 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 se IoTMessages en este curso).After inserting the URL, delete the portion of the path referring to the Table "sub-folder" (which was IoTMessages, in this course). El resultado final debe ser como se muestra en la imagen siguiente.The final result should be as displayed in the image below. A continuación, haga clic en Aceptar.Then click on OK.

    Power BI

  7. Se le pedirá que inserte la clave de almacenamiento que anotó (en el paso 11 del capítulo 11) antes de crear el Table Storage.You will be prompted to insert the Storage Key that you noted (in step 11 of Chapter 11) earlier while creating your Table Storage. A continuación, haga clic en conectar.Then click on Connect.

    Power BI

  8. Se mostrará un Panel de navegación , marque el cuadro situado junto a la tabla y haga clic en cargar.A Navigator Panel will be displayed, tick the box next to your Table and click on Load.

    Power BI

  9. La tabla ya se ha cargado en Power BI, pero requiere una consulta para mostrar los valores en ella.Your table has now been loaded on Power BI, but it requires a query to display the values in it. Para ello, haga clic con el botón secundario en el nombre de la tabla que se encuentra en el Panel campos , en el lado derecho de la pantalla.To do so, right-click on the table name located in the FIELDS panel at the right side of the screen. A continuación, haga clic en Editar consulta.Then click on Edit Query.

    Power BI

  10. Se abrirá un Editor de Power Query como una nueva ventana que muestra la tabla.A Power Query Editor will open up as a new window, displaying your table. Haga clic en el registro de palabra dentro de la columna contenido de la tabla para visualizar el contenido almacenado.Click on the word Record within the Content column of the table, to visualize your stored content.

    Power BI

  11. Haga clic en en la tabla, en la parte superior izquierda de la ventana.Click on Into Table, at the top-left of the window.

    Power BI

  12. Haga clic en cerrar & aplicar.Click on Close & Apply.

    Power BI

  13. Una vez que haya finalizado la carga de la consulta, en el Panel campos, en el lado derecho de la pantalla, marque las casillas correspondientes al nombre y el valor de los parámetros para visualizar el contenido de la columna MessageContent .Once it has finished loading the query, within the FIELDS panel, on the right side of the screen, tick the boxes corresponding to the parameters Name and Value, to visualize the MessageContent column content.

    Power BI

  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.Click on the blue disk icon at the top left of the window to save your work in a folder of your choice.

    Power BI

  15. Ahora puede hacer clic en el botón publicar para cargar la tabla en el área de trabajo.You can now click on the Publish button to upload your table to your Workspace. Cuando se le solicite, haga clic en mi área de trabajo y haga clic en seleccionar.When prompted, click My workspace and click Select. Espere a que se muestre el resultado correcto del envío.Wait for it to display the successful result of the submission.

    Power BI

    Power BI

Advertencia

El siguiente capítulo es específico de HoloLens.The following Chapter is HoloLens specific. Power BI no está disponible actualmente como aplicación envolvente, pero puede ejecutar la versión de escritorio en el portal de Windows Mixed Reality (también conocido como acantilado House) a través de la aplicación de escritorio.Power BI is not currently available as an immersive application, however you can run the desktop version in the Windows Mixed Reality Portal (aka Cliff House), through the Desktop app.

Capítulo 16: visualización de datos de Power BI en HoloLensChapter 16 - Display Power BI data on HoloLens

  1. En HoloLens, inicie sesión en el Microsoft Store; para ello, puntee en su icono en la lista de aplicaciones.On your HoloLens, log in to the Microsoft Store, by tapping on its icon in the applications list.

    Power BI HL

  2. Busque y, a continuación, descargue la aplicación Power BI .Search and then download the Power BI application.

    Power BI HL

  3. Inicie Power BI desde la lista de aplicaciones.Start Power BI from your applications list.

  4. Power BI podría pedirle que inicie sesión en su cuenta de Microsoft 365.Power BI might ask you to login to your Microsoft 365 account.

  5. Una vez dentro de la aplicación, el área de trabajo se debe mostrar de forma predeterminada, tal como se muestra en la imagen siguiente.Once inside the app, the workspace should display by default as shown in the image below. Si esto no ocurre, simplemente haga clic en el icono del área de trabajo en el lado izquierdo de la ventana.If that does not happen, simply click on the workspace icon on the left side of the window.

    Power BI HL

Su aplicación IoT Hub finalizadaYour finished your IoT Hub application

Enhorabuena, ha creado correctamente un servicio IoT Hub con un dispositivo perimetral de máquina virtual simulado.Congratulations, you have successfully created an IoT Hub Service, with a simulated Virtual Machine Edge device. El dispositivo puede comunicar los resultados de un modelo de machine learning a un servicio tabla de Azure, facilitado por una Function App de Azure, que se lee en Power BI y se visualiza en una de Microsoft HoloLens.Your device can communicate the results of a machine learning model to an Azure Table Service, facilitated by an Azure Function App, which is read into Power BI, and visualized within a Microsoft HoloLens.

Power BI

Ejercicios extraBonus exercises

Ejercicio 1Exercise 1

Expanda la estructura de mensajería almacenada en la tabla y mostrarla como un gráfico.Expand the messaging structure stored in the table and display it as a graph. Es posible que desee recopilar más datos y almacenarlos en la misma tabla para que se muestren más adelante.You might want to collect more data and store it in the same table, to be later displayed.

Ejercicio 2Exercise 2

Cree un módulo de "captura de cámara" adicional para implementarlo en el panel de IoT, de modo que pueda capturar imágenes a través de la cámara para su análisis.Create an additional "camera capture" module to be deployed on the IoT board, so that it can capture images through the camera to be analyzed.