Tutorial: Desarrollo de módulos de IoT Edge con contenedores de Linux mediante IoT Edge para Linux en Windows

Se aplica a:IoT Edge 1.4 checkmark IoT Edge 1.4

Importante

IoT Edge 1.4 es la versión admitida. Si está usando una versión anterior, consulte Actualización de IoT Edge.

En este tutorial se explica cómo desarrollar, depurar e implementar su propio código en un dispositivo IoT Edge mediante IoT Edge para Linux en Windows y Visual Studio 2022. Aprenderá el escenario de desarrollador más común para las soluciones de IoT Edge mediante la implementación de un módulo de C# en un dispositivo Linux. Implementará y depurará un módulo personalizado de Azure IoT Edge que se ejecuta en un contenedor de Linux en Windows (EFLOW). 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.

En este artículo se incluyen los pasos para dos herramientas de desarrollo de IoT Edge:

  • La interfaz de la línea de comandos (CLI) es la herramienta preferida para el desarrollo.
  • Herramientas de Azure IoT Edge para la extensión de Visual Studio . La extensión está en modo de mantenimiento.

Use el botón del selector de la herramienta al principio de este artículo para seleccionar la versión de la herramienta.

En este tutorial, aprenderá a:

  • Configurar una máquina de desarrollo.
  • Usar las herramientas de IoT Edge para Visual Studio Code para crear un proyecto.
  • Compilar el proyecto como un contenedor y almacenarlo en un registro de contenedor de Azure.
  • Implementar el código en un dispositivo IoT Edge.

Requisitos previos

En este artículo se da por hecho que usa una máquina que ejecuta Windows como máquina de desarrollo. En equipos Windows, puede desarrollar módulos de Windows o Linux. Este tutorial le guía por el desarrollo de contenedores de Linux mediante IoT Edge para Linux en Windows para compilar e implementar los módulos.

Después de que Visual Studio 2022 esté listo, también necesitará las siguientes herramientas y componentes:

  • Descargue e instale Azure IoT Edge Tools desde Visual Studio Marketplace. Puede usar la extensión Azure IoT Edge Tools para crear y compilar la solución de IoT Edge. La herramienta de desarrollo preferida es la herramienta de desarrollo de Azure IoT Edge (CLI) de la línea de comandos. La extensión incluye las plantillas de proyecto de Azure IoT Edge que se usan para crear el proyecto de Visual Studio. Actualmente, necesita la extensión instalada independientemente de la herramienta de desarrollo que use.

    Importante

    La extensión Azure IoT Edge Tools for VS 2022 está en modo de mantenimiento. La herramienta de desarrollo preferida es la herramienta de desarrollo de Azure IoT Edge (CLI) de la línea de comandos.

    Sugerencia

    Si usa Visual Studio 2019, descargue e instale Herramientas de Azure IoT Edge para VS 2019 desde Visual Studio Marketplace.

Recursos en la nube:

  • Una instancia de IoT Hub de nivel estándar o gratis en Azure.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Conceptos clave

En este tutorial se realiza un recorrido por el desarrollo de un módulo IoT Edge. Un módulo IoT Edge, o a veces simplemente módulo para abreviar, es un contenedor con código ejecutable. En un dispositivo IoT Edge se pueden implementar uno o varios módulos. 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. Para más información, consulte Información sobre los módulos Azure IoT Edge.

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. El contenedor que cree para contener el código del módulo debe coincidir con el sistema operativo del dispositivo de destino. 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. En ese caso, el sistema operativo del contenedor sería 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. En este tutorial, va a usar el host de Windows para el desarrollo y la máquina virtual IoT Edge para Linux en Windows (EFLOW) para compilar e implementar los módulos.

Este tutorial va dirigido a dispositivos de destino que ejecutan IoT Edge con contenedores de Linux. Puede usar el sistema operativo que prefiera, siempre que dicha máquina ejecute contenedores Linux. Se recomienda usar Visual Studio para desarrollar con contenedores de Linux, por lo que es lo que usa este tutorial. También se puede usar Visual Studio Code, aunque hay diferencias en lo relativo a la compatibilidad entre ambas herramientas. Para más información, consulte Desarrollo de módulos de Azure IoT Edge mediante Visual Studio Code.

Configuración de docker-cli y conexión remota del motor de Docker

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. La máquina virtual EFLOW ya contiene una instancia del motor de Docker, por lo que en este tutorial se muestra cómo conectarse de forma remota desde la máquina para desarrolladores de Windows a la instancia de Docker de máquina virtual de EFLOW. Con esto, se quita la dependencia en Docker Desktop para Windows.

El primer paso consiste en configurar docker-cli en la máquina de desarrollo Windows para poder conectarse al motor de Docker remoto.

  1. Descargue la versión precompilada docker.exe de docker-cli desde docker-cli Chocolatey. También puede descargar el proyecto oficial cli desde docker/cli GitHub y compilarlo siguiendo las instrucciones del repositorio.
  2. Extraiga el docker.exe en un directorio de la máquina de desarrollo. Por ejemplo, C:\Docker\bin
  3. Abrir Acerca de su PC ->Información del sistema ->Configuración avanzada del sistema
  4. Seleccione Avanzado ->Variables de entorno -> En Variables de usuario, active Path
  5. Edite la variable Path y agregue la ubicación del docker.exe
  6. Abra una sesión de PowerShell con privilegios elevados
  7. Compruebe que se puede acceder a la CLI de Docker mediante el comando
    docker --version
    

Si todo se configuró correctamente, el comando anterior debería generar la versión de Docker, algo parecido a la versión 20.10.12 de Docker, compilación e91ed57.

El segundo paso consiste en configurar el motor de Docker de la máquina virtual EFLOW para que acepte conexiones externas y agregue las reglas de firewall adecuadas.

Advertencia

Exponer el motor de Docker a conexiones externas puede aumentar los riesgos de seguridad. Esta configuración solo se debe usar con fines de desarrollo. Asegúrese de revertir la configuración a la configuración predeterminada una vez finalizado el desarrollo.

  1. Abra una sesión de PowerShell con privilegios elevados y ejecute los comandos siguientes

    # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the EFLOW VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the EFLOW VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    A continuación se incluye el resultado del ejemplo.

    PS C:\> # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the EFLOW VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the EFLOW VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    
  2. El último paso consiste en probar la conexión de Docker con el motor de Docker de la máquina virtual EFLOW. En primer lugar, necesita la dirección IP de la máquina virtual de EFLOW.

    Get-EflowVmAddr
    

    Sugerencia

    Si la máquina virtual EFLOW se implementó sin IP estática, la dirección IP puede cambiar en los reinicios del sistema operativo host de Windows o en los cambios de red. Asegúrese de que usa la dirección IP de la máquina virtual EFLOW correcta cada vez que desee establecer una conexión remota al motor de Docker.

    A continuación se incluye el resultado del ejemplo.

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  3. Usando la dirección IP obtenida, conéctese al motor de Docker de la máquina virtual de EFLOW y ejecute el contenedor de ejemplo Hello-World. Reemplace <EFLOW-VM-IP> por la dirección IP de la máquina virtual de EFLOW obtenida en el paso anterior.

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    Debería ver que el contenedor se está descargando y, después, se ejecutará y se mostrará lo siguiente.

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

Creación de un proyecto de Azure IoT Edge

La plantilla de proyecto de IoT Edge en Visual Studio crea una solución que se puede implementar en dispositivos IoT Edge. En primer lugar, cree una solución de Azure IoT Edge y, luego, genere el primer módulo en esa solución. Cada solución de IoT Edge puede contener más de un módulo.

Importante

La estructura del proyecto de IoT Edge creada por Visual Studio no es la misma que la de Visual Studio Code.

Actualmente, la CLI de la herramienta de desarrollo de Azure IoT Edge no admite la creación del tipo de proyecto de Visual Studio. Debe usar la extensión de IoT Edge de Visual Studio para crear el proyecto de Visual Studio.

  1. En Visual Studio, cree un nuevo proyecto.

  2. En la página Crear un proyecto, busque Azure IoT Edge. Seleccione el proyecto que coincida con la plataforma (módulo IoT Edge de Linux) y la arquitectura del dispositivo IoT Edge y seleccione Siguiente.

    Create New Project

  3. En la página Configurar el nuevo proyecto, escriba un nombre para el proyecto y especifique la ubicación y, luego, seleccione Crear.

  4. En la ventana Agregar módulo, seleccione el tipo de módulo que desea desarrollar. También puede seleccionar Existing module (Módulo existente) para agregar un módulo de IoT Edge ya existente a la implementación. Especifique el nombre y el repositorio de imágenes del módulo.

  5. En Url del repositorio, proporcione el nombre del repositorio de la imagen del módulo. Visual Studio completa automáticamente el nombre del módulo como localhost:5000/< nombre de módulo>. Reemplácelo por su propia información de registro. Utilice localhost si usa un registro de Docker local para realizar pruebas. Si va a usar Azure Container Registry, utilice el servidor de inicio de sesión de la configuración del registro. El servidor de inicio de sesión se parece a <nombre del registro>.azurecr.io. Reemplace solo la sección localhost:5000 de la cadena para que el resultado final se parezca a <nombre del registro>.azurecr.io/ <nombre del módulo> .

  6. Seleccione Agregar para agregar el módulo al proyecto.

    Screenshot of adding how to add an application and module to Visual Studio solution

    Nota:

    Si tiene un proyecto de IoT Edge existente, puede cambiar la dirección URL del repositorio al abrir el archivo module.json. La dirección URL del repositorio se encuentra en la propiedad repository del archivo JSON.

Ahora tiene un proyecto y un módulo de IoT Edge en la solución Visual Studio.

Estructura de proyecto

En su solución, hay dos carpetas del nivel de proyecto, entre las que se incluye una carpeta de proyecto principal y una única carpeta de módulo. Por ejemplo, puede tener una carpeta de proyecto principal denominada AzureIotEdgeApp1 y una carpeta de módulo denominada IotEdgeModule1. La carpeta principal del proyecto contiene el manifiesto de implementación.

La carpeta del módulo contiene un archivo para el código del módulo, denominado Program.cs o main.c según el lenguaje que haya elegido. Esta carpeta también contiene un archivo denominado module.json que describe los metadatos del módulo. Varios archivos de Docker proporcionan la información necesaria para crear el módulo como un contenedor de Windows o Linux.

Manifiesto de implementación del proyecto

El manifiesto de implementación que edita se denomina deployment.debug.template.json. Este archivo es una plantilla de un manifiesto de implementación de IoT Edge, que define todos los módulos que se ejecutan en un dispositivo y cómo se comunican entre sí. Para más información sobre los manifiestos de implementación, consulte Obtenga información sobre cómo implementar módulos y establecer rutas.

Si abre esta plantilla de implementación, podrá ver que los dos módulos del entorno de ejecución, edgeAgent y edgeHub están incluidos, junto con el módulo personalizado que creó en este proyecto de Visual Studio. Un cuarto módulo, denominado SimulatedTemperatureSensor también está incluido. Este módulo predeterminado es el que genera los datos simulados que puede usar para probar los módulos o eliminar si no es necesario. Para ver cómo funciona el sensor de temperatura simulado, vea el código fuente de SimulatedTemperatureSensor.csproj.

Establecimiento de la versión del entorno de ejecución de IoT Edge

Actualmente, la versión del entorno de ejecución estable más reciente es la 1.4. Debe actualizar la versión del entorno de ejecución de IoT Edge a la versión estable más reciente o la que desea como destino de los dispositivos.

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nombre del proyecto principal y seleccione Establecer la versión del entorno de ejecución de Azure IoT Edge.

    Screenshot of how to find and select the menu item named 'Set IoT Edge Runtime version'.

  2. Use el menú desplegable para elegir la versión del entorno de ejecución en la que se ejecutan los dispositivos IoT Edge y, a continuación, seleccione Aceptar para guardar los cambios. Si no se realizó ningún cambio, seleccione Cancelar para salir.

    Actualmente, la extensión no incluye una selección para las versiones más recientes del entorno de ejecución. Si desea establecer la versión en tiempo de ejecución superior a la 1.2, abra el archivo de manifiesto de implementación deployment.debug.template.json. Cambie la versión en tiempo de ejecución de las imágenes edgeAgent y edgeHub del módulo en tiempo de ejecución del sistema. Por ejemplo, si quiere usar la versión 1.4 del entorno de ejecución de IoT Edge, cambie las líneas siguientes en el archivo de manifiesto de implementación:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. Si ha cambiado la versión, vuelva a generar el manifiesto de implementación; para ello, haga clic con el botón derecho en el nombre del proyecto y seleccione Generar implementación para IoT Edge. Esto genera un manifiesto de implementación basado en la plantilla de implementación y aparece en la carpeta config del proyecto de Visual Studio.

  1. Abra el archivo de manifiesto de implementación deployment.debug.template.json . El manifiesto de implementación es un documento JSON que describe los módulos que se van a configurar en los dispositivos IoT Edge de destino.

  2. Cambie la versión en tiempo de ejecución de las imágenes edgeAgent y edgeHub del módulo en tiempo de ejecución del sistema. Por ejemplo, si quiere usar la versión 1.4 del entorno de ejecución de IoT Edge, cambie las líneas siguientes en el archivo de manifiesto de implementación:

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
        //...
    

Configuración de la instancia remota del motor de Docker de Visual Studio 2022

Use la extensión de herramientas de Azure IoT Edge y configúrela para usar el motor remoto de Docker que se ejecuta dentro de la máquina virtual EFLOW.

  1. Seleccione Herramientas ->Herramientas de Azure IoT Edge ->Confgiruación de las herramientas de IoT Edge...

  2. Reemplace el valor de localhost DOCKER_HOST por la dirección IP de la máquina virtual EFLOW. Si no recuerda la dirección IP, use el cmdlet Get-EflowVmAddr de PowerShell EFLOW para obtenerla. Por ejemplo, si la dirección IP de la máquina virtual EFLOW es 172.20.1.100, el nuevo valor debe ser tcp://172.20.1.100:2375.

    Screenshot of IoT Edge Tools settings

  3. Seleccione Aceptar.

Desarrollo de su módulo

Al agregar un nuevo módulo, este viene con un código predeterminado que está listo para crearse e implementarse en un dispositivo para que pueda empezar a realizar pruebas sin tener que modificar ningún código. El código del módulo se encuentra en la carpeta del módulo en un archivo denominado Program.cs (para C#) o main.c (para C).

La solución predeterminada se ha creado para que los datos simulados del módulo SimulatedTemperatureSensor se enruten hacia el módulo, el cual recibe la entrada y, a continuación, la envía a IoT Hub.

Cuando tenga todo listo para personalizar la plantilla del módulo con su propio código, use los SDK de Azure IoT Hub para compilar más módulos que aborden las necesidades principales de las soluciones de IoT, como la seguridad, la administración de dispositivos y la fiabilidad.

Compilación e inserción de un solo módulo

Por lo general, querrá probar y depurar los módulos antes de que se ejecuten en una solución entera con varios de ellos. Dado que la solución se compilará o depurará mediante el motor de Docker que se ejecuta dentro de la máquina virtual EFLOW, el primer paso consiste en compilar y publicar el módulo para habilitar la depuración remota.

  1. En Explorador de soluciones, seleccione y resalte la carpeta del proyecto del módulo (por ejemplo, myIotEdgeModule). Defina el módulo personalizado como el proyecto de inicio. Seleccione Proyecto>Establecer como proyecto de inicio del menú.

  2. Para depurar el módulo linux de C#, es necesario actualizar el archivo Dockerfile.amd64.debug para habilitar el servicio SSH. Actualice el archivo Dockerfile.amd64.debug para usar la siguiente plantilla: Dockerfile para el módulo AMD64 de C# de Azure IoT Edge con compatibilidad con depuración remota.

    Nota:

    Al elegir Depurar, Visual Studio usará Dockerfile.(amd64|windows-amd64).debug para compilar las imágenes de Docker. Esto incluye el depurador de la línea de comandos de .NET Core VSDBG en la imagen de contenedor al realizar la compilación. Para los módulos de IoT Edge listos para producción, se recomienda usar la configuración de Versión que usa Dockerfile.(amd64|windows-amd64) sin VSDBG.

    Advertencia

    Asegúrese de que en la última línea de la plantilla ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] el nombre del archivo DLL coincide con el nombre del proyecto del módulo IoT Edge.

    Screenshot of setting the Dockerfile template

  3. Para establecer una conexión SSH con el módulo Linux, es necesario crear una clave RSA. Abra una sesión de PowerShell con privilegios elevados y ejecute los comandos siguientes para crear una nueva clave RSA. Asegúrese de guardar la clave RSA en la misma carpeta del módulo IoT Edge y de que el nombre de la clave id_rsa.

    ssh-keygen -t RSA -b 4096 -m PEM
    

    Screenshot of how to create an SSH key

  4. Si usa un registro privado como Azure Container Registry (ACR), use el siguiente comando de Docker para iniciar sesión en él. Puede obtener el nombre de usuario y la contraseña en la página Claves de acceso del registro en Azure Portal. Si usa un registro local, puede Run a local registry (Ejecutar un registro local).

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. En Explorador de soluciones, haga clic con el botón derecho en la carpeta del proyecto y seleccione Compilación e inserción de módulos IoT Edge para compilar e insertar las imágenes de Docker para cada módulo.

  2. Si usa un registro privado como Azure Container Registry, deberá agregar la información de inicio de sesión del registro a la configuración en tiempo de ejecución que se encuentra en el archivo deployment.template.json. Reemplace los marcadores de posición por su nombre de usuario administrador, contraseña y nombre de registro reales de ACR.

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    Nota:

    En este artículo se usan credenciales de inicio de sesión de administrador de Azure Container Registry, que son prácticas para escenarios de desarrollo y pruebas. Cuando esté listo para escenarios de producción, se recomienda una opción de autenticación con privilegios mínimos, como las entidades de servicio. Para más información, consulte Administración del acceso al registro de contenedor.

  3. Es necesario exponer el puerto 22 para acceder al servicio SSH del módulo. En este tutorial se usa 10022 como puerto de host, pero puede especificar otro puerto, que se usará como puerto SSH para conectarse al módulo C# de Linux. Debe agregar la información del puerto SSH a la opción "createOptions" de este módulo de Linux que se encuentra en el archivo deployment.debug.template.json.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. En Explorador de soluciones, haga clic con el botón derecho en la carpeta del proyecto y seleccione Generar implementación para IoT Edge para compilar el nuevo archivo json de implementación de IoT Edge.

  5. Abra Cloud Explorer al hacer clic en Ver>Cloud Explorer. Asegúrese de haber iniciado sesión en Visual Studio 2019.

  6. En Cloud Explorer, expanda su suscripción, busque Azure IoT Hub y el dispositivo de Azure IoT Edge que desea implementar.

  7. Haga clic con el botón derecho en el dispositivo IoT Edge y elija Crear implementación. Vaya al manifiesto de implementación de depuración configurado para la plataforma, el cual se encuentra en la carpeta config de la solución de Visual Studio, por ejemplo, deployment.amd64.json.

Imagen de Docker del módulo de compilación

Después de desarrollar el módulo, puede compilar la imagen del módulo para almacenarla en un registro de contenedor para implementar en el dispositivo IoT Edge.

Use el archivo Dockerfile del módulo para compilar la imagen de Docker del módulo.

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

Por ejemplo, supongamos que el shell de comandos se encuentra en el directorio del proyecto y el nombre del módulo es IotEdgeModule1. Para compilar la imagen del registro local o un registro de contenedor de Azure, use los siguientes comandos:

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

Imagen de Docker del módulo de inserción

Inserte la imagen del módulo en el registro local o en un registro de contenedor.

docker push <ImageName>

Por ejemplo:

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

Implemente el módulo en el dispositivo de IoT Edge.

En Visual Studio, abra el archivo de manifiesto de implementacióndeployment.debug.template.json del proyecto principal. El manifiesto de implementación es un documento JSON que describe los módulos que se van a configurar en los dispositivos IoT Edge de destino. Antes de la implementación, debe actualizar las credenciales de Azure Container Registry, las imágenes del módulo y los valores de createOptions adecuados. Para más información sobre los valores de createOption, consulte Configuración de las opciones de creación de contenedores para módulos de IoT Edge.

  1. Si usa una instancia de Azure Container Registry para almacenar la imagen del módulo, debe agregar las credenciales a deployment.debug.template.json en la configuración de edgeAgent. Por ejemplo,

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. Reemplace el valor de la propiedad image por el nombre de la imagen del módulo que insertó en el registro. Por ejemplo, si insertó una imagen etiquetada myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 para el módulo personalizado IotEdgeModule1, reemplace el valor de propiedad de la imagen por el valor de la etiqueta.

  3. Agregue o reemplace el valor createOptions por contenido con cadena para cada sistema y módulo personalizado en la plantilla de implementación.

    Por ejemplo, la imagen de IotEdgeModule1 y la configuración createOptions sería similar a la siguiente:

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

Use el comando IoT Edge Azure CLI set-modules para implementar los módulos en Azure IoT Hub. Por ejemplo, para implementar los módulos definidos en el archivo deployment.debug.amd64.json en el centro de IoT my-iot-hub para el dispositivo de IoT Edge my-device, use el siguiente comando:

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

Sugerencia

Puede encontrar la cadena de conexión de IoT Hub en Azure Portal en Azure IoT Hub >Configuración de seguridad>Directivas de acceso compartido.

  1. En Cloud Explorer, haga clic con el botón derecho en el dispositivo perimetral y actualice para ver el nuevo módulo que se ejecuta junto con los módulos $edgeAgent y $edgeHub.

Depuración de la solución

  1. Con una sesión de PowerShell con privilegios elevados, ejecute los comandos siguientes

    1. Obtenga el valor de moduleId en función del nombre usado para el módulo C# de Linux. Asegúrese de reemplazar el marcador de posición <iot-edge-module-name> por el nombre del módulo.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. Compruebe que el valor de $moduleId es correcto: si la variable está vacía, asegúrese de que usa el nombre de módulo correcto

    3. Inicio del servicio SSH dentro del contenedor de Linux

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. Abra el puerto SSH del módulo en la máquina virtual EFLOW (en este tutorial se usa el puerto 10022)

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    Advertencia

    Por motivos de seguridad, cada vez que se reinicie la máquina virtual EFLOW, la regla de tabla IP eliminará y volverá a la configuración original. Además, el servicio SSH del módulo tendrá que volver a iniciarse manualmente.

  2. Después de iniciar correctamente el servicio SSH, seleccione Depurar ->Asociar al proceso, establezca Tipo de conexión en SSH y Destino de conexión en la dirección IP de la máquina virtual EFLOW. Si no conoce la dirección IP de la máquina virtual EFLOW, puede usar el cmdlet Get-EflowVmAddr de PowerShell. En primer lugar, escriba la dirección IP y presione Entrar. En la ventana emergente, introduzca las siguientes configuraciones:

    Campo Value
    Nombre de host Uso de la dirección IP de máquina virtual EFLOW
    Puerto 10022 (o el que usó en la configuración de implementación)
    Nombre de usuario root
    Tipo de autenticación Clave privada
    Archivo de clave privada Ruta de acceso completa a la id_rsa que creó en un paso anterior
    Frase de contraseña Frase de contraseña usada para la clave creada en un paso anterior

    Screenshot of how to connect to a remote system

  3. Después de conectarse correctamente al módulo mediante SSH, puede elegir el proceso y seleccionar Adjuntar. Para el módulo de C#, debe elegir el proceso dotnet y Adjuntar a en Administrado (CoreCLR). La primera vez puede tardar entre 10 y 20 segundos.

    Screenshot of how to attach an edge module process.

  4. Establezca un punto de interrupción para inspeccionar el módulo.

    • Si desarrolla en C#, establezca un punto de interrupción en la función PipeMessage() de ModuleBackgroundService.cs.
    • Si usa C, establezca un punto de interrupción en la función InputQueue1Callback() de InputQueue1Callback().
  5. La salida de SimulatedTemperatureSensor se debe redirigir a input1 del módulo personalizado de C# de Linux. Debe desencadenarse el punto de interrupción. Puede inspeccionar las variables en la ventana Variables locales de Visual Studio.

    Screenshot of how to debug a single module

  6. Presione Ctrl + F5 o seleccione el botón Detener para detener la depuración.

Limpieza de recursos

Si prevé seguir con el siguiente artículo recomendado, puede mantener los recursos y las configuraciones que ya ha creado y volverlos a utilizar. También puede seguir usando el mismo dispositivo de IoT Edge como dispositivo de prueba.

En caso contrario, para evitar gastos, puede eliminar las configuraciones locales y los recursos de Azure que creó en este artículo.

Eliminación de recursos de Azure

La eliminación de los recursos de Azure y de los grupos de recursos es un proceso irreversible. Asegúrese de no eliminar por accidente el grupo de recursos o los recursos equivocados. 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.

Para eliminar los recursos:

  1. Inicie sesión en Azure Portal y después seleccione Grupos de recursos.

  2. Seleccione el nombre del grupo de recursos que contiene los recursos de prueba de IoT Edge.

  3. Revise la lista de los recursos contenidos en el grupo de recursos. Si desea eliminar todos ellos, puede seleccionar Eliminar grupo de recursos. Si desea eliminar solo algunos de ellos, puede hacer clic en cada recurso para eliminarlos individualmente.

Pasos siguientes

En este tutorial, ha configurado Visual Studio en la máquina de desarrollo y ha implementado y depurado el primer módulo IoT Edge desde él. Ahora que conoce los conceptos básicos, intente agregar funcionalidad a un módulo para que pueda analizar los datos que pasan por él.