Tutorial: Desarrollo de módulos IoT Edge para dispositivos LinuxTutorial: Develop IoT Edge modules for Linux devices

Use Visual Studio Code para desarrollar e implementar código en dispositivos Linux en que se ejecute IoT Edge.Use Visual Studio Code to develop and deploy code to Linux devices running IoT Edge.

En el inicio rápido, creó un dispositivo IoT Edge mediante una máquina virtual Linux e implementó un módulo desde Azure Marketplace.In the quickstart, you created an IoT Edge device using a Linux virtual machine and deployed a module from the Azure Marketplace. En este tutorial se explica cómo desarrollar e implementar código propio en un dispositivo IoT Edge.This tutorial walks through developing and deploying your own code to an IoT Edge device. Este artículo es un requisito previo útil para los restantes tutoriales, en los que se proporcionarán más detalles acerca de lenguajes de programación o servicios de Azure concretos.This article is a useful prerequisite for the other tutorials, which go into more detail about specific programming languages or Azure services.

En este tutorial se usa el ejemplo de cómo implementar un módulo de C# en un dispositivo Linux.This tutorial uses the example of deploying a C# module to a Linux device. Este ejemplo se ha elegido porque es el escenario de desarrollador más común para las soluciones de IoT Edge.This example was chosen because it's the most common developer scenario for IoT Edge solutions. Incluso si planea usar otro lenguaje o implementar un servicio de Azure, este tutorial sigue siendo útil para aprender sobre los conceptos y las herramientas de desarrollo.Even if you plan on using a different language or deploying an Azure service, this tutorial is still useful to learn about the development tools and concepts. Complete esta introducción al proceso de desarrollo y, después, elija su lenguaje preferido o el servicio de Azure que prefiera para profundizar en los detalles.Complete this introduction to the development process, then choose your preferred language or Azure service to dive into the details.

En este tutorial, aprenderá a:In this tutorial, you learn how to:

  • Configurar una máquina de desarrollo.Set up your development machine.
  • Usar las herramientas de IoT Edge para Visual Studio Code para crear un proyecto.Use the IoT Edge tools for Visual Studio Code to create a new project.
  • Compilar el proyecto como un contenedor y almacenarlo en un registro de contenedor de Azure.Build your project as a container and store it in an Azure container registry.
  • Implementar el código en un dispositivo IoT Edge.Deploy your code to an IoT Edge device.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.If you don't have an Azure subscription, create a free account before you begin.

Conceptos claveKey concepts

En este tutorial se realiza un recorrido por el desarrollo de un módulo IoT Edge.This tutorial walks through the development of an IoT Edge module. Un módulo IoT Edge, o a veces simplemente módulo para abreviar, es un contenedor con código ejecutable.An IoT Edge module, or sometimes just module for short, is a container with executable code. En un dispositivo IoT Edge se pueden implementar uno o varios módulos.You can deploy one or more modules to an IoT Edge device. Los módulos realizan tareas concretas, como la ingesta de datos de sensores, la limpieza y el análisis de datos, o el envío a un centro de IoT.Modules perform specific tasks like ingesting data from sensors, cleaning and analyzing data, or sending messages to an IoT hub. Para más información, consulte Información sobre los módulos Azure IoT Edge.For more information, see Understand Azure IoT Edge modules.

Cuando se desarrollan módulos IoT Edge, es importante conocer la diferencia entre la máquina de desarrollo y el dispositivo IoT Edge de destino en el que finalmente se implementará el módulo.When developing IoT Edge modules, it's important to understand the difference between the development machine and the target IoT Edge device where the module will eventually be deployed. El contenedor que cree para contener el código del módulo debe coincidir con el sistema operativo del dispositivo de destino.The container that you build to hold your module code must match the operating system (OS) of the target device. Por ejemplo, el escenario más común es que alguien desarrolle un módulo en un equipo Windows que pretende tener como destino un dispositivo Linux en el que se ejecuta IoT Edge.For example, the most common scenario is someone developing a module on a Windows computer intending to target a Linux device running IoT Edge. En ese caso, el sistema operativo del contenedor sería Linux.In that case, the container operating system would be Linux. A medida que avance en este tutorial, tenga en cuenta la diferencia entre el sistema operativo de la máquina de desarrollo y el sistema operativo del contenedor.As you go through this tutorial, keep in mind the difference between the development machine OS and the container OS.

Este tutorial va dirigido a dispositivos Linux que ejecutan IoT Edge.This tutorial targets Linux devices running IoT Edge. Puede usar el sistema operativo que prefiera, siempre que dicha máquina ejecute contenedores Linux.You can use your preferred operating system as long as your development machine runs Linux containers. Se recomienda usar Visual Studio Code para desarrollar para dispositivos Linux, así que es lo que se va a usar en este tutorial.We recommend using Visual Studio Code to develop for Linux devices, so that's what this tutorial will use. También se puede usar Visual Studio, aunque hay diferencias en lo relativo a la compatibilidad entre ambas herramientas.You can use Visual Studio as well, although there are differences in support between the two tools.

En la tabla siguiente se enumeran los escenarios de desarrollo compatibles con los contenedores de Linux en Visual Studio Code y Visual Studio.The following table lists the supported development scenarios for Linux containers in Visual Studio Code and Visual Studio.

Visual Studio CodeVisual Studio Code Visual Studio 2017/2019Visual Studio 2017/2019
Arquitectura de dispositivos LinuxLinux device architecture Linux AMD64Linux AMD64
Linux ARM32Linux ARM32
Linux AMD64Linux AMD64
Linux ARM32Linux ARM32
Servicios de AzureAzure services Azure FunctionsAzure Functions
Azure Stream AnalyticsAzure Stream Analytics
Azure Machine LearningAzure Machine Learning
IdiomasLanguages CC
C#C#
JavaJava
Node.jsNode.js
PythonPython
CC
C#C#
Más informaciónMore information Azure IoT Edge para Visual Studio CodeAzure IoT Edge for Visual Studio Code Azure IoT Edge Tools para Visual Studio 2017Azure IoT Edge Tools for Visual Studio 2017
Azure IoT Edge Tools para Visual Studio 2019Azure IoT Edge Tools for Visual Studio 2019

Nota

La compatibilidad con dispositivos ARM64 de Linux está disponible en versión preliminar pública.Support for Linux ARM64 devices is available in public preview. Para más información, consulte Desarrollo y depuración de módulos ARM64 IoT Edge en Visual Studio Code (versión preliminar).For more information, see Develop and debug ARM64 IoT Edge modules in Visual Studio Code (preview).

En este tutorial se enseñan los pasos del desarrollo en Visual Studio Code.This tutorial teaches the development steps for Visual Studio Code. Si prefiere usar Visual Studio, consulte las instrucciones de Uso de Visual Studio 2019 para desarrollar y depurar los módulos Azure IoT Edge.If you would rather use Visual Studio, refer to the instructions in Use Visual Studio 2019 to develop and debug modules for Azure IoT Edge.

PrerrequisitosPrerequisites

Una máquina de desarrollo:A development machine:

  • Puede usar su propio equipo o una máquina virtual, según sus preferencias de desarrollo.You can use your own computer or a virtual machine, depending on your development preferences.
    • Asegúrese de que el equipo de desarrollo admite la virtualización anidada.Make sure that your development machine supports nested virtualization. Esta funcionalidad es necesaria para ejecutar un motor de contenedor, que se instala en la sección siguiente.This capability is necessary for running a container engine, which you install in the next section.
  • La mayor parte de los sistemas operativos que pueden ejecutar un motor de contenedor se pueden usar para desarrollar módulos IoT Edge para dispositivos Linux.Most operating systems that can run a container engine can be used to develop IoT Edge modules for Linux devices. En este tutorial se usa un equipo Windows, pero se indican las diferencias conocidas con macOS o Linux.This tutorial uses a Windows computer, but points out known differences on macOS or Linux.
  • Instale Git para extraer paquetes de plantillas de módulos más adelante.Install Git, to pull module template packages later in this tutorial.
  • Extensión de C# para Visual Studio Code (con tecnología de OmniSharp)C# for Visual Studio Code (powered by OmniSharp) extension.
  • SDK de .NET Core 2.1..NET Core 2.1 SDK.

Un dispositivo Azure IoT Edge en Linux:An Azure IoT Edge device on Linux:

  • Se recomienda no ejecutar IoT Edge en la máquina de desarrollo, sino usar un dispositivo independiente.We recommend that you don't run IoT Edge on your development machine, but instead use a separate device. Esta distinción entre la máquina de desarrollo y el dispositivo IoT Edge refleja con mayor precisión un verdadero escenario de implementación y ayuda a tener claros los distintos conceptos.This distinction between development machine and IoT Edge device more accurately mirrors a true deployment scenario, and helps to keep the different concepts straight.
  • Si no tiene un segundo dispositivo disponible, use el artículo del inicio rápido para crear un dispositivo IoT Edge en Azure con una máquina virtual Linux.If you don't have a second device available, use the quickstart article to create an IoT Edge device in Azure with a Linux virtual machine.

Recursos en la nube:Cloud resources:

  • Una instancia de IoT Hub de nivel estándar o gratis en Azure.A free or standard-tier IoT hub in Azure.

Instalación de un motor de contenedorInstall container engine

Los módulos IoT Edge se empaquetan como contenedores, por lo que necesita un motor de contenedor en la máquina de desarrollo para crear y administrar los contenedores.IoT Edge modules are packaged as containers, so you need a container engine on your development machine to build and manage them. Se recomienda Docker Desktop para el desarrollo debido a su popularidad y la compatibilidad de las características.We recommend Docker Desktop for development because of its feature support and popularity. Docker Desktop en Windows permite cambiar entre contenedores Linux y Windows para poder desarrollar fácilmente módulos para los distintos tipos de dispositivos IoT Edge.Docker Desktop on Windows lets you switch between Linux containers and Windows containers so that you can easily develop modules for different types of IoT Edge devices.

Use la documentación de Docker para realizar la instalación en la máquina de desarrollo:Use the Docker documentation to install on your development machine:

Configuración de VS Code y de herramientasSet up VS Code and tools

Use las extensiones de IoT para Visual Studio Code para desarrollar módulos IoT Edge.Use the IoT extensions for Visual Studio Code to develop IoT Edge modules. Estas extensiones proporcionan plantillas de proyecto, automatizan la creación del manifiesto de implementación y permiten supervisar y administrar dispositivos IoT Edge.These extensions provide project templates, automate the creation of the deployment manifest, and allow you to monitor and manage IoT Edge devices. En esta sección, se instalan Visual Studio Code y la extensión de IoT y luego se configurar una cuenta de Azure para administrar recursos de IoT Hub desde dentro de Visual Studio Code.In this section, you install Visual Studio Code and the IoT extension, then set up your Azure account to manage IoT Hub resources from within Visual Studio Code.

  1. Instale Visual Studio Code en la máquina de desarrollo.Install Visual Studio Code on your development machine.

  2. Una vez que finalice la instalación, seleccione Ver > Extensiones.Once the installation is finished, select View > Extensions.

  3. Busque Azure IoT Tools, que es realmente una colección de extensiones que le ayudan a interactuar con dispositivos IoT e IoT Hub, así como desarrollar módulos IoT Edge.Search for Azure IoT Tools, which is actually a collection of extensions that help you interact with IoT Hub and IoT devices, as well as developing IoT Edge modules.

  4. Seleccione Instalar.Select Install. Cada extensión incluida se instala individualmente.Each included extension installs individually.

  5. Cuando las extensiones se realizan mediante la instalación, abra la paleta de comandos, para lo que debe seleccionar Ver > Paleta de comandos.When the extensions are done installing, open the command palette by selecting View > Command Palette.

  6. En la paleta de comandos, busque y seleccione Azure: Iniciar sesión.In the command palette, search for and select Azure: Sign in. Siga las indicaciones para iniciar sesión en su cuenta de Azure.Follow the prompts to sign in to your Azure account.

  7. En la paleta de comandos, busque y seleccione Azure IoT Hub: Select IoT Hub (Azure IoT Hub: seleccione IoT Hub).In the command palette again, search for and select Azure IoT Hub: Select IoT Hub. Siga las instrucciones para seleccionar una suscripción de Azure y un centro de IoT.Follow the prompts to select your Azure subscription and IoT hub.

  8. Abra la sección del explorador de Visual Studio Code, para lo que puede seleccionar el icono pertinente en la barra de actividad de la izquierda, o bien seleccionar Ver > Explorador.Open the explorer section of Visual Studio Code by either selecting the icon in the activity bar on the left, or by selecting View > Explorer.

  9. En la parte inferior de dicha sección, expanda el menú Azure IoT Hub / Devices (Azure IoT Hub/Dispositivos).At the bottom of the explorer section, expand the collapsed Azure IoT Hub / Devices menu. Debería ver los dispositivos y los dispositivos IoT Edge asociados con el centro de IoT que seleccionó en la paleta de comandos.You should see the devices and IoT Edge devices associated with the IoT hub that you selected through the command palette.

    Visualización de los dispositivos de un centro de IoT

Creación de un Registro de contenedorCreate a container registry

En este tutorial se usa la extensión de Azure IoT Tools para fin de compilar un módulo y crear una imagen de contenedor a partir de los archivos.In this tutorial, you use the Azure IoT Tools extension to build a module and create a container image from the files. Después, insertará esta imagen en un Registro donde se almacenan y administran las imágenes.Then you push this image to a registry that stores and manages your images. Por último, implementará la imagen en el Registro para que se ejecute en el dispositivo IoT Edge.Finally, you deploy your image from your registry to run on your IoT Edge device.

Puede usar cualquier registro compatible con Docker para almacenar las imágenes de contenedor.You can use any Docker-compatible registry to hold your container images. Dos de los servicios de registro de Docker más conocidos son Azure Container Registry y Docker Hub.Two popular Docker registry services are Azure Container Registry and Docker Hub. En este tutorial, utilizaremos Azure Container Registry.This tutorial uses Azure Container Registry.

Si no dispone de un registro de contenedores, siga estos pasos para crear uno nuevo en Azure:If you don't already have a container registry, follow these steps to create a new one in Azure:

  1. En Azure Portal, seleccione Crear un recurso > Contenedores > Container Registry.In the Azure portal, select Create a resource > Containers > Container Registry.

  2. Especifique los siguientes valores para crear un registro de contenedor:Provide the following values to create your container registry:

    CampoField ValueValue
    SuscripciónSubscription Seleccione una suscripción en la lista desplegable.Select a subscription from the drop-down list.
    Resource groupResource group Se recomienda usar el mismo grupo de recursos para todos los recursos de prueba que se crean en las guías de inicio rápido y los tutoriales de IoT Edge.We recommend that you use the same resource group for all of the test resources that you create during the IoT Edge quickstarts and tutorials. Por ejemplo, IoTEdgeResources.For example, IoTEdgeResources.
    Nombre de registroRegistry name Especifique un nombre único.Provide a unique name.
    LocationLocation Elija una ubicación cercana a usted.Choose a location close to you.
    SKUSKU Seleccione Básica.Select Basic.
  3. Seleccione Crear.Select Create.

  4. Una vez creado el registro de contenedor, vaya a él y, en el panel izquierdo, seleccione Claves de acceso en el menú que se encuentra en Configuración.After your container registry is created, browse to it, and from the left pane select Access keys from the menu located under Settings.

  5. Haga clic para permitir que el usuario administrador pueda ver el nombre de usuario y la contraseña del registro de contenedor.Click to Enable Admin user to view the Username and Password for your container registry.

  6. Copie los valores de Servidor de inicio de sesión, Nombre de usuario y Contraseña, y guárdelos en cualquier lugar que le resulte práctico.Copy the values for Login server, Username, and Password and save them somewhere convenient. Dichos valores se usan en todo el tutorial para proporcionar acceso al registro de contenedor.You use these values throughout this tutorial to provide access to the container registry.

    Copiar el servidor de inicio de sesión, nombre de usuario y contraseña del registro de contenedor

Creación de un nuevo proyecto de móduloCreate a new module project

La extensión Azure IoT Tools proporciona plantillas de proyecto para todos los lenguajes del módulo IoT Edge admitidos que haya en Visual Studio Code.The Azure IoT Tools extension provides project templates for all supported IoT Edge module languages in Visual Studio Code. Estas plantillas tienen todos los archivos y el código que se necesita para implementar un módulo de trabajo y probar IoT Edge o le proporcionan a un punto de partida para personalizar la plantilla con su propia lógica de negocios.These templates have all the files and code that you need to deploy a working module to test IoT Edge, or give you a starting point to customize the template with your own business logic.

En este tutorial, usamos la plantilla del módulo de C# porque es la plantilla que se usa con más frecuencia.For this tutorial, we use the C# module template because it is the most commonly used template.

Creación de una plantilla de proyectoCreate a project template

En la paleta de comandos de Visual Studio Code, busque y seleccione Azure IoT Edge: New IoT Edge solution (Nueva solución de IoT Edge).In the Visual Studio Code command palette, search for and select Azure IoT Edge: New IoT Edge Solution. Siga las instrucciones y use los siguientes valores para crear la solución:Follow the prompts and use the following values to create your solution:

CampoField ValueValue
Seleccionar carpetaSelect folder Elija la ubicación en el equipo de desarrollo en la que VS Code creará los archivos de la solución.Choose the location on your development machine for VS Code to create the solution files.
Proporcionar un nombre de la soluciónProvide a solution name Escriba un nombre descriptivo para la solución o acepte el valor predeterminado EdgeSolution.Enter a descriptive name for your solution or accept the default EdgeSolution.
Seleccionar plantilla del móduloSelect module template Elija Módulo C# .Choose C# Module.
Proporcionar un nombre de móduloProvide a module name Acepte el valor predeterminado, SampleModule.Accept the default SampleModule.
Proporcionar repositorio de imágenes de Docker del móduloProvide Docker image repository for the module Un repositorio de imágenes incluye el nombre del registro de contenedor y el nombre de la imagen de contenedor.An image repository includes the name of your container registry and the name of your container image. La imagen de contenedor se rellena previamente con el nombre que proporcionó en el último paso.Your container image is prepopulated from the name you provided in the last step. Reemplace localhost:5000 por el valor de Servidor de inicio de sesión del registro de contenedor de Azure.Replace localhost:5000 with the Login server value from your Azure container registry. Puede recuperar el valor de Servidor de inicio de sesión de la página Información general del registro de contenedor en Azure Portal.You can retrieve the Login server value from the Overview page of your container registry in the Azure portal.

El repositorio de imágenes final es similar a <registry name>.azurecr.io/samplemodule.The final image repository looks like <registry name>.azurecr.io/samplemodule.

Especificación del repositorio de imágenes de Docker

Cuando la nueva solución se cargue en la ventana de Visual Studio Code, dedique unos minutos a familiarizarse con los archivos que ha creado:Once your new solution loads in the Visual Studio Code window, take a moment to familiarize yourself with the files that it created:

  • La carpeta .vscode contiene un archivo denominado launch.json, que se usa para la depuración de módulos.The .vscode folder contains a file called launch.json, which is used for debugging modules.

  • La carpeta modules contiene una carpeta para cada módulo de la solución.The modules folder contains a folder for each module in your solution. En este momento, solo debería ser SampleModule, o el nombre que haya dado al módulo.Right now, that should only be SampleModule, or whatever name you gave to the module. La carpeta SampleModule contiene el código de programa principal, los metadatos del módulo y varios archivos de Docker.The SampleModule folder contains the main program code, the module metadata, and several Docker files.

  • El archivo .env almacena las credenciales en el registro de contenedor.The .env file holds the credentials to your container registry. Estas credenciales se comparten con el dispositivo IoT Edge para que tenga acceso para extraer las imágenes de contenedor.These credentials are shared with your IoT Edge device so that it has access to pull the container images.

  • Tanto el archivo deployment.debug.template.json como el archivo deployment.template.json son plantillas que le ayudan a crear un manifiesto de implementación.The deployment.debug.template.json file and deployment.template.json file are templates that help you create a deployment manifest. Un manifiesto de implementación es un archivo que define exactamente qué módulos se desean implementar en un dispositivo, cómo se deben configurar y cómo se pueden comunicar tanto entre sí como con la nube.A deployment manifest is a file that defines exactly which modules you want deployed on a device, how they should be configured, and how they can communicate with each other and the cloud. Los archivos de la plantilla utilizan punteros para algunos valores.The template files use pointers for some values. Cuando la plantilla se transforma en un verdadero manifiesto de implementación, los punteros se reemplazan por valores que se han tomado de otros archivos de solución.When you transform the template into a true deployment manifest, the pointers are replaced with values taken from other solution files. Busque los dos marcadores de posición comunes en la plantilla de implementación:Locate the two common placeholders in your deployment template:

    • En la sección de credenciales del registro, la dirección se rellena automáticamente a partir de la información que proporcionó al crear la solución.In the registry credentials section, the address is autofilled from the information you provided when you created the solution. Sin embargo, el nombre de usuario y la contraseña hacen referencia a las variables almacenadas en el archivo .env.However, the username and password reference the variables stored in the .env file. Esta configuración es por motivos de seguridad, ya que Git ignora el archivo .env, pero no sucede lo mismo con la plantilla de implementación.This configuration is for security, as the .env file is git ignored, but the deployment template is not.
    • En la sección SampleModule, la imagen de contenedor no se rellena, aunque haya especificado el repositorio de imágenes al crear la solución.In the SampleModule section, the container image isn't filled in even though you provided the image repository when you created the solution. Este marcador de posición apunta al archivo module.json de la carpeta SampleModule.This placeholder points to the module.json file inside the SampleModule folder. Si va a dicho archivo, verá que el campo de imagen contiene el repositorio, sino también un valor de etiqueta, que se compone de la versión y la plataforma del contenedor.If you go to that file, you'll see that the image field does contain the repository, but also a tag value that is made up of the version and the platform of the container. La versión se puede iterar manualmente como parte del ciclo de desarrollo y se puede seleccionar la plataforma de contenedor mediante un modificador que se presentará en esta misma sección más adelante.You can iterate the version manually as part of your development cycle, and you select the container platform using a switcher that we introduce later in this section.

Especificación de la credenciales del registro para el agente de IoT EdgeProvide your registry credentials to the IoT Edge agent

El archivo del entorno almacena las credenciales del registro de contenedor y las comparte con el runtime de IoT Edge.The environment file stores the credentials for your container registry and shares them with the IoT Edge runtime. El entorno de ejecución necesita estas credenciales para extraer las imágenes de contenedor e insertarlas en el dispositivo IoT Edge.The runtime needs these credentials to pull your container images onto the IoT Edge device.

Nota

Si no ha reemplazado el valor localhost:5000 por el valor del servidor de inicio de sesión de Azure Container Registry, en el paso Creación de una plantilla de proyecto, el archivo .env y la sección registryCredentials del manifiesto de implementación no estarán disponibles.If you didn't replace the localhost:5000 value with the login server value from your Azure container registry, in the Create a project template step, the .env file and the registryCredentials section of the deployment manifest will be missing.

La extensión de IoT Edge intenta extraer de Azure las credenciales del registro del contenedor y rellenar con ellas el archivo de entorno.The IoT Edge extension tries to pull your container registry credentials from Azure and populate them in the environment file. Compruebe si las credenciales ya están incluidas.Check to see if your credentials are already included. Si no lo están, agréguelas ahora:If not, add them now:

  1. Abra el archivo .env en la solución del módulo.Open the .env file in your module solution.
  2. Agregue los valores de nombre de usuario y contraseña que ha copiado del registro de contenedor de Azure.Add the username and password values that you copied from your Azure container registry.
  3. Guarde los cambios en el archivo .env.Save your changes to the .env file.

Selección de la arquitectura de destinoSelect your target architecture

Actualmente, Visual Studio Code puede desarrollar módulos de C# para dispositivos Linux AMD64 y ARM32v7.Currently, Visual Studio Code can develop C# modules for Linux AMD64 and ARM32v7 devices. Debe seleccionar qué arquitectura tiene como destino con cada solución, ya que ello afecta a la forma en que se crea y ejecuta el contenedor.You need to select which architecture you're targeting with each solution, because that affects how the container is built and runs. La opción predeterminada es Linux AMD64.The default is Linux AMD64.

  1. Abra la paleta de comandos y busque Azure IoT Edge: Set Default Target Platform for Edge Solution (Establecer la plataforma de destino predeterminada para la solución perimetral), o bien seleccione el icono de acceso directo en la barra lateral en la parte inferior de la ventana.Open the command palette and search for Azure IoT Edge: Set Default Target Platform for Edge Solution, or select the shortcut icon in the side bar at the bottom of the window.

    Seleccionar el icono de la arquitectura en la barra lateral

  2. En la paleta de comandos, seleccione la arquitectura de destino en la lista de opciones.In the command palette, select the target architecture from the list of options. Para este tutorial, usamos una máquina virtual Ubuntu como dispositivo IoT Edge, por lo que mantendrá el valor predeterminado amd64.For this tutorial, we're using an Ubuntu virtual machine as the IoT Edge device, so will keep the default amd64.

Revisión del código de ejemploReview the sample code

La plantilla de solución que ha creado incluye código de ejemplo de un módulo IoT Edge.The solution template that you created includes sample code for an IoT Edge module. Dicho módulo simplemente recibe los mensajes y, después, los pasa.This sample module simply receives messages and then passes them on. La funcionalidad de canalización muestra un concepto importante de IoT Edge, cómo se comunican los módulos entre sí.The pipeline functionality demonstrates an important concept in IoT Edge, which is how modules communicate with each other.

Cada módulo puede tener varias colas de entrada y salida declaran en su código.Each module can have multiple input and output queues declared in their code. El centro de IoT Edge que se ejecuta en el dispositivo enruta los mensajes de la salida de un módulo en la entrada de uno o varios módulos.The IoT Edge hub running on the device routes messages from the output of one module into the input of one or more modules. El código específico para declarar las entradas y salidas varía de un lenguaje a otro, pero el concepto es el mismo en todos los módulos.The specific code for declaring inputs and outputs varies between languages, but the concept is the same across all modules. Para más información acerca del enrutamiento entre módulos, consulte Declaración de rutas.For more information about routing between modules, see Declare routes.

El código de C# de ejemplo que acompaña a la plantilla del proyecto usa la clase ModuleClient del SDK de IoT Hub para .NET.The sample C# code that comes with the project template uses the ModuleClient Class from the IoT Hub SDK for .NET.

  1. Abra el archivo Program.cs, que está dentro de la carpeta modules/SampleModule/ .Open the Program.cs file, which is inside the modules/SampleModule/ folder.

  2. En program.cs, busque el método SetInputMessageHandlerAsync.In program.cs, find the SetInputMessageHandlerAsync method.

  3. El método SetInputMessageHandlerAsync configura una cola de entrada para recibir los mensajes entrantes.The SetInputMessageHandlerAsync method sets up an input queue to receive incoming messages. Revise este método y vea cómo inicializa una cola de entrada llamada input1.Review this method and see how it initializes an input queue called input1.

    Buscar el nombre de entrada en el constructor de SetInputMessageCallback

  4. Luego, busque el método SendEventAsync.Next, find the SendEventAsync method.

  5. El método SendEventAsync procesa los mensajes recibidos y configura una cola de salida para difundirlos.The SendEventAsync method processes received messages and sets up an output queue to pass them along. Revise dicho método y verá que inicializa una cola de salida llamada output1.Review this method and see that it initializes an output queue called output1.

    Buscar el nombre de salida en SendEventToOutputAsync

  6. Abra el archivo deployment.template.json.Open the deployment.template.json file.

  7. Busque la propiedad modules de las propiedades deseadas de $edgeAgent.Find the modules property of the $edgeAgent desired properties.

    Debería haber dos módulos.There should be two modules listed here. Uno es el módulo SimulatedTemperatureSensor, que se incluye en todas las plantillas de forma predeterminada para proporcionar datos de temperatura simulados que se pueden usar para probar los módulos.One is the SimulatedTemperatureSensor module, which is included in all the templates by default to provide simulated temperature data that you can use to test your modules. El otro es el módulo SampleModule que creó como parte de esta solución.The other is the SampleModule module that you created as part of this solution.

  8. En la parte inferior del archivo, busque las propiedades deseadas del módulo $edgeHub.At the bottom of the file, find the desired properties for the $edgeHub module.

    Una de las funciones del módulo del centro de IoT Edge es enrutar mensajes entre todos los módulos de una implementación.One of the functions of the IoT Edge hub module is to route messages between all the modules in a deployment. Revise los valores de la propiedad routes.Review the values in the routes property. Una ruta, SampleModuleToIoTHub, usa un carácter comodín ( * ) para indicar cualquier mensaje que proceda de cualquier cola de salida del módulo SampleModule.One route, SampleModuleToIoTHub, uses a wildcard character (*) to indicate any messages coming from any output queues in the SampleModule module. Dichos mensajes van a $upstream, que es un nombre reservado que indica IoT Hub.These messages go into $upstream, which is a reserved name that indicates IoT Hub. La otra ruta, sensorToSampleModule, toma los mensajes que proceden del módulo SimulatedTemperatureSensor y los enruta a la cola de entrada input1, que ha visto que se inicializaba en el código de SampleModule.The other route, sensorToSampleModule, takes messages coming from the SimulatedTemperatureSensor module and routes them to the input1 input queue that you saw initialized in the SampleModule code.

    Revisar las rutas de deployment.template.json

Compilación e inserción de la soluciónBuild and push your solution

Ha revisado el código del módulo y la plantilla de implementación para conocer algunos conceptos clave de la implementación.You've reviewed the module code and the deployment template to understand some key deployment concepts. Ya está listo para que compilar la imagen de contenedor SampleModule e insertarla en el registro de contenedor.Now, you're ready to build the SampleModule container image and push it to your container registry. Con la extensión de las herramientas de IoT para Visual Studio Code, este paso también genera el manifiesto de implementación en función de la información del archivo de plantilla y la información del módulo a partir de los archivos de la solución.With the IoT tools extension for Visual Studio Code, this step also generates the deployment manifest based on the information in the template file and the module information from the solution files.

Inicio de sesión en DockerSign in to Docker

Especifique las credenciales del registro de contenedor a Docker para que puede insertar la imagen de contenedor para que se almacene en el registro.Provide your container registry credentials to Docker so that it can push your container image to be stored in the registry.

  1. Abra el terminal integrado de Visual Studio Code, para lo que debe seleccionar Ver > Terminal.Open the Visual Studio Code integrated terminal by selecting View > Terminal.

  2. Inicie sesión en Docker con las credenciales del registro de contenedor de Azure que guardó después de crear el registro.Sign in to Docker with the Azure Container registry credentials that you saved after creating the registry.

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    Puede recibir una advertencia de seguridad en la que se recomiende el uso de --password-stdin.You may receive a security warning recommending the use of --password-stdin. Aunque ese procedimiento se recomienda para escenarios de producción, está fuera del ámbito de este tutorial.While that best practice is recommended for production scenarios, it's outside the scope of this tutorial. Para más información, consulte la referencia de docker login.For more information, see the docker login reference.

  3. Inicio de sesión en Azure Container RegistryLog in to Azure Container Registry

    az acr login -n <ACR registry name>
    

Compilación e inserciónBuild and push

Visual Studio Code ahora tiene acceso a su registro de contenedor, por lo que es el momento de convertir el código de la solución en una imagen de contenedor.Visual Studio Code now has access to your container registry, so it's time to turn the solution code into a container image.

  1. En el explorador de Visual Studio Code, haga clic con el botón derecho en el archivo deployment.template.json y seleccione Build and Push IoT Edge solution (Compilar e insertar solución IoT Edge).In the Visual Studio Code explorer, right-click the deployment.template.json file and select Build and Push IoT Edge Solution.

    Compilación e inserción de módulos IoT Edge

    El comando de compilación e inserción inicia tres operaciones.The build and push command starts three operations. En primer lugar, se crea una nueva carpeta en la solución denominada config que contiene los archivos del manifiesto de la implementación completa, con la información de la plantilla de implementación y otros archivos de la solución.First, it creates a new folder in the solution called config that holds the full deployment manifest, built out of information in the deployment template and other solution files. En segundo lugar, ejecuta docker build para generar la imagen de contenedor basándose en el Dockerfile adecuado para la arquitectura de destino.Second, it runs docker build to build the container image based on the appropriate dockerfile for your target architecture. A continuación, ejecuta docker push para insertar el repositorio de imágenes en el registro de contenedor.Then, it runs docker push to push the image repository to your container registry.

    Este proceso puede tardar varios minutos la primera vez, pero es más rápido la próxima vez que ejecute los comandos.This process may take several minutes the first time, but is faster the next time that you run the commands.

  2. Abra el archivo deployment.amd64.json en la carpeta de configuración recién creada.Open the deployment.amd64.json file in newly created config folder. El nombre de archivo refleja la arquitectura de destino, por lo que será diferente si ha elegido una otra arquitectura.The filename reflects the target architecture, so it will be different if you chose a different architecture.

  3. Tenga en cuenta que los dos parámetros que tenían marcadores de posición ahora están rellenos con los valores adecuados.Notice that the two parameters that had placeholders now are filled in with their proper values. La sección registryCredentials tiene el nombre de usuario y la contraseña del registro que se extrajeron del archivo .env.The registryCredentials section has your registry username and password pulled from the .env file. SampleModule tiene el repositorio de imágenes completo con el nombre, la versión y la etiqueta de arquitectura del archivo module.json.The SampleModule has the full image repository with the name, version, and architecture tag from the module.json file.

  4. Abra el archivo module.json de la carpeta SampleModule.Open the module.json file in the SampleModule folder.

  5. Cambie el número de versión de la imagen del módulo.Change the version number for the module image. (la versión, no la versión $schema). Por ejemplo, incremente el número de versión de la revisión a 0.0.2 como si hubiéramos hecho una pequeña corrección en el código del módulo.(The version, not the $schema-version.) For example, increment the patch version number to 0.0.2 as though we had made a small fix in the module code.

    Sugerencia

    Las versiones de los módulos permiten el control de versiones y le permiten probar los cambios en un pequeño conjunto de dispositivos antes de implementar actualizaciones en la producción.Module versions enable version control, and allow you to test changes on a small set of devices before deploying updates to production. Si no incrementa la versión del módulo antes de la compilación e inserción, entonces sobrescribirá el repositorio en el registro de contenedor.If you don't increment the module version before building and pushing, then you overwrite the repository in your container registry.

  6. Guarde los cambios en el archivo module.json.Save your changes to the module.json file.

  7. Vuelva a hacer clic con el botón derecho en el archivo deployment.template.json y seleccione Build and Push IoT Edge solution (Compilar e insertar solución IoT Edge) de nuevo.Right-click the deployment.template.json file again, and again select Build and Push IoT Edge Solution.

  8. Vuelva a abrir el archivo deployment.amd64.json de nuevo.Open the deployment.amd64.json file again. Observe que no se creó un nuevo archivo cuando ejecutó el comando de compilación e inserción de nuevo.Notice that a new file wasn't created when you ran the build and push command again. Más bien, el mismo archivo se actualizó para reflejar los cambios.Rather, the same file was updated to reflect the changes. La imagen de SampleModule ahora apunta a la versión 0.0.2 del contenedor.The SampleModule image now points to the 0.0.2 version of the container.

  9. Para comprobar mejor lo que hizo el comando de compilación e inserción, vaya a Azure Portal y navegue al registro de contenedor.To further verify what the build and push command did, go to the Azure portal and navigate to your container registry.

  10. En el registro de contenedor, seleccione Repositorios y después samplemodule.In your container registry, select Repositories then samplemodule. Compruebe que ambas versiones de la imagen se hayan insertado en el registro.Verify that both versions of the image were pushed to the registry.

    Visualización de ambas versiones de la imagen en el registro de contenedor

Solución de problemasTroubleshoot

Si encuentra errores al compilar e insertar la imagen del módulo, a menudo tiene que ver con la configuración de Docker en la máquina de desarrollo.If you encounter errors when building and pushing your module image, it often has to do with Docker configuration on your development machine. Utilice las siguientes comprobaciones para revisar la configuración:Use the following checks to review your configuration:

  • ¿Ha ejecutado el comando docker login mediante las credenciales que copió del registro de contenedor?Did you run the docker login command using the credentials that you copied from your container registry? Estas credenciales son diferentes a las que se utilizan para iniciar sesión en Azure.These credentials are different than the ones that you use to sign in to Azure.
  • ¿Es el repositorio de contenedor correcto?Is your container repository correct? ¿Tiene el nombre correcto del registro de contenedor y el nombre correcto del módulo?Does it have your correct container registry name and your correct module name? Abra el archivo module.json de la carpeta SampleModule para comprobarlo.Open the module.json file in the SampleModule folder to check. El valor del repositorio debería ser similar a <registry name>.azurecr.io/samplemodule.The repository value should look like <registry name>.azurecr.io/samplemodule.
  • Si utilizó un nombre diferente a SampleModule para el módulo, ¿es coherente ese nombre en toda la solución?If you used a different name than SampleModule for your module, is that name consistent throughout the solution?
  • ¿La máquina funciona con el mismo tipo de contenedores que está creando?Is your machine running the same type of containers that you're building? Este tutorial es para dispositivos IoT Edge de Linux, por lo que Visual Studio Code debería indicar amd64 o arm32v7 en la barra lateral y Docker Desktop debe ejecutar contenedores Linux.This tutorial is for Linux IoT Edge devices, so Visual Studio Code should say amd64 or arm32v7 in the side bar, and Docker Desktop should be running Linux containers.

Implementación de módulos en el dispositivoDeploy modules to device

Ha verificado que las imágenes de contenedor creadas se almacenan en el registro de contenedor, por lo que es el momento de implementarlas en un dispositivo.You verified that the built container images are stored in your container registry, so it's time to deploy them to a device. Asegúrese de que el dispositivo IoT Edge está en funcionamiento.Make sure that your IoT Edge device is up and running.

  1. En el explorador de Visual Studio Code, en la sección Azure IoT Hub, expanda Dispositivos para ver la lista de dispositivos IoT.In the Visual Studio Code explorer, under the Azure IoT Hub section, expand Devices to see your list of IoT devices.

  2. Haga clic con el dispositivo IoT Edge que desea implementar y seleccione Create Deployment for IoT Edge device (Crear una implementación para un dispositivo individual).Right-click the IoT Edge device that you want to deploy to, then select Create Deployment for Single Device.

    Crear una implementación para un dispositivo individual

  3. En el Explorador de archivos, vaya a la carpeta config y seleccione el archivo deployment.amd64.json.In the file explorer, navigate into the config folder then select the deployment.amd64.json file.

    No utilice el archivo deployment.template.json, que no contiene todos las credenciales del registro de contenedor o los valores de imagen del módulo.Do not use the deployment.template.json file, which doesn't have the container registry credentials or module image values in it. Si el destino es un dispositivo ARM32 con Linux, el manifiesto de implementación se denominará deployment.arm32v7.json.If you're targeting a Linux ARM32 device, the deployment manifest will be named deployment.arm32v7.json.

  4. En el dispositivo, expanda Módulos para ver una lista de módulos implementados y en ejecución.Under your device, expand Modules to see a list of deployed and running modules. Haga clic en el botón Actualizar.Click the refresh button. Debería ver que los nuevos módulos SimulatedTemperatureSensor y SampleModule se ejecutan en el dispositivo.You should see the new SimulatedTemperatureSensor and SampleModule modules running on your device.

    Los módulos pueden tardar unos minutos en iniciarse.It may take a few minutes for the modules to start. El entorno de ejecución de Azure IoT Edge necesita recibir su nuevo manifiesto de implementación, extraer las imágenes de los módulos del entorno de ejecución del contenedor y, después, iniciar cada nuevo módulo.The IoT Edge runtime needs to receive its new deployment manifest, pull down the module images from the container runtime, then start each new module.

    Visualización de los módulos que se ejecutan en el dispositivo IoT Edge

Visualización de los mensajes desde el dispositivoView messages from device

El código SampleModule recibe mensajes mediante la cola de entrada y los pasa por la cola de salida.The SampleModule code receives messages through its input queue and passes them along through its output queue. El manifiesto de implementación declaraba las rutas que pasaban a SampleModule los mensajes de SimulatedTemperatureSensor, y luego reenviaba los mensajes de SampleModule a la instancia de IoT Hub.The deployment manifest declared routes that passed messages to SampleModule from SimulatedTemperatureSensor, and then forwarded messages from SampleModule to IoT Hub. Las herramientas de Azure IoT para Visual Studio Code permiten ver los mensajes que llegan a IoT Hub desde dispositivos individuales.The Azure IoT tools for Visual Studio Code allow you to see messages as they arrive at IoT Hub from your individual devices.

  1. En el explorador de Visual Studio Code, haga clic con el botón derecho en el dispositivo IoT Edge que desea supervisar y seleccione Start Monitoring Built-in Event Endpoint (Iniciar supervisión del punto de conexión del evento integrado).In the Visual Studio Code explorer, right-click the IoT Edge device that you want to monitor, then select Start Monitoring Built-in Event Endpoint.

  2. En la ventana de salida podrá ver si llegan mensajes al centro de IoT.Watch the output window in Visual Studio Code to see messages arriving at your IoT hub.

    Visualización de los mensajes entrantes del dispositivo a la nube

Visualización de los cambios en el dispositivoView changes on device

Si desea ver lo que está ocurriendo en su propio dispositivo, utilice los comandos de esta sección para inspeccionar el entorno de ejecución de Azure IoT Edge y los módulos que se ejecutan en el dispositivo.If you want to see what's happening on your device itself, use the commands in this section to inspect the IoT Edge runtime and modules running on your device.

Los comandos de esta sección son para el dispositivo IoT Edge, no en la máquina de desarrollo.The commands in this section are for your IoT Edge device, not your development machine. Si usa una máquina virtual para el dispositivo IoT Edge, conéctese a ella ahora.If you're using a virtual machine for your IoT Edge device, connect to it now. En Azure, vaya a la página de información general de la máquina virtual y seleccione Conectar para acceder a la conexión de Secure Shell.In Azure, go to the virtual machine's overview page and select Connect to access the secure shell connection.

  • Vea todos los módulos implementados en el dispositivo y compruebe su estado:View all modules deployed to your device, and check their status:

    iotedge list
    

    Debería ver cuatro módulos: los dos módulos personalizados del entorno de ejecución de IoT Edge, SimulatedTemperatureSensor y SampleModule.You should see four modules: the two IoT Edge runtime modules, SimulatedTemperatureSensor, and SampleModule. Los cuatro deben aparecer como en ejecución.All four should be listed as running.

  • Inspeccione los registros para un módulo específico:Inspect the logs for a specific module:

    iotedge logs <module name>
    

    Los módulos IoT Edge distinguen mayúsculas de minúsculas.IoT Edge modules are case-sensitive.

    Los registros de SimulatedTemperatureSensor y SampleModule deben mostrar los mensajes que están procesando.The SimulatedTemperatureSensor and SampleModule logs should show the messages they're processing. El módulo edgeAgent es responsable de iniciar los otros módulos, por lo que sus registros tendrá información sobre cómo implementar el manifiesto de implementación.The edgeAgent module is responsible for starting the other modules, so its logs will have information about implementing the deployment manifest. Si algún módulo no aparece en la lista o no se está ejecutando, es probable que los registros de edgeAgent contengan los errores.If any module isn't listed or isn't running, the edgeAgent logs will probably have the errors. El módulo edgeHub es responsable de las comunicaciones entre los módulos e IoT Hub.The edgeHub module is responsible for communications between the modules and IoT Hub. Si los módulos están en funcionamiento, pero los mensajes no llegan al centro de IoT, los registros de edgeHub probablemente contendrán los errores.If the modules are up and running, but the messages aren't arriving at your IoT hub, the edgeHub logs will probably have the errors.

Limpieza de recursosClean up resources

Si prevé seguir con el siguiente artículo recomendado, puede mantener los recursos y las configuraciones que ya ha creado y volverlos a utilizar.If you plan to continue to the next recommended article, you can keep the resources and configurations that you created and reuse them. También puede seguir usando el mismo dispositivo de IoT Edge como dispositivo de prueba.You can also keep using the same IoT Edge device as a test device.

En caso contrario, para evitar gastos, puede eliminar las configuraciones locales y los recursos de Azure que creó en este artículo.Otherwise, you can delete the local configurations and the Azure resources that you used in this article to avoid charges.

Eliminación de recursos de AzureDelete Azure resources

La eliminación de los recursos de Azure y de los grupos de recursos es un proceso irreversible.Deleting Azure resources and resource groups is irreversible. Asegúrese de no eliminar por accidente el grupo de recursos o los recursos equivocados.Make sure that you don't accidentally delete the wrong resource group or resources. Si ha creado el centro de IoT en un grupo de recursos ya existente que tiene recursos que desea conservar, elimine solo el recurso del centro de IoT en sí en lugar de eliminar todo el grupo de recursos.If you created the IoT hub inside an existing resource group that has resources that you want to keep, delete only the IoT hub resource itself, instead of deleting the resource group.

Para eliminar los recursos:To delete the resources:

  1. Inicie sesión en Azure Portal y después seleccione Grupos de recursos.Sign in to the Azure portal and select Resource groups.

  2. Seleccione el nombre del grupo de recursos que contiene los recursos de prueba de IoT Edge.Select the name of the resource group that contains your IoT Edge test resources.

  3. Revise la lista de los recursos contenidos en el grupo de recursos.Review the list of resources contained in your resource group. Si desea eliminar todos ellos, puede seleccionar Eliminar grupo de recursos.If you want to delete all of them, you can select Delete resource group. Si desea eliminar solo algunos de ellos, puede hacer clic en cada recurso para eliminarlos individualmente.If you want to delete only some of them, you can click into each resource to delete them individually.

Pasos siguientesNext steps

En este tutorial, ha configurado Visual Studio Code en la máquina de desarrollo y ha implementado el primer módulo IoT Edge desde él.In this tutorial, you set up Visual Studio Code on your development machine and deployed your first IoT Edge module from it. Ahora que conoce los conceptos básicos, intente agregar funcionalidad a un módulo para que pueda analizar los datos que pasan por él.Now that you know the basic concepts, try adding functionality to a module so that it can analyze the data passing through it. Elija el lenguaje que prefiera:Choose your preferred language: